【问题标题】:Android 10: ACTION_VIEW becomes brokenAndroid 10:ACTION_VIEW 损坏
【发布时间】:2019-10-21 12:00:47
【问题描述】:

我的应用的一位用户报告说,在升级到 Android 10 后,我的应用在他的设备上停止显示图像。

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setType("image/*");
intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setData(scannedUri);
startActivity(intent);

我有“targetSdkVersion 28”,所以新的 Scoped Storage 规则不应该运行。 我还是把“compileSdkVersion 29”并包含在Manifest文件中:

android:requestLegacyExternalStorage="true"

我的用户仍然只有一个空屏幕,而他可以看到 Android 10 之前的图像:

【问题讨论】:

  • 第一步是使用具体的 MIME 类型。您提供给其他应用的是您的内容,因此为该内容提供实际的 MIME 类型是您的工作。如果这没有帮助,您的问题可能来自 scannedUri 是什么。
  • @CommonsWare 感谢您的快速回复!即使不使用 setType() 方法,也可以唤起这种意图。扫描的Uri实际上是一个来自调用的Uri:MediaScannerConnection.scanFile() in its listener
  • 我不确定外部存储是否可以被索引,而且我之前从未尝试过使用scanFile() 返回的Uri。您可以考虑添加 FileProvider 并在短期内使用它来提供您的内容。长期而言,您无法访问getExternalStoragePublicDirectory(),因此您需要做其他事情。
  • 如果您的意思是MediaStore,是的,对于媒体,这是保存内容的一种方式。存储访问框架(ACTION_OPEN_DOCUMENT 和朋友)是另一个。
  • "现在过时了吗?" -- 是的,只要它不是最新的 Android 10+。如果您忽略MediaScannerConnection 的东西,您的android:requestLegacyExternalStorage="true" 将允许getExternalStoragePublicDirectory() 继续工作。我只是不确定MediaScannerConnection 如何与 Android 10 上的旧外部存储一起使用,更不用说您是否通过回调获得可用的Uri。如果您切换到使用 FileProvider 作为您的 Uri 源,您可以在短期内保持其余实现不变。

标签: android image android-intent


【解决方案1】:

我也有同样的问题,结合

<external-path name="pics" path="/" /> (used with FileProvider)

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

为我解决了(我使用的是 SDK 版本 28)。

只是想说谢谢你提出这个问题并提供 READ_URI_PERMISSION 标志代码,否则我无法让它工作,我尝试了 10 种不同的东西!

【讨论】:

    【解决方案2】:

    我认为图像扩展名 .jpeg、.jpg 或其他的问题......

    意图意图 = new Intent(Intent.ACTION_VIEW); intent.setType("图片/jpeg"); intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 意图.setData(scannedUri); 开始活动(意图);

    【讨论】:

      【解决方案3】:

      如果你这样传递Uri,例如

      Uri imageUri = Uri.parse("http://www.android.com");
      Intent imageIntent = new Intent(Intent.ACTION_VIEW, imageUri);
      

      默认情况下,系统会根据包含的 Uri 数据确定 Intent 所需的适当 MIME 类型。 设置 MIME 类型进一步指定了哪些类型的活动应该接收意图。

      例如,如果要使用 ACTION_VIEW Intent 显示图像,则应指定 MIME 类型为 image/*。这会阻止(某人)在可以“查看”其他类型数据的应用程序(如地图应用程序)中执行某些操作,以免被意图触发。

      希望对你有帮助。

      【讨论】:

      • 在 Android 10 之前,即使没有此调用,代码也能正常工作:intent.setType("image/*");
      • 如果 Intent 中不包含 Uri,通常应该使用 setType() 来指定与 Intent 关联的数据类型。
      • 我确实包含了一个 Uri --scannedUri
      • 它在所有低于 10 的 Android 版本中都这样工作。问题在于 Android 10 或特定设备上的实现
      猜你喜欢
      • 1970-01-01
      • 2016-02-16
      • 2014-06-28
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多