简而言之: 我的应用程序应该让用户使用标准应用程序拍摄和显示照片。 照片不应出现在图库中。 卸载应用程序时,应删除照片。
到目前为止我得到了什么: 由于我想使用设备的默认相机应用程序,因此我需要使用可共享的位置来存放文件。 我尝试在调用中将“ExternalFilesDir”与“Manifest/xml/provider”构造的 Uri 一起使用 Intent 。这似乎可以与相机应用程序配合使用:
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 的设备文件 Eplorer 不允许我这样做,grr!)。
但是当我尝试显示图像时,所有标准应用程序(图库、照片等)都会抛出“访问被拒绝”错误消息。
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);
}
我的问题是:
- 为什么相机应用程序可以将文件存储在ExternalFilesDir中,但 显示应用程序无法从那里读取它?
-或-
- 我的代码有问题吗?
- 我的应用能否以某种方式授予对显示应用的访问权限?
- 我还可以使用哪些其他概念来实现我的目标?
- 如何在Android中浏览ExternalFilesDir的内容 Studio 还是其他工具?
我不想编写自己的显示代码,因为用户熟悉标准应用程序。 我需要使用 minSDKVersion 22。
感谢您在这里帮助我!
最佳答案
同时,经过几个小时后,我找到了图库或其他应用程序显示“访问被拒绝”错误的原因: 除了 uri 之外,调用者应用程序还必须在调用 Intent 中设置“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/”时,它不会。
关于java - 与标准应用程序概念共享存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61053548/