我正在尝试传递一个位于我的应用程序的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(权限拒绝)
知道我做错了什么吗<谢谢。
@尼赞·托默,见https://stackoverflow.com/a/33031091/966789
什么是运行时权限?
借助Android 6.0 Marshmallow,谷歌引入了一种新的权限模型,使用户可以更好地理解应用程序可能会请求特定权限的原因。与用户在安装时盲目接受所有权限不同,现在会提示用户在应用程序使用期间接受必要的权限。
去掉中的
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