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

Xamarin 表单应用需要在 AndroidManifest

如何解决Xamarin 表单应用需要在 AndroidManifest

我在 Xamarin Forms 应用中遇到了一个非常奇怪的问题。我正在尝试在我的应用程序中拍照,然后使用 OCR 阅读文本,但我正在努力获得授予 WRITE_EXTERNAL_STORAGE 的权限。我现在必须在我的 AndroidManifest 中声明 WRITE_EXTERNAL_STORAGE 两次,以便应用允许我请求存储权限或访问存储,一次作为自关闭标签,一次使用显式标签

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

如果其中一个删除(只留下一个版本的 WRITE_EXTERNAL_STORAGE),我在尝试请求外部存储权限或尝试捕获图片时会收到以下异常:“您需要声明使用权限: android.permission.WRITE_EXTERNAL_STORAGE 在您的 AndroidManifest.xml 中”

这只会影响 WRITE_EXTERNAL_STORAGE...清单中所有其他声明的权限(使用自关闭标签)正常工作。只是写存储权限需要这个“hack”。

当仅列出一个权限实例时,此问题会在模拟设备(调试模式)和物理设备(通过 Play 商店 alpha 轨道)上发生。使用清单中的两行进行调试时,应用程序能够成功获取存储权限,我可以按预期拍照。 Play 商店将不接受清单中包含重复行的提交,因此我无法使用此“hack”向商店提交。

这是我的 AndroidManifest 的完整副本(没有 PII),包括我必须包含的重复行,以便在调试时成功授予存储权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="myapp" android:versionName="3.2.2" android:installLocation="auto" android:versionCode="59">
    <application android:theme="@android:style/Theme.Material.Light" android:icon="@drawable/Icon120" android:label="MyApp">
        <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.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>
    <uses-feature android:name="android.hardware.camera" android:required="true" />
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
</manifest>

我的 AssemblyInfo.cs 文件中还有以下行:

[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]

当我尝试通过 Xamarin.Essentials 请求权限或通过 Xamarin.Essentials 或 CrossMedia 访问相机以拍摄照片时,应用程序因上述异常而崩溃,声称我缺少 WRITE_EXTERNAL_STORAGE 权限,尽管它出现在清单中一次(自我关闭或带有显式标签)。执行这些行中的任何一行都将导致异常,并且当 WRITE_EXTERNAL_STORAGE 的两个条目都存在时,所有行都可以工作:

var permissionStatus = await Xamarin.Essentials.Permissions.RequestAsync<Xamarin.Essentials.Permissions.StorageWrite>();
var photo = await Xamarin.Essentials.MediaPicker.CapturePhotoAsync(new Xamarin.Essentials.MediaPickerOptions { Title = DateTime.Now.ToString("G") + ".jpg" });
var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions { Name = DateTime.Now.ToString("G") + ".jpg" });

我已尝试更新我的所有 NuGet 包,现在使用的是该应用程序框架的最新版本(Xamarin Forms v5 和 Xamarin.Essentials 1.6.1),但此问题仍然存在。我也尝试完全删除清单并从头开始,但仍然需要相同的“hack”。

有没有人遇到过这个问题或者知道如何解决这个问题?

先谢谢你!

解决方法

对于遇到此问题的任何人,解决方案是删除对 HockeySDK.Xamarin 的 NuGet 包的所有引用并卸载该包。一旦我删除了与此相关的所有内容,问题就会自行解决,我不再遇到清单问题

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