2010-03-25 20 views
0

我正在創建一個應用程序,用於檢查程序包的安裝,然後使用其ID來啓動市場。以Android市場中不存在的應用程序的id的身份啓動市場

當我嘗試使用url:market:// details?id = com.mybrowser.android通過拋出一個intent android.intent.action.VIEW來使用應用程序的id發佈市場時,請說明com.mybrowser.android,市場應用程序確實啓動但發佈後崩潰。

注意:應用程序com.mybrowser.android不存在於市場。

MyApplication是我的應用程序。

$ adb logcat 

I/ActivityManager(1030): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=myapp.testapp/.MyApplication } 
I/ActivityManager(1030): Start proc myapp.testapp for activity myapp.testapp/.MyApplication: pid=3858 uid=10047 gids={1015, 3003} 
I/MyApplication(3858): [ Activity CREATED ] 
I/MyApplication(3858): [ Activity STARTED ] 
I/MyApplication(3858): onResume 
D/dalvikvm(1109): GC freed 6571 objects/423480 bytes in 73ms 
I/MyApplication(3858): Pressed OK button 
I/MyApplication(3858): Broadcasting Intent: android.intent.action.VIEW, data: market://details?id=com.mybrowser.android 
I/ActivityManager(1030): Starting activity: Intent { act=android.intent.action.VIEW dat=market://details?id=com.mybrowser.android flg=0x10000000 cmp=com.android.ven 
ding/.AssetInfoActivity } 
I/MyApplication(3858): onPause 
I/ActivityManager(1030): Start proc com.android.vending for activity com.android.vending/.AssetInfoActivity: pid=3865 uid=10023 gids={3003} 
I/ActivityThread(3865): Publishing provider com.android.vending.SuggestionsProvider: com.android.vending.SuggestionsProvider 
D/dalvikvm(1030): GREF has increased to 701 
I/vending (3865): com.android.vending.api.RadioHttpClient$1.handleMessage(): Handle DATA_STATE_CHANGED event: NetworkInfo: type: WIFI[], state: CONNECTED/CO 
NNECTED, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true 
I/ActivityManager(1030): Displayed activity com.android.vending/.AssetInfoActivity: 609 ms (total 7678 ms) 
D/dalvikvm(1030): GC freed 10458 objects/676440 bytes in 128ms 
I/MyApplication(3858): [ Activity STOPPED ] 
D/dalvikvm(3865): GC freed 3538 objects/254008 bytes in 84ms 
W/dalvikvm(3865): threadid=19: thread exiting with uncaught exception (group=0x4001b180) 
E/AndroidRuntime(3865): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception 
E/AndroidRuntime(3865): java.lang.RuntimeException: An error occured while executing doInBackground() 
E/AndroidRuntime(3865):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
E/AndroidRuntime(3865):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
E/AndroidRuntime(3865):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
E/AndroidRuntime(3865):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
E/AndroidRuntime(3865):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
E/AndroidRuntime(3865):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
E/AndroidRuntime(3865):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
E/AndroidRuntime(3865):  at java.lang.Thread.run(Thread.java:1096) 
E/AndroidRuntime(3865): Caused by: java.lang.NullPointerException 
E/AndroidRuntime(3865):  at com.android.vending.AssetItemAdapter$ReloadLocalAssetInformationTask.doInBackground(AssetItemAdapter.java:845) 
E/AndroidRuntime(3865):  at com.android.vending.AssetItemAdapter$ReloadLocalAssetInformationTask.doInBackground(AssetItemAdapter.java:831) 
E/AndroidRuntime(3865):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
E/AndroidRuntime(3865):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
E/AndroidRuntime(3865):  ... 4 more 
I/Process (1030): Sending signal. PID: 3865 SIG: 3 
I/dalvikvm(3865): threadid=7: reacting to signal 3 
I/dalvikvm(3865): Wrote stack trace to '/data/anr/traces.txt' 
I/DumpStateReceiver(1030): Added state dump to 1 crashes 
D/AndroidRuntime(3865): Shutting down VM 
W/dalvikvm(3865): threadid=3: thread exiting with uncaught exception (group=0x4001b180) 
E/AndroidRuntime(3865): Uncaught handler: thread main exiting due to uncaught exception 
E/AndroidRuntime(3865): java.lang.NullPointerException 
E/AndroidRuntime(3865):  at com.android.vending.controller.AssetInfoActivityController.getIdDeferToLocal(AssetInfoActivityController.java:637) 
E/AndroidRuntime(3865):  at com.android.vending.AssetInfoActivity.displayAssetInfo(AssetInfoActivity.java:556) 
E/AndroidRuntime(3865):  at com.android.vending.AssetInfoActivity.access$800(AssetInfoActivity.java:74) 
E/AndroidRuntime(3865):  at com.android.vending.AssetInfoActivity$LoadAssetInfoAction$1.run(AssetInfoActivity.java:917) 
E/AndroidRuntime(3865):  at android.os.Handler.handleCallback(Handler.java:587) 
E/AndroidRuntime(3865):  at android.os.Handler.dispatchMessage(Handler.java:92) 
E/AndroidRuntime(3865):  at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime(3865):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
E/AndroidRuntime(3865):  at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(3865):  at java.lang.reflect.Method.invoke(Method.java:521) 
E/AndroidRuntime(3865):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
E/AndroidRuntime(3865):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
E/AndroidRuntime(3865):  at dalvik.system.NativeStart.main(Native Method) 
I/Process (1030): Sending signal. PID: 3865 SIG: 3 
W/ActivityManager(1030): Process com.android.vending has crashed too many times: killing! 
D/ActivityManager(1030): Force finishing activity com.android.vending/.AssetInfoActivity 
I/dalvikvm(3865): threadid=7: reacting to signal 3 
D/ActivityManager(1030): Force removing process ProcessRecord{44e48548 3865:com.android.vending/10023} (com.android.vending/10023) 

然而,當我嘗試推出市場上的存在在市場上說,一個包com.opera.mini.android,一切正常。登錄此案例:

D/dalvikvm( 966): GC freed 2781 objects/195056 bytes in 99ms 
I/MyApplication(1165): Pressed OK button 
I/MyApplication(1165): Broadcasting Intent: android.intent.action.VIEW, data: market://details?id=com.opera.mini.android 
I/ActivityManager( 78): Starting activity: Intent { act=android.intent.action.VIEW dat=market://details?id=com.opera.mini.android flg=0x10000000 cmp=com.android.vending/.AssetInfoActivity } 
I/AndroidRuntime(1165): AndroidRuntime onExit calling exit(0) 
I/WindowManager( 78): WIN DEATH: Window{44c72308 myapp.testapp/myapp.testapp.MyApplication paused=true} 
I/ActivityManager( 78): Process myapp.testapp (pid 1165) has died. 
I/WindowManager( 78): WIN DEATH: Window{44c72958 myapp.testapp/myapp.testapp.MyApplication paused=false} 
D/dalvikvm( 78): GC freed 31778 objects/1796368 bytes in 142ms 
I/ActivityManager( 78): Displayed activity com.android.vending/.AssetInfoActivity: 214 ms (total 22866 ms) 
W/KeyCharacterMap( 978): No keyboard for id 65540 
W/KeyCharacterMap( 978): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 
V/RenderScript_jni( 966): surfaceCreated 
V/RenderScript_jni( 966): surfaceChanged 
V/RenderScript( 966): setSurface 480 762 0x573430 
D/ViewFlipper( 966): updateRunning() mVisible=true, mStarted=true, mUserPresent=true, mRunning=true 
D/dalvikvm( 978): GC freed 10065 objects/624440 bytes in 95ms 

任何想法?

+1

爲什麼你想推出市場'Intent'上的應用程序,是不是在市場? – CommonsWare 2010-03-25 23:16:33

回答

0

而不是用確切的ID啓動,你可以嘗試通過搜索包。

意向意圖=新意圖(Intent.ACTION_VIEW,
Uri.parse( 「市場://搜Q = PNAME:com.package.package2.package3」));
startActivity(intent);從應用程序URL

+0

正在爲另一個應用程序啓動市場的應用程序工作。 理想情況下,應用程序將在此應用程序發佈之前上市。 在測試我的應用程序時,我發現這個問題。 市場不應該在任何情況下崩潰。可能它可能會向用戶顯示錯誤。 或者我做錯了什麼? 謝謝! – Gaurav 2010-03-26 19:53:03

+0

正如您所看到的,當您發送錯誤信息時,市場應用程序可能會崩潰。有很多方法可以通過發送帶有錯誤信息的意圖來使其他谷歌應用程序崩潰。我不認爲你做錯了什麼,但它更好地使用搜索,以防在調用時它不存在。 – 2010-03-26 20:18:37

3

嘗試使用「org.rabold.android.puzzleblox://細節ID = PNAME?市場」的市場應用打開詳細信息頁面,當我有類似的問題。

我可以使用AnyCut這樣創建一個快捷方式:

行動:android.intent.action.VIEW 數據:市場://細節ID = PNAME:org.rabold.android.puzzleblox 類型:

然後它工作正常。但是,如果我使用按鈕創建一個帶有與上述相同Uri的Market的Android應用程序,那麼我會在Market應用程序中看到如下錯誤:「注意:發生服務器錯誤。重試或取消以及返回到前一個屏幕。「

我的按鈕的監聽器的代碼如下所示:

okButton = (Button) findViewById(R.id.okButton); 
okButton.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     Intent intent = new Intent(Intent.ACTION_VIEW, 
      Uri.parse("market://details?id=pname:org.rabold.android.puzzleblox")); 
      //Uri.parse("market://search?q=pname:org.rabold.android.puzzleblox")); 
      startActivity(intent); 
    } 
}); 

注意在上面的代碼,如果我使用「搜索」而不是「細節」,那麼它的工作原理。我想使用「詳細信息」而不是「搜索」,因爲我知道我的應用在完成後將在市場上可用。謝謝。

2

thnx丹尼爾,我可以確認您的解決方案在設備上工作正常。

@TPham:請嘗試使用正確的URL(僅限附加標識), 傳遞正確的標識也正常工作,請參閱下面的示例;

static final String APP_MARKET_URL = "market://details?id=com.wareninja.android.fotolicke"; 
Intent intent = new Intent(Intent.ACTION_VIEW, 
Uri.parse(APP_MARKET_URL)); 
startActivity(intent); 
3

更新!:
不要使用 「PNAME:」

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setData(Uri.parse("market://details?id=com.example.android")); 
startActivity(intent); 

完美的作品。

每:
http://developer.android.com/distribute/googleplay/promote/linking.html#android-app

☮♥☺

+0

在同一個應用程序中打開新的視圖,如何打開市場作爲一個新的應用程序? – 2014-07-28 19:58:44