android Build.GetSerial () выбрасывает исключение - PullRequest
0 голосов
/ 20 июня 2019

Я разрабатываю проект Xamarin.Android, где мне нужно получить серийный номер устройства.

Я реализовал это так, как показано ниже. Также добавлены разрешения в файле манифеста:

<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;
}

Я пробовал это на двух разных устройствах (оба android 9.0). К сожалению, я получаю следующее исключение, когда вызывается функция GetSerial () (huawei p10): Java.Lang.SecurityException: <Timeout exceeded getting exception details> .

На другом устройстве (galaxy s8) я получаю это исключение:

Java.Lang.SecurityException: getSerial требует READ_PHONE_STATE или READ_PRIVILEGED_PHONE_STATE разрешение

Я действительно не понимаю, в чем проблема, потому что я добавил оба разрешения в манифест, что исключение говорит ... Есть идеи, что я делаю не так?

1 Ответ

1 голос
/ 21 июня 2019

Вы должны столкнуться с проблемой разрешения.А начиная с Android Marshmallow, вам нужно спросить пользователя о разрешениях.Помимо добавления разрешения в файл манифеста Android, вы также можете добавить разрешения во время выполнения, например:

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();
        }
    }

Метод 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);
        }
    }

Метод 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);
    }

Здесь - это полная демонстрация, вы можете проверить ее.

После этого вы можете получить эффект: enter image description here

Более подробно вы можете проверить: https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/permissions?tabs=windows

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...