提供者/ storage / emulated / 0 /

时间:2018-05-17 17:00:26

标签: android android-external-storage android-fileprovider


我知道这是一个老人,但我似乎没有办法管理它...
我要捕获一个Camera图像以便以后进行IO处理,将其转移到网络共享,但是在此之前我失败很多... 经过一些阅读后,我找到了实际在KitKat上检查正在运行的SDK的方法,它可以工作.. 但是,现在我也在Nougat设备上测试它。

对于Nougat我读过应该使用的提供者,我正在努力...
捕获的图像必须存储在特定的文件夹中 “/存储/模拟/ 0 / InsulinPower / amSignTool /数据”
以后的IO处理...所以我觉得类似的东西  必须使用,目前看不见..
我查看了所有“区域”的提供程序定义,但是无法得到我需要的答案,而且我得到了更多异常..因为定义了我得到的回溯URI java.lang.reflect.InvocationTargetException
java.lang.IllegalArgumentException:无法找到包含/storage/emulated/0/InsulinPower/amSignTool/Data/XCAMX-201805171828082115829615.jpg的已配置根目录

在file_paths中,我试着安静一切,正如你所看到的......但是只有当我推荐外部路径而不是外部路径文件时才会这样做似乎是我需要的那个......外在的道路 代码很简单......

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getPackageManager()) != null) {
    File pictureFile = null;
    try {
        pictureFile = GENERIC.amPictureFile(this);
    } catch (IOException ex) {
    // Error occurred while creating the File
    Toast.makeText(this, "Create file failed!", Toast.LENGTH_SHORT).show();
    }

if (pictureFile != null) {
    //https://stackoverflow.com/questions/40087944/content-uri-crashes-camera-on-android-kitkat
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT){
        this.imageToUploadUri = Uri.fromFile(pictureFile);
    } else {            
        this.imageToUploadUri = FileProvider.getUriForFile(this,"com.insulinpower.android.fileprovider", pictureFile);  // <-- THIS statement crashes with the indicated exception
    }
    //\  https://stackoverflow.com/questions/40087944/content-uri-crashes-camera-on-android-kitkat

    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageToUploadUri);
    startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE);
}


// file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Share folder under public external storage folder.The base folder is Environment.getExternalStorageDirectory()-->
    <!--external-path name="my_data" path="InsulinPower/amSignTool/Data/" /> -->
    <external-files-path name="my_data" path="/InsulinPower/amSignTool/Data/" />
    <!-- external-files-path name="my_data" path="InsulinPower/amSignTool/Data/" / -->
    <!-- external-files-path name="my_data" path="/" /-->
</paths>


// manifest
<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.insulinpower.android.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths"></meta-data>
</provider>

文件storageDir =新文件(Environment.getExternalStorageDirectory(),“”);
返回“/ storage / emulated / 0”//有效,添加/ InsulinPower / amSignTool /数据后缀以转到正确的文件夹...

文件file = this.getExternalFilesDir(null);
返回“/storage/emulated/0/Android/data/com.insulinpower.amsigntool/files”//对我无效

任何提示都会非常感激,以理解我的错误,请原谅我可怜的英语..
TIA
安德烈

2 个答案:

答案 0 :(得分:2)

  

捕获的图像必须存储在特定的文件夹中   &#34; /存储/模拟/ 0 / InsulinPower / amSignTool /数据&#34;

那是new File(Environment.getExternalStorageDirectory(), "InsulinPower/amSignTool/Data")

  

但它只有在我引用外部路径和非外部路径文件时才有效,这确实是我需要的那个

正确。尝试:

<external-path name="my_data" path="/InsulinPower/amSignTool/Data/" />

您肯定希望<external-path>,而不是<external-files-path>,给定文件的位置。

您还需要:

cameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

开始活动之前。否则,相机应用程序无权写入此位置。

答案 1 :(得分:0)

@CommonsWare:哇...谢谢它有效......
我只需修改我的pictureFile = GENERIC.amPictureFile(this);
将引用模块StringFileName设置为以

开头
this.m_PictureFilePath = "file:" + pictureFile.getAbsolutePath(); 


因为我没有用“file:”开始它... ... 并且作为GENERIC.amPictureFile(this)已经指向Environment.getExternalStorageDirectory()+“/ Insulin .... /”
我不得不修改

<external-path name="my_data" path="/InsulinPower/amSignTool/Data/" />



<external-path name="my_data" path="." />


因为我认为理解文件创建已经指向根的子文件夹,并且在提供程序和文件创建中使用它需要对折叠进行子嵌套...或者这是我的理解..
<登记/> https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en也有帮助...... 非常感谢你,你确实非常有帮助...真的很感激'我只是开始理解这个文件提供者的东西
安德烈