ไม่สามารถรับรหัสอุปกรณ์ใน Xamarin Froms สำหรับ Android เวอร์ชัน 9.0 (API ระดับ 28 - พาย)

ในแอปพลิเคชันของฉัน ฉันจำเป็นต้องได้รับรหัสอุปกรณ์ ฉันใช้สิ่งต่อไปนี้:

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

ทุกอย่างเป็นเรื่องปกติเมื่อฉันตั้งค่า Target Android version เป็น Android 8.0 (API ระดับ 26 - Oreo) หรือเวอร์ชันที่ต่ำกว่า อย่างไรก็ตาม เมื่อฉันต้องการอัปเดตแอปพลิเคชันของฉัน Google Play ระบุว่า Target Android version ต้องเป็น Android 9.0 (API ระดับ 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 จะใช้รหัสต่อไปนี้เพื่อรับ Id (สำหรับ 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