Android唯一设备ID 您所在的位置:网站首页 androidid怎么查看 Android唯一设备ID

Android唯一设备ID

2023-03-31 05:20| 来源: 网络整理| 查看: 265

设备ID,简单来说就是一串符号(或者数字),映射现实中硬件设备。如果这些符号和设备是一一对应的,可称之为“唯一设备ID(Unique Device Identifier)”

不幸的是,对于Android平台而言,没有稳定的API可以让开发者获取到这样的设备ID。

开发者通常会遇到这样的困境:随着项目的演进, 越来越多的地方需要用到设备ID;然而随着Android版本的升级,获取设备ID却越来越难了。

加上Android平台碎片化的问题,获取设备ID之路,可以说是步履维艰。

获取设备标识的API屈指可数,而且都或多或少有一些问题。

 

IMEI

IMEI本该最理想的设备ID,具备唯一性,恢复出厂设置不会变化(真正的设备相关),可通过拨打*#06# 查询手机的imei码。

然而,获取IMEI需要 READ_PHONE_STATE 权限,估计大家也知道这个权限有多麻烦了。

尤其是Android 6.0以后, 这类权限要动态申请,很多用户可能会选择拒绝授权。我们看到,有的APP不授权这个权限就无法使用, 这可能会降低用户对APP的好感度。

而且,Android 10.0 将彻底禁止第三方应用获取设备的IMEI(即使申请了 READ_PHONE_STATE 权限)。所以,如果是新APP,不建议用IMEI作为设备标识;

如果已经用IMEI作为标识,要赶紧做兼容工作了,尤其是做新设备标识和IMEI的映射。

 

设备序列号

在Android 7.1或更早系统(SDK=26),android.os.Build.SERIAL 总返回 “unknown”;若要获取序列号,可调用Build.getSerial() ,但是需要申请 READ_PHONE_STATE 权限。

到了Android 10.0(SDK>=29)以上,则和IMEI一样,也被禁止获取了。

在UE4中,使用C++代码实现如下:

int GetPublicStaticInt(const char *className, const char *fieldName) { #if PLATFORM_ANDROID JNIEnv* env = FAndroidApplication::GetJavaEnv(); if (env != NULL) { jclass clazz = env->FindClass(className); if (clazz != nullptr) { jfieldID fid = env->GetStaticFieldID(clazz, fieldName, "I"); if (fid != nullptr) { return env->GetStaticIntField(clazz, fid); } } } #endif return 0; } FString GetPublicStaticString(const char *className, const char *fieldName) { #if PLATFORM_ANDROID JNIEnv* env = FAndroidApplication::GetJavaEnv(); if (env != NULL) { jclass clazz = env->FindClass(className); if (clazz != nullptr) { jfieldID fid = env->GetStaticFieldID(clazz, fieldName, "Ljava/lang/String;"); if (fid != nullptr) { jstring content = (jstring)env->GetStaticObjectField(clazz, fid); return ANSI_TO_TCHAR(env->GetStringUTFChars(content, 0)); } } } #endif return FString(); } FString GetStaticMethodNoParametersRetString(const char *className, const char *fieldName) { JNIEnv* env = FAndroidApplication::GetJavaEnv(); if (env != NULL) { jclass clazz = env->FindClass(className); if (clazz != nullptr) { // ()中为参数的类型列表,为空表示没有参数 // Ljava/lang/String;为返回值类型 jmethodID fid = (env)->GetStaticMethodID(clazz, "fieldName", "()Ljava/lang/String;"); if (fid != NULL) { jstring content = (jstring)((Env)->CallStaticObjectMethod(clazz, fid)); serial = ANSI_TO_TCHAR(env->GetStringUTFChars(content, 0)); } } } } FString serial = TEXT("") int sdk = GetPublicStaticInt("android/os/Build$VERSION", "SDK_INT"); if (sdk >= 29 ) // Android Q(>= SDK 29) { } else if (sdk >= 26) // Android 8 and later (>= SDK 26) { serial = GetStaticMethodNoParametersRetString("android/os/Build", "getSerial"); } else //Android 7.1 and earlier(


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有