使用标准应用程序概念进行存储共享

问题描述 投票:0回答:1

简而言之:我的应用程序应允许用户使用标准应用程序拍照并显示照片。这些照片不应显示在图库中。卸载应用后,应删除照片。

我到目前为止所得到的:由于我要使用设备的默认相机应用程序,因此需要使用文件的可共享位置。我尝试在调用中将'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);
}

我的问题是:

  • 为什么相机应用程序可以在ExternalFilesDir中存储文件,但是显示的应用无法从那里读取?

-或-

  • 我的代码有问题吗?
  • 我的应用可以以某种方式授予对显示应用的访问权限吗?
  • 我还可以使用什么其他概念来实现目标?
  • 如何在Android中浏览ExternalFilesDir的内容Studio还是其他工具?

我不想编写自己的显示代码,因为用户熟悉标准应用程序。我需要使用minSDKVersion 22。

感谢您在这里帮助我!

java android android-camera android-sharing
1个回答
0
投票

同时,数小时后,我发现了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 /”时,它没有。

© www.soinside.com 2019 - 2024. All rights reserved.