Xamarin.Forms在Android 10 API29工业设备上免用户交互获取存储权限
Android 10(API 29)Xamarin.Forms应用免交互获取存储权限方案
针对工业非公开环境的特殊场景,有以下几种无需用户每次授权弹窗的解决方案:
1. 利用应用专属存储(最推荐)
Android 10及以上版本中,应用默认拥有自己专属存储目录的读写权限,无需申请READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限,也不会触发授权弹窗。
在Xamarin.Forms中,你可以通过依赖服务获取Android端的专属存储路径:
- 内部存储路径:
Context.FilesDir.AbsolutePath - 外部存储专属路径:
Context.GetExternalFilesDir(null).AbsolutePath
所有应用相关的文件都存储到这些目录下,完全不需要权限请求,直接读写即可。
2. 设置应用为设备所有者/配置文件所有者
工业环境的设备通常由企业统一管理,可通过MDM(移动设备管理)工具或adb命令将应用设置为设备所有者,从而静默授予存储权限,无需用户交互。
步骤如下:
- 在Xamarin.Android项目中创建一个继承自
DeviceAdminReceiver的广播接收器:
[BroadcastReceiver(Exported = true, Name = "com.your.app.package.DeviceOwnerReceiver")] [MetaData("android.app.device_admin", Resource = "@xml/device_admin_receiver")] public class DeviceOwnerReceiver : DeviceAdminReceiver { }
- 在
Resources/xml目录下创建device_admin_receiver.xml配置文件:
<device-admin xmlns:android="http://schemas.android.com/apk/res/android"> <uses-policies> <limit-password /> <watch-login /> <reset-password /> <force-lock /> <wipe-data /> </uses-policies> </device-admin>
- 通过adb命令将应用设置为设备所有者(需设备未添加用户账户):
adb shell dpm set-device-owner com.your.app.package/.DeviceOwnerReceiver
设置完成后,应用可通过设备所有者权限静默获取存储权限。
3. Root设备下直接授予权限
如果工业设备已获取root权限,可通过执行shell命令直接授予应用存储权限,无需用户交互。
在Xamarin.Android中,可通过以下代码执行授权命令(需root权限):
var process = Java.Lang.Runtime.GetRuntime().Exec("su"); var outputStream = process.OutputStream; var writer = new OutputStreamWriter(outputStream); writer.WriteLine("pm grant com.your.app.package android.permission.READ_EXTERNAL_STORAGE"); writer.WriteLine("pm grant com.your.app.package android.permission.WRITE_EXTERNAL_STORAGE"); writer.Flush(); writer.Close(); outputStream.Close(); process.WaitFor();
注意:此方法仅适用于已root的设备,且需确保应用拥有root执行权限。
4. 存储访问框架(SAF)持久授权
如果必须访问公共存储目录,可使用SAF让用户一次性授权某个目录,后续应用启动时可直接访问该目录,无需再次弹窗。
首次授权时引导用户选择目标目录,授权成功后保存Uri和权限标记,后续通过ContentResolver直接操作该目录即可,无需重复请求权限。不过此方法需要一次用户交互,但后续无需再操作。
内容的提问来源于stack exchange,提问作者DumbestGuyOnSaturn
相关产品推荐
相关产品推荐

