【问题标题】:How can I write an Android App to get some sort of unique value?我如何编写一个 Android 应用程序来获得某种独特的价值?
【发布时间】:2019-11-12 00:47:02
【问题描述】:

我需要在我的 android 应用程序中有一些代码,以获得某种独特的价值(手机特有的价值)。我在 Visual Studio 中使用 Xamarin/C# 环境。我了解并非所有 Android 手机都会将电话号码公开给程序访问。

我目前的方法是使用 Android.Telephony.TelephonyManager 类。

Android.Telephony.TelephonyManager manager = null;
manager = activity.GetSystemService(Android.Content.Context.TelephonyService);
// [RequiresPermission("android.permission.READ_PHONE_STATE")]
imei_value = manager.Imei;
meid_value = manager. Meid;
carrier = manager.NetworkOperatorName;
country = manager.NetworkCountryIso;
sn = manager.SimSerialNumber;
initialized = true;
Log.Debug("DEBUG", "initialized phone");
Log.Debug("DEBUG", "carrier: " +  carrier);
Log.Debug("DEBUG", "country: " + country);
Log.Debug("DEBUG", "serial:  [" + sn + "]");
Log.Debug("DEBUG", "MEID:    [" + meid_value + "]");
Log.Debug("DEBUG", "IMEI:    [" + imei_value + "]");
Log.Debug("DEBUG", "MEID(2): [" + manager.GetMeid(0) + "]");
Log.Debug("DEBUG", "IMEI(2): [" + manager.GetImei(0) + "]");
Log.Debug("DEBUG", "phone:   [" + manager.Line1Number + "]");

这是调试器生成的:

11-11 17:00:45.690 D/DEBUG   (24041): initialized phone
11-11 17:00:45.691 D/DEBUG   (24041): carrier: Verizon
11-11 17:00:45.691 D/DEBUG   (24041): country: us
11-11 17:00:45.691 D/DEBUG   (24041): serial:  []
11-11 17:00:45.691 D/DEBUG   (24041): MEID:    []
11-11 17:00:45.691 D/DEBUG   (24041): IMEI:    []
11-11 17:00:45.694 D/DEBUG   (24041): MEID(2): []
11-11 17:00:45.698 D/DEBUG   (24041): IMEI(2): []
11-11 17:00:45.703 D/DEBUG   (24041): phone:   [xxx866xxxx]

我正在测试的手机是 Google Pixel 3

【问题讨论】:

  • 您能解释一下为什么需要使用“手机独有的”ID吗?通常,仅当“[移动] 运营商相关功能需要它”时,才适合使用硬件 ID。 (特别是关于 IMEI,请参阅 RFC 7254 的第 8 节;请注意,IMEI 和序列号尤其不适用于识别用户,因为设备可以将所有权从一个用户更改为另一个用户。)
  • 我听说,一般来说,manager.Line1Number 不能保证提供一个号码(如果电话号码不在 SIM 卡上)。我可以要求用户提供他/她的电话号码 - 但随后需要相信用户在她/他的条目中是准确/诚实的。我需要一种识别手机的备份方法。

标签: c# android xamarin serial-number imei


【解决方案1】:

我需要在我的 android APP 中有一些代码,以获得某种独特的价值(手机独有的价值)。

一种方式,您可以使用 TelephonyManager.DeviceId 属性来获取设备 ID。

 Android.Telephony.TelephonyManager manager = (Android.Telephony.TelephonyManager)this.ApplicationContext.GetSystemService(Context.TelephonyService);

            string deviceIde = manager.DeviceId;

另一种方式,你可以得到android.OS.Build.SERIAL,它是独一无二的。但请注意,它仅在 API 级别 9 中添加,并且可能不会出现在所有设备上。要在早期平台上获得唯一 ID,您需要读取 MAC 地址或 IMEI 等信息。

string id= Android.OS.Build.Serial;

通常,请尝试阅读所有可能的 ID,并使用可用的 ID。有关guidance,请参阅本文。

如果我的回复对你有帮助,请记得将我的回复标记为答案,谢谢。

【讨论】:

  • manager.DeviceId 已被弃用。但是 Android.OS.Build.Serial 代表了一种对我来说是新闻的可能性!我会试一试,然后发布结果。
  • 以下是结果: 11-13 16:00:42.742 D/DEBUG (32219):初始化电话 11-13 16:00:42.742 D/DEBUG (32219):运营商:Verizon 11- 13 16:00:42.742 D/DEBUG (32219):国家:美国 11-13 16:00:42.742 D/DEBUG (32219):序列号:[未知] 11-13 16:00:42.756 D/DEBUG (32219) : 串行[2]: [] 11-13 16:00:42.756 D/DEBUG (32219): IMEI: [] 11-13 16:00:42.761 D/DEBUG (32219): MEID(2): [] 11 -13 16:00:42.771 D/DEBUG (32219): IMEI(2): [] 11-13 16:00:42.781 D/DEBUG (32219): phone: [xxx866xxx] Build.Serial 的结果是字符串“未知”
  • @Gary,虽然 manager.DeviceId 已被弃用,但我也可以从中获得价值。我不确定你的第二次回复。对于 Android.OS.Build.Serial,它可能不会出现在所有设备上。
猜你喜欢
  • 2021-01-21
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多