2012-08-23 26 views
0

我試圖使用remote API連接到本地App Engine項目。無法在Android項目中使用App Engine遠程API

這裏是我的源:

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; 
    } 
} 

我的AppEngine進口-api.jar中,AppEngine上的遠程-api.jar文件,和AppEngine上的工具 - api.jar中從App Engine Java SDK

我得到了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項目。

回答

0

它看起來像你的AE設置是現貨。我不希望Remote API在Android手機上運行。要通過Remote API進行連接,請將其作爲獨立的Java進程運行。

Android java只是Java的一個子集,所以遠程API可能會使用Android上不可用的東西(儘管在這裏看起來並不是這樣)。所以,你真的不是更好的setting up your Android project to connect to AE它的方式。我的意思是你打算怎麼做,在你的apk上發送你的密碼以連接到你的AE實例?不會有任何訪問控制這樣做,當然這不是你想要的,或者我誤解你的目的。

編輯:

爲什麼不能在Android上運行?也許可以。我看到的問題是:

1)Android Whitelist可能不包含Remote API所需的所有類,即使現在這樣做,也無法保證未來的版本可以正常工作。

2)你正在將你的密碼硬編碼到你的android應用程序中。這給每個用戶的憑據做一切......插入垃圾,你將不得不支付,如果帳單啓用,刪除所有珍惜的數據等等等等。好的,所以你的用戶將不得不惡意和弄清楚,但除非你真的相信你的用戶,並且不通過遊戲商店發佈你的apk,否則我認爲這是生活的一個事實,apks被盜版,並且真的質疑爲什麼你會讓盜版者訪問你的數據存儲憑證。我並不是說你不能這樣做,而只是指出嘿,其實也許你沒有。

如果您使用rpc調用(如上所鏈接),則可以限制客戶端可以對數據存儲執行的操作。

+0

爲什麼不能在Android上運行? – Xample

+0

@Chris也許它可以,但你爲什麼要這樣做。請參閱我的編輯註釋 – user1258245

+0

非常全面,謝謝 – Xample

0

嗯,我不認爲你應該添加appengine-tools-api.jar到你的項目中,因爲文檔沒有提到它。 你嘗試刪除它嗎?

+0

它是DatastoreService所必需的。即使我刪除它,我仍然會得到同樣的錯誤。似乎只是在Android項目中導入這些庫會導致問題。 – Xample

+0

那麼,您之前給出的網頁只提到了Java客戶端應用程序(不是Android應用程序)。也許這些庫不合適。但是,最新的SDK包含一個通用** AppEngine連接的Android項目**。也許你可以試試這個:https://developers.google.com/eclipse/docs/appengine_connected_android –

相關問題