某些 Android 设备上的 ActivityNotFoundException
ActivityNotFoundException on some Android devices
我在 App-Store 中上传了一个 Android-App(SDK 版本 15-25)。 Crashlytics 向我报告以下异常:
Fatal Exception: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 sel=act=android.intent.action.MAIN cat=[android.intent.category.APP_MUSIC]} }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1776)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1496)
at android.app.Activity.startActivityForResult(Activity.java:3798)
at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
at android.app.Activity.startActivityForResult(Activity.java:3749)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
at android.app.Activity.startActivity(Activity.java:4079)
at android.app.Activity.startActivity(Activity.java:4047)
at com.myapp.myappname.ui.activity.MainActivity.onOptionsItemSelected(MainActivity.java:467)
at android.app.Activity.onMenuItemSelected(Activity.java:2934)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:408)
at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:195)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:113)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:113)
at android.support.v7.app.ToolbarActionBar.onMenuItemClick(ToolbarActionBar.java:69)
at android.support.v7.widget.Toolbar.onMenuItemClick(Toolbar.java:206)
at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:776)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:156)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:969)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:959)
at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:623)
at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:154)
at android.view.View.performClick(View.java:4807)
at android.view.View$PerformClick.run(View.java:20106)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5576)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750)
这是MainActivity中的方法:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.player) {
Timber.i( "Added onClick listener to ImageView ivPlayer.");
Intent intent=Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, Intent.CATEGORY_APP_MUSIC);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return true;
} else if (id == R.id.logout) {
Toast.makeText(getApplicationContext(), "Logging out...", Toast.LENGTH_LONG).show();
logout();
return true;
}
return super.onOptionsItemSelected(item);
}
之前我使用了以下代码但有相同的异常:
Intent intent = new Intent(MediaStore.INTENT_ACTION_MUSIC_PLAYER);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
具有此例外的操作系统是 4.4.4 和 5.0.1。
对此异常有什么想法和避免它的建议吗?
Operating Systems with this exception are 4.4.4 and 5.0.1
没有。您碰巧收到了那些 OS 版本的崩溃通知。大约有 20 亿 Android 台设备,此类问题可能发生在任何一台设备上。
Any ideas for this exception
您假设这 20 亿台 Android 设备中的每台设备都有一个或多个 activity 匹配 Intent.ACTION_MAIN
和 Intent.CATEGORY_APP_MUSIC
的应用程序。这些设备中的 任何 都不需要具有这样的 activity.
proposals to avoid it?
选项 #1:将您的 startActivity()
调用包装在 try
/catch
块中并捕获 ActivityNotFoundException
,然后告诉用户您找不到合适的应用
选项 #2:使用 PackageManager
和 queryIntentActivities()
查看是否有 Intent
的匹配项。如果有none,不要调用startActivity()
,然后告诉用户找不到合适的app。
致命异常可能是您传递的是空对象。
到你的代码
Intent intent = new Intent(MediaStore.INTENT_ACTION_MUSIC_PLAYER);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
添加以下内容
try {
List<ResolveInfo> activities = getPackageManager().queryIntentActivities(intent, PackageManager.GET_ACTIVITIES);
if (activities.size() > 0)
startActivity(intent);
else
Toast.makeText(MainActivity.this, "A music player is absent on your device!", Toast.LENGTH_SHORT).show();
} catch (ActivityNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e){
e.printStackTrace();
}
我在 App-Store 中上传了一个 Android-App(SDK 版本 15-25)。 Crashlytics 向我报告以下异常:
Fatal Exception: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 sel=act=android.intent.action.MAIN cat=[android.intent.category.APP_MUSIC]} }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1776)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1496)
at android.app.Activity.startActivityForResult(Activity.java:3798)
at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
at android.app.Activity.startActivityForResult(Activity.java:3749)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
at android.app.Activity.startActivity(Activity.java:4079)
at android.app.Activity.startActivity(Activity.java:4047)
at com.myapp.myappname.ui.activity.MainActivity.onOptionsItemSelected(MainActivity.java:467)
at android.app.Activity.onMenuItemSelected(Activity.java:2934)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:408)
at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:195)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:113)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:113)
at android.support.v7.app.ToolbarActionBar.onMenuItemClick(ToolbarActionBar.java:69)
at android.support.v7.widget.Toolbar.onMenuItemClick(Toolbar.java:206)
at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:776)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:156)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:969)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:959)
at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:623)
at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:154)
at android.view.View.performClick(View.java:4807)
at android.view.View$PerformClick.run(View.java:20106)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5576)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750)
这是MainActivity中的方法:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.player) {
Timber.i( "Added onClick listener to ImageView ivPlayer.");
Intent intent=Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, Intent.CATEGORY_APP_MUSIC);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return true;
} else if (id == R.id.logout) {
Toast.makeText(getApplicationContext(), "Logging out...", Toast.LENGTH_LONG).show();
logout();
return true;
}
return super.onOptionsItemSelected(item);
}
之前我使用了以下代码但有相同的异常:
Intent intent = new Intent(MediaStore.INTENT_ACTION_MUSIC_PLAYER);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
具有此例外的操作系统是 4.4.4 和 5.0.1。
对此异常有什么想法和避免它的建议吗?
Operating Systems with this exception are 4.4.4 and 5.0.1
没有。您碰巧收到了那些 OS 版本的崩溃通知。大约有 20 亿 Android 台设备,此类问题可能发生在任何一台设备上。
Any ideas for this exception
您假设这 20 亿台 Android 设备中的每台设备都有一个或多个 activity 匹配 Intent.ACTION_MAIN
和 Intent.CATEGORY_APP_MUSIC
的应用程序。这些设备中的 任何 都不需要具有这样的 activity.
proposals to avoid it?
选项 #1:将您的 startActivity()
调用包装在 try
/catch
块中并捕获 ActivityNotFoundException
,然后告诉用户您找不到合适的应用
选项 #2:使用 PackageManager
和 queryIntentActivities()
查看是否有 Intent
的匹配项。如果有none,不要调用startActivity()
,然后告诉用户找不到合适的app。
致命异常可能是您传递的是空对象。
到你的代码
Intent intent = new Intent(MediaStore.INTENT_ACTION_MUSIC_PLAYER);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
添加以下内容
try {
List<ResolveInfo> activities = getPackageManager().queryIntentActivities(intent, PackageManager.GET_ACTIVITIES);
if (activities.size() > 0)
startActivity(intent);
else
Toast.makeText(MainActivity.this, "A music player is absent on your device!", Toast.LENGTH_SHORT).show();
} catch (ActivityNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e){
e.printStackTrace();
}