【问题标题】:provider on /storage/emulated/0//storage/emulated/0/ 上的提供程序
【发布时间】:2021-03-27 12:07:52
【问题描述】:


我知道这是一个老歌,但我似乎没有找到管理它的方法......
我必须为以后的 IO 处理捕获相机图像,将其传输到网络共享,但在此之前我失败了很多...... 在这里阅读了一些之后,我找到了在 KitKat 检查正在运行的 SDK 上实际执行此操作的方法,并且它可以工作.. 但是,现在我也在 Nougat 设备上对其进行测试..

对于 Nougat,我读过应该使用提供程序,并且我正在尝试...
捕获的图像必须存储在一个特定的文件夹中,该文件夹是
“/storage/emulated/0/InsulinPower/amSignTool/Data”
用于以后的 IO 处理...所以我认为类似于 必须用,目前没看..
我查看了所有“区域”的提供程序定义,但无法得到我需要的答案,而且我得到了更多例外......作为定义我得到的检索 URI
java.lang.reflect.InvocationTargetException
java.lang.IllegalArgumentException:未能找到包含 /storage/emulated/0/InsulinPower/amSignTool/Data/XCAMX-201805171828082115829615.jpg

的配置根 如您所见,在 file_paths 中我尝试将所有内容都保持安静...但只有当我确实引用 external-path 而不是 external-path-files 时它才有效,这确实似乎是我需要的..external-path 代码很简单......

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 = new File(Environment.getExternalStorageDirectory(),"");
返回 "/storage/emulated/0" // 有效,添加 /InsulinPower/amSignTool/Data 后缀以转到正确的文件夹...

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

任何提示都会非常感谢理解我的错误,请原谅我糟糕的英语..
TIA
安德烈亚

【问题讨论】:

  • 或者...如果我以后可以通过 File imgFile = new File(imageToUploadUri.getPath()); 访问外部路径中生成的文件到以后 imgFile.renameTo(myFolder_in_external_storage): 那我也很感激,但是 File imgFile = new File(path_in_external_path_IS_NOT_VALID)

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


【解决方案1】:

捕获的图像必须存储在特定文件夹中 "/storage/emulated/0/InsulinPower/amSignTool/Data"

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

但它只有在我确实引用外部路径而不是外部路径文件时才有效,这似乎确实是我需要的文件

正确。试试:

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

你肯定想要&lt;external-path&gt;,而不是&lt;external-files-path&gt;,因为你想要文件去哪里。

你还需要:

cameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

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

【讨论】:

    【解决方案2】:

    @CommonsWare:哇...谢谢它的工作原理...
    我只需要修改我的图片文件 = GENERIC.amPictureFile(this);
    将引用模块 StringFileName 设置为开始为

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


    因为我也没有用“文件:”开始它......
    并且作为 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 也有帮助...
    非常感谢,你确实很有帮助......真的很感激,因为我刚刚开始了解这个文件提供者的东西
    安德烈亚

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-09
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多