【问题标题】:ActivityNotFoundException on some Android devices某些 Android 设备上的 ActivityNotFoundException
【发布时间】:2017-09-13 16:50:40
【问题描述】:

我在 App-Store 中上传了一个 Android 应用程序(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$2.onMenuItemClick(ToolbarActionBar.java:69)
       at android.support.v7.widget.Toolbar$1.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。

对这个例外有什么想法和避免它的建议吗?

【问题讨论】:

    标签: android android-activity android-fragmentactivity android-music-player


    【解决方案1】:

    除此之外的操作系统是 4.4.4 和 5.0.1

    没有。您碰巧收到了这些操作系统版本的崩溃通知。大约有 20 亿台 Android 设备,这类问题可能发生在任何一台设备上。

    对此例外的任何想法

    您假设这大约 20 亿台 Android 设备中的每一台都有一个或多个应用程序,其活动与 Intent.ACTION_MAINIntent.CATEGORY_APP_MUSIC 匹配。 任何这些设备都不需要有这样的活动。

    建议避免它?

    选项#1:将您的startActivity() 调用封装在try/catch 块中并捕获ActivityNotFoundException,然后告诉用户您找不到合适的应用程序。

    选项#2:使用PackageManagerqueryIntentActivities() 来查看Intent 是否有任何匹配项。如果没有,请不要拨打startActivity(),然后告诉用户您找不到合适的应用程序。

    【讨论】:

      【解决方案2】:

      到你的代码

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

      【讨论】:

        【解决方案3】:

        致命异常可能是您传递了空对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-03-14
          • 1970-01-01
          • 2014-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-15
          相关资源
          最近更新 更多