No Activity found to handle Intent

2019-01-09 08:46发布

i am attempting to launch an intent to open a link to the android market.

android manifest portion looks like this:

<activity android:name="com.surreall.sixdice.Start" android:label="Six Dice" android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation">
    <intent-filter>
                <action android:name="android.intent.action.MAIN" />                               
                <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
                <action android:name="android.intent.action.VIEW" />  
                <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

launching the intent looks like:

public void onClick(View v) {
        String PublisherID = "pub:surreallgames";
        Uri marketUri = Uri.parse("market://search?q="+PublisherID);
        Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri);                    
        startActivity(marketIntent);


                }

logcat output:

06-17 17:38:47.393: E/AndroidRuntime(476): FATAL EXCEPTION: main
06-17 17:38:47.393: E/AndroidRuntime(476): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=market://search?q=pub:surreallgames }
06-17 17:38:47.393: E/AndroidRuntime(476):  at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1409)
06-17 17:38:47.393: E/AndroidRuntime(476):  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1379)
06-17 17:38:47.393: E/AndroidRuntime(476):  at android.app.Activity.startActivityForResult(Activity.java:2827)
06-17 17:38:47.393: E/AndroidRuntime(476):  at android.app.Activity.startActivity(Activity.java:2933)
06-17 17:38:47.393: E/AndroidRuntime(476):  at com.surreall.sixdice.Start$9.onClick(Start.java:265)
06-17 17:38:47.393: E/AndroidRuntime(476):  at android.view.View.performClick(View.java:2485)
06-17 17:38:47.393: E/AndroidRuntime(476):  at android.view.View$PerformClick.run(View.java:9080)
06-17 17:38:47.393: E/AndroidRuntime(476):  at android.os.Handler.handleCallback(Handler.java:587)
06-17 17:38:47.393: E/AndroidRuntime(476):  at android.os.Handler.dispatchMessage(Handler.java:92)
06-17 17:38:47.393: E/AndroidRuntime(476):  at android.os.Looper.loop(Looper.java:123)
06-17 17:38:47.393: E/AndroidRuntime(476):  at android.app.ActivityThread.main(ActivityThread.java:3683)
06-17 17:38:47.393: E/AndroidRuntime(476):  at java.lang.reflect.Method.invokeNative(Native Method)
06-17 17:38:47.393: E/AndroidRuntime(476):  at java.lang.reflect.Method.invoke(Method.java:507)
06-17 17:38:47.393: E/AndroidRuntime(476):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-17 17:38:47.393: E/AndroidRuntime(476):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-17 17:38:47.393: E/AndroidRuntime(476):  at dalvik.system.NativeStart.main(Native Method)

5条回答
劳资没心,怎么记你
2楼-- · 2019-01-09 09:06

Better solution would be to try to open uri in Google Play app, but if there is no such app (no Activity to handle this intent) - you can just try to open uri in browser like in this example:

public static void rateApp(Context context) {
    try {
        context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + context.getPackageName())));
    } catch (android.content.ActivityNotFoundException anfe) {
        viewInBrowser(context, "https://play.google.com/store/apps/details?id=" + context.getPackageName());
    }
}

public static void viewInBrowser(Context context, String url) {
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    if (null != intent.resolveActivity(context.getPackageManager())) {
        context.startActivity(intent);
    }
}
查看更多
ら.Afraid
3楼-- · 2019-01-09 09:06
private void OpenStoreIntent(){
        String url="";
        Intent storeintent=null;
        try {
            url = "market://details?id=com.myapp.packagename";
            storeintent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            storeintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
            context.startActivity(storeintent);
        } catch ( final Exception e ) {
            url = "https://play.google.com/store/apps/details?id=com.myapp.packagename";
            storeintent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            storeintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
            context.startActivity(storeintent);
        }

    }
查看更多
三岁会撩人
4楼-- · 2019-01-09 09:09

You can use Intent.createChooser() method to safely launch the Intent. If no application exists that can handle your intent, a dialog will be displayed telling the user just that. If however Google Play Store is installed, the user can that choose to "open" the intent in Play Store.

startActivity(Intent.createChooser(marketIntent, "dialogTitle"));
查看更多
姐就是有狂的资本
5楼-- · 2019-01-09 09:14

Try adding

<category android:name="android.intent.category.DEFAULT" />

to the calling Activity.

查看更多
够拽才男人
6楼-- · 2019-01-09 09:18

You are running this code on an Android environment that lacks the Google Play Store, such as an emulator, Kindle Fire, etc.

If you are encountering this on an emulator, test this code path on a device that has the Play Store.

If you are encountering this on some piece of hardware that lacks the Play Store, or if you are planning on distributing your app to devices that lack the Play Store, either handle the exception or use PackageManager and resolveActivity() to determine if your Intent will succeed before calling startActivity().

if(intent.resolveActivity(getPackageManager()) != null)
    startActivityForResult(intent, 0);
else
    ...
查看更多
登录 后发表回答