MAUI之Android记录设备号+动态授权

发布时间 2023-04-14 20:02:22作者: cnblogs_小A

一、获取Android唯一标识的方法

android10以前的版本可以通过获取imei得到设备的唯一标识,但是android10以后的系统已无法获取到imei。那么我们该如何确定设备呢?
查阅了一些资料,个人看来下面的方法最为稳妥:

通过在app外部保存一个guid,每次打开app时读取该guid确定为设备号。
保存在app外部,可以防止重新安装app导致guid被清除。

具体代码:

/// <summary>
/// 机器码帮助类
/// </summary>
public class JQMHelper
{
    /// <summary>
    /// 获取机器码
    /// </summary>
    /// <returns></returns>
    public static string GetJqm()
    {
        try
        {
            string path = System.IO.Path.Combine(GetPath(), "uuid.txt");
            return File.ReadAllText(path);
        }
        catch (Exception ex)
        {
        }
        return "";
    }

    /// <summary>
    /// 保存机器码
    /// </summary>
    /// <param name="jqm"></param>
    public static void SaveJqm(string jqm)
    {
        try
        {
            string path = System.IO.Path.Combine(GetPath(), "uuid.txt");
            File.WriteAllText(path, jqm);
        }
        catch (Exception ex)
        {
        }
        
    }

    /// <summary>
    /// 获取路径
    /// </summary>
    /// <returns></returns>
    private static string GetPath()
    {
        try
        {
#if ANDROID
            string path = "";

            if (Android.OS.Environment.IsExternalStorageEmulated)
            {
                path = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
            }
            else
            {
                path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);
            }

            Java.IO.File myDir = new Java.IO.File(path + "/myapp");

            if (!myDir.Exists())
                myDir.Mkdir();

            return path + "/myapp/";
#endif


        }
        catch (Exception ex)
        {

        }

        return "";
    }
}

调用代码:

//读取保存的机器码
string jqm = JQMHelper.GetJqm();
if (string.IsNullOrEmpty(jqm))
{
    jqm = Guid.NewGuid().ToString();
    JQMHelper.SaveJqm(jqm);
}

此时运行代码,你会发现无法读取和保存guid,什么原因?搞过android的同学肯定知道:缺少了权限。

二、动态授权

官方文档:https://learn.microsoft.com/zh-cn/dotnet/maui/platform-integration/appmodel/permissions?view=net-maui-7.0&tabs=android
直接上代码:

//写权限
            PermissionStatus status = await Permissions.CheckStatusAsync<Permissions.StorageWrite>();
            if (status != PermissionStatus.Granted)
                status = await Permissions.RequestAsync<Permissions.StorageWrite>();//弹窗求授权

            if (status != PermissionStatus.Granted)
            {
                await App.Current.MainPage.DisplayAlert("错误:", "必须给予存储访问权限!请手动给予权限后再重新登录!", "跳转到手动设置页面");

#if ANDROID
                Intent intent = new Intent(Settings.ActionApplicationDetailsSettings);
                Android.Net.Uri uri = Android.Net.Uri.FromParts("package", AppInfo.Current.PackageName, null);
                intent.SetData(uri);
                Android.App.Application.Context.StartActivity(intent);
#endif
                return;
            }

总结

至此完成。
大家是否看出了MAUI的最大优势?

可以直接调用原生API

希望对大家有所帮助。