【问题标题】:ActivityNotFoundException when starting android.intent.action.VIEW启动android.intent.action.VIEW时出现ActivityNotFoundException
【发布时间】:2015-12-08 12:37:22
【问题描述】:

我正在运行context.startActivity(intent);,我的意图如下所示:

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    intent.setDataAndType(Uri.parse(uri), mimeType);

此时的uri是一个字符串http://remote.server.path/photo-12212324324.jpg

mimeType 是image/jpeg

这是一个异常示例。

12-07 20:48:55.934: I/ActivityManager(633): START u0 {act=android.intent.action.VIEW dat=http: typ=image/jpeg flg=0x1} from pid 1414
12-07 20:48:55.964: W/dalvikvm(1414): threadid=1: thread exiting with uncaught exception (group=0x40cb5ba0)
12-07 20:48:56.034: E/AndroidRuntime(1414): FATAL EXCEPTION: main
12-07 20:48:56.034: E/AndroidRuntime(1414): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=http: typ=image/jpeg flg=0x1 }
12-07 20:48:56.034: E/AndroidRuntime(1414):     at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1760)
12-07 20:48:56.034: E/AndroidRuntime(1414):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1555)
12-07 20:48:56.034: E/AndroidRuntime(1414):     at android.app.Activity.startActivityForResult(Activity.java:3431)

这发生在至少两台设备上,其中一台是三星 Galaxy S5,因此,我怀疑没有应用程序来处理该意图,因为用户至少会安装三星图库应用程序。我知道我可以处理异常并显示错误,但这并不是真正的修复..

【问题讨论】:

标签: android android-intent


【解决方案1】:

我正在运行 context.startActivity(intent);我的意图是这样的:

嗯,FLAG_GRANT_READ_URI_PERMISSION 在这里没用。这仅适用于您的 Uri 来自 ContentProvider 时。

我怀疑没有应用程序来处理意图,因为用户至少会安装三星画廊应用程序

设备可能有那个应用。 用户可能不会。请记住,在 Android 4.2+ 平板电脑和 Android 5.0+ 手机上,一个设备可能有多个用户。其中一些用户可能是“受限帐户”,他们只能访问白名单中的一组应用。

请不要假设所有用户都可以访问可以下载和查看图像的应用程序。

另外,我不会假设任何“三星图库应用”都一定会支持http 作为方案。

我知道我可以处理异常并显示错误,但这并不是真正的修复

如果您不想显示错误,请实现您自己的图像查看器作为后备。

【讨论】:

  • 感谢您的回答。该方法也支持内容提供者 Uri,因此也支持标志。图库应用程序(默认)支持http,至少是安装在三星S3和S4上的版本。不幸的是,我没有 S5 可以测试,但我认为可以安全地假设它是相似的。我同意,总的来说,我不应该假设用户可以打开图像并实现我自己的媒体查看器,但是,我想检查我的代码是否有问题,或者其他人看到了我觉得奇怪的类似行为。
【解决方案2】:

执行此检查很重要,因为如果您使用任何应用无法处理的意图调用 startActivity(),您的应用将会崩溃。所以只要结果不为空,使用意图是安全的。

    if (intent.resolveActivity(getPackageManager()) != null) {
        context.startActivity(intent);
    }else{ Toast.makeToast(context, "No application found on device to open view", Toast.LENGTH_SHORT).show()}

【讨论】:

  • 是的,我明白了,并将代码打包以避免崩溃,但这仍然不能解释为什么三星 S5 无法处理该意图。
  • 因为您使用的 S5 设备没有安装任何应用程序来处理您意图的结果。
  • 例如,我从手机中卸载所有相机应用程序并触发 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);它会崩溃
  • 因为它不会找到任何打开相机的应用程序
  • 我不认为你可以从股票 S5.. 或相机中卸载图库。这些应用程序已在三星版本中修复。但这不是我的设备,它是现场设备,所以我不能 100% 确定
猜你喜欢
  • 1970-01-01
  • 2016-08-22
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多