Android Intent ACTION_VIEW 无法从外部 SD 卡打开文件
Android Intent ACTION_VIEW faild to open a file from external sd card
当用户选择文件时,它会触发此代码...
public static void openFiles(File file, Context context) {
Uri uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID, file);
MimeTypeMap mimeType = MimeTypeMap.getSingleton();
String type = mimeType.getMimeTypeFromExtension(file.getName().substring(file.getName().lastIndexOf(".") + 1).toLowerCase());
//Toast.makeText(context, type, Toast.LENGTH_SHORT).show();
if (type == null) type = "*/*";
Intent share = new Intent(Intent.ACTION_VIEW);
share.setDataAndType(uri, type);
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(share);
//context.startActivity(Intent.createChooser(share, file.getName()));
}
问题:
当我从内部存储中选择一个文件时,它工作正常,但是当我尝试从外部 SD 卡打开一个文件时,我得到了这个例外
I/ViewRootImpl@f0cb2c4[MainActivity]: ViewPostIme pointer 0
I/ViewRootImpl@f0cb2c4[MainActivity]: ViewPostIme pointer 1
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.files, PID: 21495
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/5A85-D438/DCIM/Camera/20200406_100806.jpg
at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:744)
at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:418)
at com.example.files.JFileAdapter.openFiles(MainActivity.java:596)
at com.example.files.JFileAdapter.clickItem(MainActivity.java:579)
at com.example.files.JFileAdapter.lambda$getView[=13=]$JFileAdapter(MainActivity.java:501)
at com.example.files.-$$Lambda$JFileAdapterO8geCTLRGHMEPzMgOfCRCbnWso.onClick(Unknown Source:8)
at android.view.View.performClick(View.java:7862)
at android.view.View.performClickInternal(View.java:7831)
at android.view.View.access00(View.java:879)
at android.view.View$PerformClick.run(View.java:29359)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8167)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
I/Process: Sending signal. PID: 21495 SIG: 9
res/xml/file_paths
<?xml version="1.0" encoding="utf-8"?>
<paths >
<cache-path name="cache" path="." />
<files-path name="files" path="." />
<external-path name="files" path="." />
</paths>
清单
<provider
android:name="androidx.core.content.FileProvider"
android:grantUriPermissions="true"
android:exported="false"
android:authorities="${applicationId}">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
他打开外置sd卡文件失败是我哪里做错了?
FileProvider 通常不通过可移动微型 SD 卡提供服务。
但是对于 Android 10- 如果您在 xml 文件中添加一行就可以了:
<root-path name="root" path="." />
您甚至可以删除所有其他路径声明。
当用户选择文件时,它会触发此代码...
public static void openFiles(File file, Context context) {
Uri uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID, file);
MimeTypeMap mimeType = MimeTypeMap.getSingleton();
String type = mimeType.getMimeTypeFromExtension(file.getName().substring(file.getName().lastIndexOf(".") + 1).toLowerCase());
//Toast.makeText(context, type, Toast.LENGTH_SHORT).show();
if (type == null) type = "*/*";
Intent share = new Intent(Intent.ACTION_VIEW);
share.setDataAndType(uri, type);
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(share);
//context.startActivity(Intent.createChooser(share, file.getName()));
}
问题:
当我从内部存储中选择一个文件时,它工作正常,但是当我尝试从外部 SD 卡打开一个文件时,我得到了这个例外
I/ViewRootImpl@f0cb2c4[MainActivity]: ViewPostIme pointer 0
I/ViewRootImpl@f0cb2c4[MainActivity]: ViewPostIme pointer 1
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.files, PID: 21495
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/5A85-D438/DCIM/Camera/20200406_100806.jpg
at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:744)
at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:418)
at com.example.files.JFileAdapter.openFiles(MainActivity.java:596)
at com.example.files.JFileAdapter.clickItem(MainActivity.java:579)
at com.example.files.JFileAdapter.lambda$getView[=13=]$JFileAdapter(MainActivity.java:501)
at com.example.files.-$$Lambda$JFileAdapterO8geCTLRGHMEPzMgOfCRCbnWso.onClick(Unknown Source:8)
at android.view.View.performClick(View.java:7862)
at android.view.View.performClickInternal(View.java:7831)
at android.view.View.access00(View.java:879)
at android.view.View$PerformClick.run(View.java:29359)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8167)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
I/Process: Sending signal. PID: 21495 SIG: 9
res/xml/file_paths
<?xml version="1.0" encoding="utf-8"?>
<paths >
<cache-path name="cache" path="." />
<files-path name="files" path="." />
<external-path name="files" path="." />
</paths>
清单
<provider
android:name="androidx.core.content.FileProvider"
android:grantUriPermissions="true"
android:exported="false"
android:authorities="${applicationId}">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
他打开外置sd卡文件失败是我哪里做错了?
FileProvider 通常不通过可移动微型 SD 卡提供服务。
但是对于 Android 10- 如果您在 xml 文件中添加一行就可以了:
<root-path name="root" path="." />
您甚至可以删除所有其他路径声明。