如何找到Android设备的序列号?
问题的出现原因是作者想要找到Android设备的序列号,但是通过隐藏的Android API找到的序列号与使用android.os.Build.SERIAL得到的序列号相同。作者疑惑的是,这个序列号在所有使用特定定制ROM的设备上是否相同。作者提到他使用的设备显示的序列号是01234567890ABC,这是一个使用定制ROM的手机。
解决方法是,作者在自己使用的定制ROM版本中通过两种方法都找到了正确的序列号,与制造商贴纸上的序列号相同。作者认为这可能取决于具体的定制ROM版本。然后作者询问其他人所使用的定制ROM版本。
以下是整理的
如何找到Android设备的序列号?
以下代码使用了一个隐藏的Android API来返回设备的序列号。
String serial = null;
try {
Class<?> c = Class.forName("android.os.SystemProperties");
Method get = c.getMethod("get", String.class);
serial = (String) get.invoke(c, "ro.serialno");
} catch (Exception ignored) {
}
然而,这段代码返回的序列号与使用android.os.Build.SERIAL得到的序列号相同。作者开始怀疑,这个序列号在所有使用特定定制ROM的设备上是否相同。作者自己的设备显示的序列号是01234567890ABC,这是一个使用定制ROM的手机。
幸运的是,作者在自己使用的定制ROM版本中通过两种方法都找到了正确的序列号,与制造商贴纸上的序列号相同。作者认为这可能取决于具体的定制ROM版本。为了得到更多信息,作者询问其他人所使用的定制ROM版本。
无论如何,根据以上代码,你可以找到Android设备的序列号。
如何找到Android设备的序列号?
Android开发者博客中有一篇文章涵盖了这个问题。根据Google的建议,我们可以使用ANDROID_ID来获取设备的序列号。ANDROID_ID在Android版本<=2.1或>=2.3上是可靠的,只有2.2版本存在问题。有几个制造商的设备受到了2.2版本中ANDROID_ID的错误的影响。据我所知,所有受影响的设备都有相同的ANDROID_ID,即9774d56d682e549c。Google相信,OEM已经对他们的大部分设备修复了这个问题,但我在2011年4月初仍然能够验证至少还有一些设备存在这个错误的ANDROID_ID。
根据Google的建议,我实现了一个类来为每个设备生成一个唯一的UUID。在适当的情况下,使用ANDROID_ID作为种子,如果失败,则使用TelephonyManager.getDeviceId(),如果仍然无法获取,则使用一个在应用程序重启期间持久化的随机生成的UUID。
以下是代码实现:
import android.content.Context; import android.content.SharedPreferences; import android.provider.Settings.Secure; import android.telephony.TelephonyManager; import java.io.UnsupportedEncodingException; import java.util.UUID; public class DeviceUuidFactory { protected static final String PREFS_FILE = "device_id.xml"; protected static final String PREFS_DEVICE_ID = "device_id"; protected static volatile UUID uuid; public DeviceUuidFactory(Context context) { if (uuid == null) { synchronized (DeviceUuidFactory.class) { if (uuid == null) { final SharedPreferences prefs = context .getSharedPreferences(PREFS_FILE, 0); final String id = prefs.getString(PREFS_DEVICE_ID, null); if (id != null) { uuid = UUID.fromString(id); } else { final String androidId = Secure.getString( context.getContentResolver(), Secure.ANDROID_ID); try { if (!"9774d56d682e549c".equals(androidId)) { uuid = UUID.nameUUIDFromBytes(androidId .getBytes("utf8")); } else { final String deviceId = ((TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE)) .getDeviceId(); uuid = deviceId != null ? UUID .nameUUIDFromBytes(deviceId .getBytes("utf8")) : UUID .randomUUID(); } } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } prefs.edit() .putString(PREFS_DEVICE_ID, uuid.toString()) .commit(); } } } } } public UUID getDeviceUuid() { return uuid; } }
这个类需要以下权限:
另外,某些情况下如果设备被root,可以编辑device_id.xml来更改UUID。为了更安全,建议只在必要时将UUID存储在偏好文件中,否则每次应用程序运行时重新生成UUID。此外,注意ANDROID_ID不再能够唯一标识设备。
还有人问TelephonyManager在平板电脑上是否可用,以及是否会返回null值。这个问题没有得到明确的回答,因为这取决于具体的设备。
最后,有人建议将这个类设置为final和static,以及将构造函数设置为私有。还有人指出,不同的应用程序使用这个类可能会在后备情况下获得不同的ID,因为它们读取和写入自己的本地偏好文件副本。此外,如果设备的ID是9774d56d682e549c,可能会出现空指针异常。
以上就是关于如何找到Android设备序列号的内容。
如何找到Android设备的序列号?
在Android设备上找到序列号是一个常见的需求,可以通过以下步骤实现:
1. 在Activity类中调用getSystemService方法,传入Context.TELEPHONY_SERVICE参数,获取TelephonyManager对象。
TelephonyManager tManager = (TelephonyManager)myActivity.getSystemService(Context.TELEPHONY_SERVICE);
2. 调用TelephonyManager对象的getDeviceId方法,获取设备的序列号。
String uid = tManager.getDeviceId();
这个方法将根据设备使用的无线电(GSM或CDMA)返回设备的MDN或MEID。每个设备必须返回一个唯一的值(假设是手机)。这个方法适用于任何带有SIM卡槽或CDMA无线电的Android设备。
如果在实施上遇到问题,可以尝试以下解决方法:
1. 添加权限:在AndroidManifest.xml文件中添加以下代码以获取读取手机状态的权限。
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
2. 检查官方Android开发者博客的建议:在android-developers.blogspot.com/2011/03/…找到有关使用此标识符的更多信息。
需要注意的是,这种方法适用于手机设备,但对于没有手机芯片的设备(如平板电脑)可能不起作用。从Android 2.3开始,可以使用android.os.Build.SERIAL属性来获取设备的序列号。
如果在开发政府应用程序等合法应用程序时需要获取设备的序列号,可以按照以下步骤获取权限:
1. 在Flutter项目的AndroidManifest.xml文件中添加以下代码以获取读取手机状态的权限。
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
2. 使用以下代码获取设备的序列号:
String serial = android.os.Build.SERIAL;
希望以上内容对您有所帮助!