android Build.GetSerial() 抛出异常 [英] android Build.GetSerial() throwing exception

查看:22
本文介绍了android Build.GetSerial() 抛出异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个 Xamarin.Android 项目,我需要在其中获取设备序列号.

我已经按照下面显示的方式实现了它.还添加了清单文件中的权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>字符串序列;if (Build.VERSION.SdkInt >= BuildVersionCodes.O){串行 = Build.GetSerial();}别的{序列 = Build.Serial;}

我已经在两种不同的设备(都是 android 9.0)上尝试过.遗憾的是,当调用 GetSerial() 函数时出现以下异常(华为 p10):Java.Lang.SecurityException: <Timeout exceeded getting异常详情>.

在其他设备(galaxy s8)上,我收到此异常:

<块引用>

Java.Lang.SecurityException: getSerial 需要 READ_PHONE_STATE 或READ_PRIVILEGED_PHONE_STATE 权限

我真的不明白问题是什么,因为我已经在清单中添加了这两个权限,异常说...知道我做错了什么吗?

解决方案

您应该面临权限问题.并且由于 Android Marshmallow,您需要向用户询问权限.除了在android manifest文件中添加权限,你还可以像这样添加运行时权限:

static readonly int REQUEST_PHONE_STATE = 1;公共无效检查权限(){Log.Info(TAG, "检查权限.");//检查权限是否已经可用.if (ActivityCompat.CheckSelfPermission(this, Manifest.Permission.ReadPhoneState) != (int)Permission.Granted){//权限没有被授予RequestPhoneStatePermission();}别的{//权限已经可用,显示相机预览.Log.Info(TAG, "权限已经被授予.");获取信息();}}

方法 RequestPhoneStatePermission

 private void RequestPhoneStatePermission(){Log.Info(TAG, "PhoneState 权限尚未被授予.请求权限.");if (ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.ReadPhoneState)){Log.Info(TAG, "显示 PhoneState 权限理由以提供额外的上下文.");Snackbar.Make(layout, Resource.String.permission_phonestate_rationale,Snackbar.LengthIndependent).SetAction(Resource.String.ok, new Action(delegate (View obj) {ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.ReadPhoneState }, REQUEST_PHONE_STATE);})).展示();}别的{//尚未授予 PhoneState 权限.直接索取.ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.ReadPhoneState }, REQUEST_PHONE_STATE);}}

方法 OnRequestPermissionsResult

 public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults){如果(请求代码 == REQUEST_PHONE_STATE){//接收到相机权限的权限结果.Log.Info(TAG, "收到手机状态权限请求的响应.");//检查是否已授予唯一必需的权限if (grantResults.Length == 1 && grantResults[0] == Permission.Granted){//已授予摄像头权限,可以显示预览Log.Info(TAG, "phonestate 权限已被授予.显示预览.");Snackbar.Make(layout, Resource.String.permission_available_phonestate, Snackbar.LengthShort).Show();获取信息();}别的{Log.Info(TAG, "phonestate 权限未被授予.");Snackbar.Make(layout, Resource.String.permissions_not_granted, Snackbar.LengthShort).Show();}}别的{base.OnRequestPermissionsResult(requestCode, permissions, grantResults);}}

方法 getInfo

private void getInfo() {字符串序列;if (Build.VERSION.SdkInt >= BuildVersionCodes.O){串行 = Build.GetSerial();}别的{序列 = Build.Serial;}Log.Info(TAG, "serial = " + serial);}

有关更多详细信息,您可以查看:https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/permissions?tabs=windows

https://devblogs.microsoft.com/xamarin/requesting-runtime-permissions-in-android-marshmallow/

I'm developing a Xamarin.Android project,where I need to get the Device Serial number.

I have implemented it the way it is shown below. Also added the permissions in the manifest file:

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

string serial;
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
     serial = Build.GetSerial();
}
else
{
     serial = Build.Serial;
}

I have tried it on two different devices(both android 9.0).Sadly i get the following exception when the GetSerial() function is called(huawei p10): Java.Lang.SecurityException: <Timeout exceeded getting exception details> .

On an other device(galaxy s8) I get this exception:

Java.Lang.SecurityException: getSerial requires READ_PHONE_STATE or READ_PRIVILEGED_PHONE_STATE permission

I really dont understand what the problem is,because I have added both permissions in the manifest,which the exception sais... Any idea what am I doing wrong?

解决方案

You should faced a persmission issue. And since Android Marshmallow, you need to ask the user for the permissions. Besides adding the permission in android manifest file, you can also add runtime permissions like this:

static readonly int REQUEST_PHONE_STATE = 1;

public void checkPermission()
    {
        Log.Info(TAG, "Checking permission.");

        // Check if the  permission is already available.
        if (ActivityCompat.CheckSelfPermission(this, Manifest.Permission.ReadPhoneState) != (int)Permission.Granted)
        {

            //  permission has not been granted
            RequestPhoneStatePermission();
        }
        else
        {
            //  permissions is already available, show the camera preview.
            Log.Info(TAG, " permission has already been granted.");
            getInfo();
        }
    }

Method RequestPhoneStatePermission

 private void RequestPhoneStatePermission()
    {
        Log.Info(TAG, "PhoneState permission has NOT been granted. Requesting permission.");

        if (ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.ReadPhoneState))
        {
            Log.Info(TAG, "Displaying PhoneState permission rationale to provide additional context.");

            Snackbar.Make(layout, Resource.String.permission_phonestate_rationale,
                Snackbar.LengthIndefinite).SetAction(Resource.String.ok, new Action<View>(delegate (View obj) {
                    ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.ReadPhoneState }, REQUEST_PHONE_STATE);
                })).Show();
        }
        else
        {
            // PhoneState permission has not been granted yet. Request it directly.
            ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.ReadPhoneState }, REQUEST_PHONE_STATE);
        }
    }

Method OnRequestPermissionsResult

   public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
    {
        if (requestCode == REQUEST_PHONE_STATE)
        {
            // Received permission result for camera permission.
            Log.Info(TAG, "Received response for phone state permission request.");

            // Check if the only required permission has been granted
            if (grantResults.Length == 1 && grantResults[0] == Permission.Granted)
            {
                // Camera permission has been granted, preview can be displayed
                Log.Info(TAG, "phonestate permission has now been granted. Showing preview.");
                Snackbar.Make(layout, Resource.String.permission_available_phonestate, Snackbar.LengthShort).Show();

                getInfo();

            }
            else
            {
                Log.Info(TAG, "phonestate permission was NOT granted.");
                Snackbar.Make(layout, Resource.String.permissions_not_granted, Snackbar.LengthShort).Show();
            }
        }
        else
        {
            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

method getInfo

private void getInfo() {
        string serial;
        if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
        {
            serial = Build.GetSerial();
        }
        else
        {
            serial = Build.Serial;
        }

        Log.Info(TAG, "serial = " + serial);
    }

Here is a full demo, you can check it.

After that, you can get the effect:

For more details,you can check: https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/permissions?tabs=windows

https://devblogs.microsoft.com/xamarin/requesting-runtime-permissions-in-android-marshmallow/

这篇关于android Build.GetSerial() 抛出异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆