【发布时间】: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"
【问题讨论】:
-
第一步是使用具体的 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