Активность не действительна
Я пытаюсь запустить намерение открыть ссылку на рынок Android.
часть манифеста Android выглядит следующим образом:
<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>
запуск намерения выглядит следующим образом:
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:
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)
Ответы
Ответ 1
Вы используете этот код в среде Android, в которой нет магазина Google Play, такого как эмулятор, Kindle Fire и т.д.
Если вы сталкиваетесь с этим в эмуляторе, проверьте этот путь кода на устройстве, имеющем Play Store.
Если вы сталкиваетесь с этим на некоторых аппаратных средствах, в которых отсутствует Play Store, или если вы планируете распространять свое приложение на устройствах, которым не хватает Play Store, либо обрабатывайте исключение, либо используйте PackageManager
и resolveActivity()
для определите, будет ли ваш Intent
преуспеть перед вызовом startActivity()
.
if(intent.resolveActivity(getPackageManager()) != null)
startActivityForResult(intent, 0);
else
...
Ответ 2
Вы можете использовать метод Intent.createChooser() для безопасного запуска Intent. Если не существует приложения, которое может обрабатывать ваши намерения, отобразится диалоговое окно с сообщением пользователю именно об этом. Если, однако, Google Play Store установлен, пользователь может выбрать "открыть" намерение в Play Store.
startActivity(Intent.createChooser(marketIntent, "dialogTitle"));
Ответ 3
Попробуйте добавить
<category android:name="android.intent.category.DEFAULT" />
вызывающей активности.
Ответ 4
Лучшим решением было бы попытаться открыть uri в приложении Google Play, но если такого приложения нет (никаких действий для обработки этого намерения), вы можете просто попробовать открыть uri в браузере, как в этом примере:
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);
}
}
Ответ 5
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);
}
}