2016-04-29 82 views
1

我试图接受图像与我的应用程序发送到服务器。设置意图过滤器非常简单,它就像一个魅力。我似乎无法弄清楚的事情是我需要从意图中的uri中检索文件路径的方式。从操作收到的意图发送在URI上产生SecurityException

我收到我的活动意图与此过滤器

<intent-filter> 
    <action android:name="android.intent.action.SEND" /> 
    <action android:name="android.intent.action.SEND_MULTIPLE" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <data android:mimeType="image/jpeg" /> 
    <data android:mimeType="image/png" /> 
    <data android:mimeType="image/gif" /> 
</intent-filter> 

通过尝试处理URI通过调用takePersistableUriPermission(URI,modeFlags)来获取文件路径我得到这个错误:

java.lang.SecurityException: No persistable permission grants found for UID 10098 and Uri 0 @ content://media/external/images/media/124 

我使用的逻辑适用于从我的应用程序中请求图像,但从应用程序外部接收意图会产生错误。

KitKat及以上:

final int flags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
    final String[] imageColumns = {MediaStore.Images.Media.DATA}; 
    getActivity().getContentResolver().takePersistableUriPermission(uri, flags); 
    String id = uri.getLastPathSegment().split(":")[1]; 
    Cursor imageCursor = context.managedQuery(getStorageUri(), imageColumns, MediaStore.Images.Media._ID + "=" + id, null, null); 
+0

您是否在Android 6.0及以上版本发生了此错误? –

+0

因为你设置了android:exported =“false”,这意味着其他进程无法访问这个Activity。所以你把它设置为true,并做同样的事情,它不会崩溃 –

+0

@SanjayKakadiya没有kitkat和以上,只是测试确定。 – SjoerdvGestel

回答

0

我似乎无法弄清楚的事情是我需要检索的目的URI中的文件路径的方式。

没有“来自uri的文件路径”。 A Uri不是一个文件。

试图通过散文中的URI通过调用takePersistableUriPermission(URI,modeFlags)来获取文件路径我得到这个错误:

这只是意味着,一旦你的过程结束,你不能使用Uri

KitKat及以上:

ACTION_GET_CONTENT没有义务回到你一些Uri可以使用代码来处理。

消耗Uri,use openInputStream() on your ContentResolver标识的内容。

+0

我想你误解了我的问题。一个,我知道该URI不包含文件路径,因此我需要处理它来获取文件路径。我在这里使用了一个intent过滤器,它将从另一个发送该内容的应用程序接收一个意图,而不是'ACTION_GET_CONTENT'开始活动的结果。 – SjoerdvGestel

+1

@SjoerdvGestel:“因此我需要处理它以获取文件路径” - 您不能“处理它以获取文件路径”,除了可能使用'openInputStream()'将内容复制到某个文件控制。用户不需要选择可以通过文件系统访问的一段内容。内容可能在另一个应用程序的内部存储器上,也可能在可移动存储器上,或另一个应用程序数据库的BLOB列中,或者在需要由其他应用程序下载的“云”中。 – CommonsWare

+1

@SjoerdvGestel:同样,没有要求第三方应用程序授予您持久权限的Uri。这是由其他应用程序提供的;你不能强迫开发者提供它,而不能使用重型武器。 – CommonsWare

相关问题