使用文件提供程序检索Content Uri失败

时间:2019-05-25 15:40:58

标签: java android android-fileprovider

我花了几天的时间阅读文档并遵循各种教程,但是无论如何我都会遇到错误。我试图将图像保存在内部存储中,然后将其转换为内容Uri,以便可以使用系统裁剪和调整大小功能。如果有人能发现我的代码错误的地方,我将不胜感激:

主要活动:

fun <- function(x, y) {
   cosine(mat[, x], mat[, y])
}

outer(seq_len(ncol(mat)), seq_len(ncol(mat)), Vectorize(fun))

#       [,1]   [,2]   [,3]   [,4]   [,5]  ..... 
#[1,] 1.0000 0.7824 1.0000 0.7824 1.0000 .....
#[2,] 0.7824 1.0000 0.7824 1.0000 0.7824 .....
#[3,] 1.0000 0.7824 1.0000 0.7824 1.0000 .....
#[4,] 0.7824 1.0000 0.7824 1.0000 0.7824 .....
#[5,] 1.0000 0.7824 1.0000 0.7824 1.0000 .....
#....

清单:

new Thread(() -> {
try {
    String temp = "temp";

    //Convert bitmap to byte array
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
    byte[] bitmapData = bos.toByteArray();

    //Write the bytes in file
    FileOutputStream fos = openFileOutput(temp, MODE_PRIVATE);
    fos.write(bitmapData);
    fos.flush();
    fos.close();

    //Convert file to contentUri
    File file = new File(getFilesDir(), temp);

    Intent intent = new Intent();
    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    Uri imageUri = FileProvider.getUriForFile(MainActivity.this, "@string/file_provider_authority", file);
    intent.setDataAndType(imageUri, "image/jpg");

    intent = WallpaperManager.getInstance(getApplicationContext()).getCropAndSetWallpaperIntent(imageUri);
    startActivityForResult(intent, ACTIVITY_CROP);

} catch (Exception e) {
    e.printStackTrace();
}
}).start();

file_provider_paths.xml

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="@string/file_provider_authority"
        android:grantUriPermissions="true"
        android:exported="false">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_provider_paths" />
    </provider>
</application>

strings.xml

<paths>
<files-path
    path="/" name="temp" />

错误:

<resources>
<string name="file_provider_authority"
    translatable="false">com.me.wallpaper_app.provider
</string>

2 个答案:

答案 0 :(得分:1)

"@string/file_provider_authority"不是Java中引用字符串资源的方式。使用getString(R.string.file_provider_authority)

更新:根据评论,第二个主要问题是该内容的使用者未使用Intent中的MIME类型,而是调用了{{1 }}放在getType()上以从ContentResolver获取类型。在这种情况下,这就是您的ContentProvider,而FileProvider仅知道如何使用文件扩展名并将其转换为MIME类型。因此,使用FileProvidertemp.jpeg提供了返回正确的MIME类型所需的信息。

答案 1 :(得分:0)

尝试一下

      Uri imageUri = FileProvider.getUriForFile(MainActivity.this, R.string.file_provider_authority, file);

也要更改

    <paths>
    <files-path
    path="/" name="temp" />

收件人

    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="external_files" path="."/>
    </paths>