Не удается получить идентификатор устройства в Xamarin Froms для Android версии 9.0 (уровень API 28 — Pie)

В моем приложении мне нужно получить идентификатор устройства. Я использую следующее:

var DeviceId=Resolver.Resolve<IDevice>().Id;

Все было нормально, когда я установил Target Android version на Android 8.0 (уровень API 26 - Oreo) или более ранние версии. Однако, когда я хочу обновить свое приложение, Google Play указал, что Target Android version должен быть Android 9.0 (API level 28 - Pie). Поэтому, когда я меняю Target Android version, я получаю значение unknown для идентификатора устройства.

В чем проблема?


person Ahmed Shamel    schedule 28.11.2019    source источник
comment
Можете ли вы поделиться кодом, где вы на самом деле получаете этот идентификатор устройства? Нативный внедренный код в основном   -  person FreakyAli    schedule 28.11.2019
comment
Вы можете использовать приведенный ниже код, чтобы получить идентификатор устройства. Android.Provider.Settings.Secure.GetString(Android.App.Application.Context.ContentResolver, Android.Provider.Settings.Secure.AndroidId); Если вы хотите узнать, что не так с вашим кодом, поделитесь с нами дополнительным кодом для тестирования.   -  person Wendy Zang - MSFT    schedule 29.11.2019


Ответы (2)


У меня была такая же проблема, и я решил ее следующим образом:

В моем файле MainActivity.cs я определил

public static ContentResolver myContentResolver;

и установите его значение в методе OnCreate

protected override void OnCreate(Bundle bundle)
{
    TabLayoutResource = Resource.Layout.Tabbar;
    ToolbarResource = Resource.Layout.Toolbar;
    base.OnCreate(bundle);

    global::Xamarin.Forms.Forms.Init(this, bundle);
    LoadApplication(new App());

    // Getting ContentResolver instance
    myContentResolver = this.ContentResolver;
}

А потом мой GetDeviceId

public String GetDeviceId()
{

    String deviceID = Android.OS.Build.Serial?.ToString();

    if (String.IsNullOrEmpty(deviceID) || deviceID.ToUpper() == "UNKNOWN") // Android 9 returns "Unknown"
    {

        ContentResolver myContentResolver = MyApp.Droid.MainActivity.myContentResolver;

        deviceID = Android.Provider.Settings.Secure.GetString(myContentResolver, Android.Provider.Settings.Secure.AndroidId);

    }


    return deviceID;

}
person Deczaloth    schedule 30.11.2019
comment
Спасибо, но мне нужен идентификатор оборудования (серийный номер оборудования). - person Ahmed Shamel; 03.12.2019

Кажется, что XLabs.Forms использует следующий код для получения идентификатора (для Android):

Build.Serial;

В Android 8 (SDK 26) и более поздних версиях в этом поле будет возвращено значение UNKNOWN, и доступ к нему должен осуществляться с помощью:

Build.getSerial();

для которого требуется опасное разрешение android.permission.READ_PHONE_STATE.

Подробнее: Android: как программно получить доступ к серийному номеру устройства, отображаемому в диспетчере AVD (API версии 8)

person Ahmed Shamel    schedule 02.12.2019