当前位置: 首页 > 知识库问答 >
问题:

与FileProvider共享原始文件夹中的文件

勾通
2023-03-14

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

我遵循了FileProvider文档中描述的流程,下面是我的代码:

Androidanifest.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(权限拒绝)

知道我做错了什么吗<谢谢。

共有2个答案

管和志
2023-03-14

@尼赞·托默,见https://stackoverflow.com/a/33031091/966789

什么是运行时权限?

借助Android 6.0 Marshmallow,谷歌引入了一种新的权限模型,使用户可以更好地理解应用程序可能会请求特定权限的原因。与用户在安装时盲目接受所有权限不同,现在会提示用户在应用程序使用期间接受必要的权限。

盖昀
2023-03-14

去掉中的path属性

创建文件对象时不要使用字符串连接。替换:

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

使用:

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

最重要的是,不要使用Uri。fromFile()。使用FileProvider。getUriForFile()。目前,您正在完成所有这些工作,以设置文件提供程序,然后不使用文件提供程序将内容提供给其他应用程序

或者,摆脱所有这些,使用我的StreamProvider,它可以直接为原始资源提供服务。

或者,编写自己的内容提供者,直接为原始资源提供服务。

 类似资料:
  • 我正在尝试使用内容提供程序共享我的内部日志文件。我有以下

  • 但是,执行这一行给了我(为了保护无辜者而改变了名字): 应用程序A在清单文件中有以下内容: filePaths.xml具有: 文件最终的实际路径是: 在这一点上,我被难住了。我不知道为什么不能授予我在同一个应用程序中创建的文件的权限。所以我的问题是:为什么我会得到这个异常,我如何才能成功地授予应用程序B的权限?

  • 我正在尝试做一个应用程序,共享的孩子是在应用程序的“原始”文件夹,但我没有得到它。该文件是共享的,但没有.mp3扩展名。我无法收听Windows Media Player,但我手动放了一个.mp3扩展名。有没有人知道我是怎么做到的。mp3扩展自动?将URI转换/重命名为mp3文件。 歌曲的名字是在文件中注册的,我相信,如果有可能重命名添加.mp3在最后可能会起作用。但我不能重命名。 我正在使用以下

  • 我有一个音频文件的回收视图,该音频文件存储在原始文件夹中。现在,我想与其他应用程序共享我的音频文件。我正在适配器clss中尝试此代码。 但它不起作用。如何解决这个问题。 提前谢谢。

  • 我想用SharingContent将声音从原始文件夹共享到另一个应用程序 我使用此代码共享文本和字符串

  • 我有一个经过验证的谷歌客户端,我想列出其他人公用文件夹中的文件(我认为共享或不共享的文件夹是不相关的,因为它是公用的) 这是我在NodeJS中的代码 注意:文档中没有“folderId”选项:https://developers.google.com/drive/api/v3/reference/files/list-只是一个drivid选项 虽然我将corpa设置为“drive”和drive I