简而言之:我的应用程序应允许用户使用标准应用程序拍照并显示照片。这些照片不应显示在图库中。卸载应用后,应删除照片。
我到目前为止所得到的:由于我要使用设备的默认相机应用程序,因此需要使用文件的可共享位置。我尝试在调用中将'ExternalFilesDir'与'Manifest / xml / provider'构造的Uri一起使用意图。这适用于相机应用程序:
private String mImagePath;
private void takePhoto(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(getPackageManager()) == null) return;
String filename="Image" + System.currentTimeMillis();
File dir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File file =null;
try{
file = File.createTempFile(filename,".jpg", dir);
}catch(Exception ex){
ex.printStackTrace();
}
if (file == null) return;
mImagePath =file.getAbsolutePath();
Uri uri = FileProvider.getUriForFile(this,getApplicationContext().getPackageName()+".provider", file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, requestcode);
}
此部分似乎可以正常工作(由于我的“权限”,我无法检查该文件夹,因为Android Studio的Device File Eplorer不会让我烦恼!)。
但是当我尝试显示图像时,所有标准应用程序(图库,Foto等)都抛出“拒绝访问”错误消息。
private void displayPhoto{
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri contentUri = FileProvider.getUriForFile(this,getApplicationContext().getPackageName()+".provider", new File(mImagePath));
intent.setDataAndType(contentUri, "image/*");
startActivity(intent);
}
我的问题是:
-或-
我不想编写自己的显示代码,因为用户熟悉标准应用程序。我需要使用minSDKVersion 22。
感谢您在这里帮助我!
同时,数小时后,我发现了Gallery或其他应用显示“拒绝访问”错误的原因:除了uri,呼叫者应用还必须在呼叫意图中设置“ FLAG_GRANT_READ_URI_PERMISSION”标志。像这样:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(mycontenturi, "image/*");
intent.setFlags(FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
而且我还发现fileprovider xml中唯一起作用的条目是:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="my_images" path="Pictures/" />
<external-files-path name="my_images" path="." />
<external-files-path name="camera_image" path="."/>
<external-files-path name="camera_image" path="Pictures/"/>
</paths>
很有趣:当路径为“。”时它创建一个Pictures子目录,当它说“ Pictures /”时,它没有。