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

AEの設定が適切に行われているようです。私が期待していなかったのは、RemoteApiがAndroidハンドセットで実行されることです。リモートAPIを介して接続するには、スタンドアロンのJavaプロセスとして実行します。

Android javaはJavaのサブセットにすぎないため、リモートAPIはAndroidでは利用できないものを使用する可能性があります(ただし、ここではそうではないようです) 。それが意図された方法。私はあなたが何をするつもりですか、あなたのapkであなたのAEインスタンスに接続するためにあなたのパスワードを出荷しますか?そのようにそれを行うアクセス制御はありません、そして確かにそれはあなたが望むものではありません、あるいは私はあなたの目的を誤解していますか?

編集:

なぜAndroidで実行できないのですか?多分それはできます。私が見る問題は次のとおりです。

1)Androidホワイトリストには、リモートAPIに必要なすべてのクラスが含まれているとは限りません。現在含まれている場合でも、将来のバージョンが機能する保証はありません。

2)パスワードをAndroidアプリケーションにハードコーディングしています。これにより、すべてのユーザーにすべてを実行するための資格情報が与えられます...請求が有効になっている場合に支払う必要のあるジャンクを挿入したり、大切なデータをすべて削除したりします。しかし、ユーザーを本当に信頼でき、Playストアを介してapkを配布しない限り、apkが海賊版になり、なぜ海賊にデータストアのクレデンシャルへのアクセスを許可するのか疑問に思うのは事実だと思います。私はあなたがそのようにそれをすることができないと言っているのではありません、しかしただちょっと実際にあなたがそうしないかもしれないと指摘するだけです。

(上記でリンクされているように)rpc呼び出しを使用する場合、クライアントがデータストアで実行できることを制限できます。

于 2012-08-23T21:49:09.043 に答える
0

ドキュメントには記載されていないため、 appengine-tools-api.jarをプロジェクトに追加する必要はないと思います。削除してみましたか?

于 2012-08-23T20:40:07.737 に答える