0

我正在尝试使用远程 API连接到我的本地 App Engine 项目。

这是我的来源:

    public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RemoteApiOptions options = new RemoteApiOptions()
        .server("192.168.1.5", 8888)
        .credentials("username", "password");
        RemoteApiInstaller installer = new RemoteApiInstaller();
        try {
            installer.install(options);

            DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

        } catch(Exception e){
            System.err.println(e.toString());
        }finally {
            installer.uninstall();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

我正在从App Engine Java SDK导入 appengine-api.jar、appengine-remote-api.jar 和 appengine-tools-api.jar 。

我在 Eclipse 和 IntelliJ 中都收到以下编译错误:

[2012-08-23 15:16:16 - Accident Map] Dx 
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: already added: Lcom/google/appengine/repackaged/com/google/common/base/Absent;
    at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123)
    at com.android.dx.dex.file.DexFile.add(DexFile.java:163)
    at com.android.dx.command.dexer.Main.processClass(Main.java:486)
    at com.android.dx.command.dexer.Main.processFileBytes(Main.java:455)
    at com.android.dx.command.dexer.Main.access$400(Main.java:67)
    at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:394)
    at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245)
    at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:131)
    at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109)
    at com.android.dx.command.dexer.Main.processOne(Main.java:418)
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:329)
    at com.android.dx.command.dexer.Main.run(Main.java:206)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.android.ide.eclipse.adt.internal.build.DexWrapper.run(DexWrapper.java:180)
    at com.android.ide.eclipse.adt.internal.build.BuildHelper.executeDx(BuildHelper.java:703)
    at com.android.ide.eclipse.adt.internal.build.builders.PostCompilerBuilder.build(PostCompilerBuilder.java:577)
    at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:728)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:199)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:321)
    at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:396)
    at org.eclipse.core.internal.resources.Project$1.run(Project.java:618)
    at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2344)
    at org.eclipse.core.internal.resources.Project.internalBuild(Project.java:597)
    at org.eclipse.core.internal.resources.Project.build(Project.java:124)
    at com.android.ide.eclipse.adt.internal.project.ProjectHelper.doFullIncrementalDebugBuild(ProjectHelper.java:1000)
    at com.android.ide.eclipse.adt.internal.launch.LaunchConfigDelegate.launch(LaunchConfigDelegate.java:147)
    at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:855)
    at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:704)
    at org.eclipse.debug.internal.ui.DebugUIPlugin.buildAndLaunch(DebugUIPlugin.java:1047)
    at org.eclipse.debug.internal.ui.DebugUIPlugin$8.run(DebugUIPlugin.java:1251)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)

相同的代码可作为非 Android Java 项目进行,只需进行少量更改。

4

2 回答 2

0

嗯,我不认为你应该将appengine-tools-api.jar添加到你的项目中,因为文档没有提到它。您是否尝试删除它?

于 2012-08-23T20:40:07.737 回答
0

看起来你的 AE 设置是正确的。我没想到的是 Remote Api 可以在 Android 手机上运行。要通过远程 API 进行连接,请将其作为独立的 java 进程运行。

Android java 只是 Java 的一个子集,因此远程 API 可能会使用 Android 上不可用的东西(尽管这里似乎不是这种情况)所以你真的不是更好地设置你的 Android 项目来连接到 AE它的意图。我的意思是你要做什么,发送你的密码来连接你的 apk 中的 AE 实例?不会有任何访问控制这样做,这肯定不是你想要的,或者我误解了你的目的。

编辑:

为什么不能在安卓上运行?也许可以。我看到的问题是:

1) Android 白名单可能不包含 Remote API 所需的所有类,即使现在包含,也不能保证将来的版本可以正常工作。

2)您将密码硬编码到您的android应用程序中。这为每个用户提供了执行所有操作的凭据...插入垃圾邮件,如果启用了计费,您将必须支付费用,删除您所有珍贵的数据等等等。好的,所以您的用户必须是恶意的并弄清楚,但是除非您真的可以信任您的用户并且不通过 Play 商店分发您的 apk,否则我认为 apk 被盗版是一个不争的事实,并且真的质疑您为什么要让盗版者访问您的数据存储凭据。我并不是说你不能那样做,只是指出,事实上,也许你不能。

如果您使用 rpc 调用(如上链接),您可以限制客户端能够对数据存储执行的操作。

于 2012-08-23T21:49:09.043 回答