java - 与标准应用程序概念共享存储

标签 java android android-camera android-sharing

简而言之: 我的应用程序应该让用户使用标准应用程序拍摄和显示照片。 照片不应出现在图库中。 卸载应用程序时,应删除照片。

到目前为止我得到了什么: 由于我想使用设备的默认相机应用程序,因此我需要使用可共享的位置来存放文件。 我尝试在调用中将“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/

相关文章:

java - 如何将根 SSL 证书作为资源包含在 J2ME 应用程序中?

java - 从 LinearLayout 获取子元素

android - 访问被拒绝查找属性 "camera.hal1.packagelist"

android - 如何在android中减小相机图片的大小

java - Postgres Hibernate 设置 session 变量以实现行级安全性

java - 哪个是更好的单例实现?

java - 与线程通信的模式

android - FileNotFoundException AndroidManifest.xml

c# - 在运行时更改增强对象(AR Core)的颜色

android - 如何使用工具 :overrideLibrary ="io.flutter.plugins.camera"