微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xamarin.Forms Android 在将图像保存到设备库时获取访问被拒绝异常而未在设备中启用存储权限 说明代码预期行为实际行为基本信息

如何解决Xamarin.Forms Android 在将图像保存到设备库时获取访问被拒绝异常而未在设备中启用存储权限 说明代码预期行为实际行为基本信息

说明

将图像保存到设备库时,在设备获取访问被拒绝异常中未启用存储权限但在 AndroidManifest.xml 中设置读写存储权限时。

代码

AndroidManifest.xml

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
           ...

[C#]

var file = new Java.IO.File(
 OS.Environment.GetExternalStoragePublicDirectory(OS.Environment.DirectoryPictures)
   .ToString());

var filePath = System.IO.Path.Combine(file.ToString(),"Image" + 
  DateTime.Now.ToString("yyyyMMddHHmmssfff") + "." + format);

 var save = new Runnable(() =>
            {
                using (var fileStream = new FileStream(filePath,FileMode.CreateNew))
                {
                        bitmap?.Compress(Bitmap.CompressFormat.Png,97,fileStream);
                    
                }
                ...
            });

预期行为

必须在设备图库中保存图像,而无需在设备中启用存储权限。

实际行为

保存图像时获取拒绝访问异常

基本信息

VS 2019 测试设备:联想A7010a48 XF 版本:4.8

解决方法

您可以使用 nuget Xam.Plugin.Media 来实现此功能,这是一个简单的跨平台插件,用于拍摄照片和视频或从共享代码的图库中选择它们。

可以参考以下xamarin形式的代码:

    private async void BtnCam_Clicked(object sender,EventArgs e)
    {
        try
        {
            
            var photo = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions()
            {
                DefaultCamera = Plugin.Media.Abstractions.CameraDevice.Rear,Directory = "Xamarin",SaveToAlbum = true
            });
            
            if (photo != null)
                imgCam.Source = ImageSource.FromStream(() => { return photo.GetStream(); });

        }
        catch (Exception ex)
        {
            await DisplayAlert("Error",ex.Message.ToString(),"Ok");
        }
    }

注意:这里我们可以将参数SaveToAlbum 设置为true,这样图片就会保存到图库中。

在android平台,我们应该添加permissionFileProvider如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.parallelcodes.XamCam" android:installLocation="preferExternal">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application android:label="XamCam">
        <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.parallelcodes.XamCam.fileprovider" android:exported="false" android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>
        </provider>
    </application>
</manifest>

注意:文件 file_paths 是文件夹 Resources/xml 中的文件。

file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
  <external-files-path name="my_images" path="Pictures" />
  <external-files-path name="my_movies" path="Movies" />
</paths>

注意:

1.更多详细信息,您可以在浏览器中输入关键字Xamarin Forms – Using Camera and Save Image to Gallery查找相关文章,上面文章中也有完整的样本。

2.有关 MediaPlugin的更多信息,您可以查看:https://github.com/jamesmontemagno/MediaPlugin

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。