如何找到Android设备的序列号?

16 浏览
0 Comments

如何找到Android设备的序列号?

在我的Android应用中,我需要使用一个唯一的ID,我认为设备的序列号是一个很好的选择。我该如何在我的应用程序中检索Android设备的序列号?

0
0 Comments

问题的出现原因是作者想要找到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设备的序列号。

0
0 Comments

如何找到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设备序列号的内容。

0
0 Comments

如何找到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;

希望以上内容对您有所帮助!

0