无法使用自定义文件提供程序在牛轧糖中打开文件
Unable to open file in Nougat using custom file provider
我正在尝试使用文件提供程序在牛轧糖中打开一个文件,查看了一些示例并添加了提供程序以显示并创建了提供程序路径 xml,如下所示:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
provider_path.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="/"
path="." />
</paths>
打开文件的代码:
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
File file = new File(path);
MimeTypeMap mime = MimeTypeMap.getSingleton();
String ext = file.getName().substring(file.getName().indexOf(".") + 1);
String type = mime.getMimeTypeFromExtension(ext);
Log.d(TAG, file.getAbsolutePath() + "mime " + type + " ext " + ext + "uri file " + FileProvider.getUriForFile(context,
BuildConfig.APPLICATION_ID + ".provider",
file).toString());
Uri ur = UriHelper.getNougatUri(file);
Log.d(TAG, "uri2 " + ur);
intent.setDataAndType(FileProvider.getUriForFile(context,
BuildConfig.APPLICATION_ID + ".provider",
file), type);
context.startActivity(intent);
Logcat:
08-09 12:04:39.728 18288-18288/com.app.tod D/ChatAdapter1: /storage/emulated/0/com.app.tod/Media/sent/08-09-2017 12:04 PM.jpegmime image/jpeg ext jpeguri file content://com.app.tod.provider/%2Fstorage%2Femulated%2F0%2Fcom.app.tod%2F/com.app.toado/Media/sent/08-09-2017%2012%3A04%20PM.jpeg
08-09 12:04:39.729 18288-18288/com.app.tod D/ChatAdapter1: uri2 content://com.app.tod.provider/storage/emulated/0/com.app.tod/Media/sent/08-09-2017 12:04 PM.jpeg
当我单击文件时,它会转到图库并显示无法加载图片,
该图像存在于此路径 -
/storage/emulated/0/com.app.tod/Media/sent/08-09-2017 12:04 PM.jpeg
谁能告诉我如何访问我在 /storage/emulated/0/com.app.tod/
为我的应用程序创建的文件夹中的所有文件
此外,如果我想打开内部存储中其他位置的文件,有什么办法吗?
谢谢。
When i click on the file it goes to the gallery and says Image cannot be loaded
您没有将 FLAG_GRANT_READ_URI_PERMISSION
添加到 Intent
,因此第三方应用无法读取您的 Uri
所识别的内容。
另请注意,您的 UriHelper.getNougatUri(file);
似乎毫无用处,因为您对结果所做的一切就是将其记录到 LogCat。
我正在尝试使用文件提供程序在牛轧糖中打开一个文件,查看了一些示例并添加了提供程序以显示并创建了提供程序路径 xml,如下所示:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
provider_path.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="/"
path="." />
</paths>
打开文件的代码:
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
File file = new File(path);
MimeTypeMap mime = MimeTypeMap.getSingleton();
String ext = file.getName().substring(file.getName().indexOf(".") + 1);
String type = mime.getMimeTypeFromExtension(ext);
Log.d(TAG, file.getAbsolutePath() + "mime " + type + " ext " + ext + "uri file " + FileProvider.getUriForFile(context,
BuildConfig.APPLICATION_ID + ".provider",
file).toString());
Uri ur = UriHelper.getNougatUri(file);
Log.d(TAG, "uri2 " + ur);
intent.setDataAndType(FileProvider.getUriForFile(context,
BuildConfig.APPLICATION_ID + ".provider",
file), type);
context.startActivity(intent);
Logcat:
08-09 12:04:39.728 18288-18288/com.app.tod D/ChatAdapter1: /storage/emulated/0/com.app.tod/Media/sent/08-09-2017 12:04 PM.jpegmime image/jpeg ext jpeguri file content://com.app.tod.provider/%2Fstorage%2Femulated%2F0%2Fcom.app.tod%2F/com.app.toado/Media/sent/08-09-2017%2012%3A04%20PM.jpeg
08-09 12:04:39.729 18288-18288/com.app.tod D/ChatAdapter1: uri2 content://com.app.tod.provider/storage/emulated/0/com.app.tod/Media/sent/08-09-2017 12:04 PM.jpeg
当我单击文件时,它会转到图库并显示无法加载图片, 该图像存在于此路径 -
/storage/emulated/0/com.app.tod/Media/sent/08-09-2017 12:04 PM.jpeg
谁能告诉我如何访问我在 /storage/emulated/0/com.app.tod/
为我的应用程序创建的文件夹中的所有文件此外,如果我想打开内部存储中其他位置的文件,有什么办法吗?
谢谢。
When i click on the file it goes to the gallery and says Image cannot be loaded
您没有将 FLAG_GRANT_READ_URI_PERMISSION
添加到 Intent
,因此第三方应用无法读取您的 Uri
所识别的内容。
另请注意,您的 UriHelper.getNougatUri(file);
似乎毫无用处,因为您对结果所做的一切就是将其记录到 LogCat。