Xamarin Android无法重新访问共享文件

时间:2019-05-28 12:31:22

标签: xamarin xamarin.android permissions

TL; DR ...

我如何重新访问已与Xamarin Android应用程序共享的文件,该文件可以进行首次共享,但是当我尝试稍后再访问它们时出现权限异常?


我正在编写我的第一个Xamarin Android(非Forms )应用程序,希望能够“共享”照片以及“添加”照片。

“共享”是指您打开图库,选择一张或多张照片,然后通过Intent.ActionSendIntent.ActionSendMultiple将它们共享到我的应用中。

“添加”是指您在应用程序中单击一个按钮,该按钮可让您通过Intent.ActionOpenDocument添加照片。

我已经能够使用以下命令(从this answer获取)对通过ActionOpenDocument添加的图像设置“持久权限” ...

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    if ((requestCode == c_addPhoto) && (resultCode == Result.Ok) && (data != null))
    {
        Uri uri = data.Data;
        if (Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat)
            ContentResolver.TakePersistableUriPermission(uri, ActivityFlags.GrantReadUriPermission);
        AddToList(uri);
    }
}

这有效,当我重新打开应用程序时,使用诸如...的Uri值访问图像。

 content://com.android.providers.media.documents/document/image%3A2122

我的问题是能够访问通过Intent.ActionSend传递的Uri所在的Intent.ActionSendMultipleIntent.ClipData.Item共享的图像以下格式...

 content://media/external/images/media/1998

如果我将TakePersistableUriPermission传递到应用程序后在Uri上运行,则会收到以下异常...

  

Java.Lang.SecurityException:未找到针对UID 10254和Uri content:// media / external / images / media / 1998 [user 0]的持久权限授予

如果我尝试访问Uri,则会收到以下异常...

  

拒绝权限:从pid = 4042读取com.android.providers.media.MediaProvider uri content:// media / external / images / media / 1998,uid = 10254需要android.permission.READ_EXTERNAL_STORAGE或grantUriPermission()< / p>

但是我在我的AndroidManifest.xml文件中具有以下内容...

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  • 如何授予文件访问权限?
  • 还是我需要将Uri从content://media...转换为content://com.android...格式?如果是,怎么办?

1 个答案:

答案 0 :(得分:0)

您是否已通过Android解决方案中的File / Content Provider实现? 这是我为Xamarin Forms应用程序回答的问题,尽管对于Xamarin Android应该是相同的,因为您需要在Android平台特定项目中为File Provider做的所有事情: File Download in Xamarin forms

Android自Api 22版起定义了文件/内容提供程序,这意味着如果您的应用程序在该版本上运行或更高版本,则必须定义文件提供程序才能使您的应用程序能够共享文件。

这是官方页面https://developer.android.com/reference/android/support/v4/content/FileProvider