在我的应用中,我会显示帖子可能包含图片的帖子列表。当用户点击帖子图片时,创建选择器会显示“照片”,“图库”等可用选项。我的问题是,为什么不能在Android 7.0或API 24及更高版本上打开图像?我收到错误“无法打开文件。”在API级别23及以下,我提供了似乎正常工作的实际文件路径。在发布这个问题之前,我确认了以下事项。感兴趣的部分是" Photo"可以打开它。
我使用FileProvider获取正确的内容uri。我的uri看起来像这样:
内容://package.fileprovider/attachment/filename
我使用的是适当的mime类型。
我正在使用正确的意图和权限标记。请参阅以下代码:
Intent myIntent = new Intent(Intent.ACTION_VIEW); myIntent.putExtra(ShareCompat.EXTRA_CALLING_PACKAGE,getActivity()。getPackageName()); myIntent.putExtra(ShareCompat.EXTRA_CALLING_ACTIVITY,getActivity()。getComponentName());
myIntent.setDataAndType(uri,mimeType); myIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(Intent.createChooser(myIntent," Open file:"));
答案 0 :(得分:1)
仅适用于上面的Android API 24 - Nougat设备
File file = new File(String.valueOf(path), imageName+".png"); //it is image file name.
if(Build.VERSION.SDK_INT>=24){
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //must provide
Uri photoUri = FileProvider.getUriForFile(YourCurrentActivity.this,
android.support.v4.BuildConfig.APPLICATION_ID +
".fileprovider", finalFile);
intent.setData(photoUri);
YourCurrentActivity.this.startActivity(intent);
}
答案 1 :(得分:0)
您可以通过将文件URI添加到您的应用程序来打开文件URI:
if(Build.VERSION.SDK_INT>=24){
try{
Method m = StrictMode.class.getMethod("disableDeathOnFileUriExposure");
m.invoke(null);
}catch(Exception e){
e.printStackTrace();
}
}
内容可能是新事物,但在我看来,与较低的API设备相比,没有足够的7.0设备处于活动状态,以证明不使用此弃用方法的合理性。 7.0设备仍然可以使用它,安静。
答案 2 :(得分:0)
也许在Nougat上你需要获得用户的许可才能读写。您的代码将在N以下工作。因此,要求用户授予读取权限,并检查FileProvider,您也需要它。