【问题标题】:Xamarin Android cannot re-access shared filesXamarin Android 无法重新访问共享文件
【发布时间】:2019-05-29 01:43:03
【问题描述】:

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.ActionSendIntent.ActionSendMultiple 共享的图像,其中通过Intent.ClipData.Item 传递的Uri 采用以下格式...

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

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

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

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

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

但我确实在我的AndroidManifest.xml 文件中有以下内容...

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

【问题讨论】:

    标签: xamarin xamarin.android permissions


    【解决方案1】:

    您是否在您的 Android 解决方案中完成了文件/内容提供程序的实施? 这是我为 Xamarin Forms 应用程序回答的一个问题,尽管它对于 Xamarin Android 应该是相同的,因为您需要为 File Provider 做的所有事情都将在 Android 平台特定项目中做: File Download in Xamarin forms

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

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

    【讨论】:

    • 非常感谢 - 我现在没有时间回到这个问题(这是一个个人项目),但我会在我试一试时告诉你
    猜你喜欢
    • 1970-01-01
    • 2017-12-16
    • 2021-12-27
    • 2019-08-18
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多