3

我正在尝试传递驻留在res/raw我的应用程序目录中的图像以及共享意图。

我遵循了FileProvider docs中描述的过程,这是我的代码:

AndroidManifest.xml

<application ...>
    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.myapp.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">

        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/paths" />
    </provider>
</application>

res/xml/paths.xml

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="shared" path="./"/>
</paths>

我活动中的代码:

String shareToPackage = ...

File imageFile = new File(context.getFilesDir().getPath() + "/image");
if (!imageFile.exists()) { // image isn't in the files dir, copy from the res/raw
    final InputStream inputStream = context.getResources().openRawResource(R.raw.my_image);
    final FileOutputStream outputStream = context.openFileOutput("image", Context.MODE_PRIVATE);

    byte buf[] = new byte[1024];
    int len;
    while ((len = inputStream.read(buf)) > 0) {
        outputStream.write(buf, 0, len);
    }

    outputStream.close();
    inputStream.close();

    imageFile = new File(context.getFilesDir().getPath() + "/image");
}

if (!imageFile.exists()) {
    throw new IOException("couldn't find file");
}

final Uri uri = Uri.fromFile(imageFile);
context.grantUriPermission(shareToPackage, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

final Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/png");
intent.putExtra(Intent.EXTRA_TEXT, "here's the image");
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setPackage(shareToPackage);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(intent);

由于无法访问我在其他应用程序中获取的文件,因此上述内容不起作用:

java.io.FileNotFoundException:FILE_PATH:打开失败:EACCES(权限被拒绝)

知道我在这里做错了什么吗?
谢谢。

4

2 回答 2

3

去掉 中的path属性<files-path>,因为这里不需要它,因为您从getFilesDir().

File创建对象时不要使用字符串连接。代替:

new File(context.getFilesDir().getPath() + "/image.png");

和:

new File(context.getFilesDir().getPath(), "image.png");

最重要的是,不要使用Uri.fromFile(). 使用FileProvider.getUriForFile(). 就目前而言,您正在完成所有这些工作以进行设置FileProvider,然后您不使用FileProvider使内容可用于其他应用程序。

或者,摆脱所有这些,并使用 myStreamProvider,它可以直接提供原始资源。

或者,编写您自己ContentProvider的直接服务原始资源的代码。

于 2016-08-03T12:05:07.623 回答
0

@nitzan-tomer,见https://stackoverflow.com/a/33031091/966789

什么是运行时权限?

在 Android 6.0 Marshmallow 中,Google 引入了一种新的权限模型,让用户可以更好地理解为什么应用程序可能会请求特定权限。与用户在安装时盲目接受所有权限不同,现在会提示用户接受在应用程序使用期间需要的权限。

于 2017-12-11T06:29:55.640 回答