【问题标题】:Intent recieved from action send generates SecurityException on URI从操作发送接收到的意图在 URI 上生成 SecurityException
【发布时间】:2016-04-29 12:00:52
【问题描述】:

我正在尝试使用我的应用程序接受图像以将它们发送到服务器。设置意图过滤器很简单,而且效果很好。我似乎无法弄清楚的是我需要从意图中的 uri 检索文件路径的方式。

我使用此过滤器收到有关我的活动的意图

<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);

【问题讨论】:

  • 您是否在 Android 6.0 及更高版本中遇到此错误?
  • 因为你设置了 android:exported="false" 这意味着其他进程无法访问这个 Activity。因此,您将其设置为 true 并执行相同操作,它不会崩溃
  • @SanjayKakadiya no kitkat 及以上,只是经过测试确定。
  • 请看这个link
  • @DaminiMehra 我已将 android:exported="true" 添加到具有上述意图过滤器但没有任何改变的活动中

标签: android android-intent securityexception


【解决方案1】:

我似乎无法弄清楚的是我需要从意图中的 uri 检索文件路径的方式。

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

通过尝试使用 uri 获取文件路径,我通过调用 takePersistableUriPermission(uri, modeFlags) 得到此错误:

这意味着一旦你的进程结束,你就不能使用Uri

Kitkat 及以上:

ACTION_GET_CONTENT 没有义务向您返回一些可以使用该代码处理的Uri

消费Uriuse openInputStream() on your ContentResolver标识的内容。

【讨论】:

  • 我猜你误解了我的问题。一方面,我知道 URI 不包含文件路径,因此我需要处理它以获取文件路径。我在这里使用了一个意图过滤器,它将接收来自另一个应用程序的意图,该应用程序发送该内容,而不是ACTION_GET_CONTENT 并带有开始活动的结果。
  • @SjoerdvGestel:“因此我需要处理它以获取文件路径”-您不能“处理它以获取文件路径”,除了可能使用 openInputStream() 复制内容到您控制的某个文件。用户无需选择可以通过文件系统访问的内容。内容可能在另一个应用程序的内部存储中,或在可移动存储上,或在另一个应用程序数据库的 BLOB 列中,或在需要由另一个应用程序下载的“云”中。
  • @SjoerdvGestel:同样,第三方应用程序不需要授予您对该Uri 的持久权限。这取决于提供的其他应用程序;你不能强迫开发者提供它,除非使用重型武器。
  • 谢谢!我已经从我的应用程序内的展位和意图过滤器中比较了 uri,并且存在差异。这就是我认为展位相同的问题。
  • 是的 getActivity().getContentResolver().takePersistableUriPermission(uri, flags);根本不需要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2012-11-17
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
相关资源
最近更新 更多