为了唯一地识别每个设备,我想使用IMEI(或CDMA设备的ESN号)。如何以编程方式访问它?


当前回答

你需要调用android.telephony.TelephonyManager.getDeviceId()。

这将返回唯一标识该设备的字符串(GSM上的IMEI, CDMA上的MEID)。

你需要在AndroidManifest.xml中设置以下权限:

< uses-permission android: name = " android.permission。READ_PHONE_STATE " / >

为了做到这一点。

话虽如此,做这件事要小心。用户不仅会想知道为什么您的应用程序要访问他们的电话堆栈,而且如果用户获得了新设备,可能很难迁移数据。

更新:正如下面评论中提到的,这不是一种安全的认证用户的方式,并引起了隐私问题。不建议使用。相反,如果您想实现一个无障碍的登录系统,请查看谷歌+ Login API。

如果你只是想在用户重置手机(或购买新设备)时以一种轻量级的方式持久化一束字符串,Android Backup API也是可用的。

其他回答

获取IMEI(国际移动设备标识符)

public String getIMEI(Activity activity) {
    TelephonyManager telephonyManager = (TelephonyManager) activity
            .getSystemService(Context.TELEPHONY_SERVICE);
    return telephonyManager.getDeviceId();
}

获取设备唯一id

public String getDeviceUniqueID(Activity activity){
    String device_unique_id = Secure.getString(activity.getContentResolver(),
            Secure.ANDROID_ID);
    return device_unique_id;
}

你需要调用android.telephony.TelephonyManager.getDeviceId()。

这将返回唯一标识该设备的字符串(GSM上的IMEI, CDMA上的MEID)。

你需要在AndroidManifest.xml中设置以下权限:

< uses-permission android: name = " android.permission。READ_PHONE_STATE " / >

为了做到这一点。

话虽如此,做这件事要小心。用户不仅会想知道为什么您的应用程序要访问他们的电话堆栈,而且如果用户获得了新设备,可能很难迁移数据。

更新:正如下面评论中提到的,这不是一种安全的认证用户的方式,并引起了隐私问题。不建议使用。相反,如果您想实现一个无障碍的登录系统,请查看谷歌+ Login API。

如果你只是想在用户重置手机(或购买新设备)时以一种轻量级的方式持久化一束字符串,Android Backup API也是可用的。

除了Trevor Johns的回答外,你还可以这样使用:

TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.getDeviceId();

并且您应该在Manifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

在模拟器中,你可能会得到一个“00000…”的值。如果设备ID不可用,getDeviceId()返回NULL。

对不可重置设备标识符的限制

从Android 10开始,应用程序必须拥有READ_PRIVILEGED_PHONE_STATE特权权限才能访问设备的不可重置标识符,包括IMEI和序列号。

或者你可以使用ANDROID_ID设置从Android.Provider.Settings.System(这里描述strazerre.com)。

这样做的好处是,它不需要特殊的权限,但如果另一个应用程序具有写访问权限并更改它,则可以更改它(这显然不常见,但并非不可能)。

仅供参考,这里是来自博客的代码:

import android.provider.Settings;
import android.provider.Settings.System;   

String androidID = System.getString(this.getContentResolver(),Secure.ANDROID_ID);

实现注意:如果ID对系统架构至关重要,你需要意识到在实践中,一些非常低端的Android手机和平板电脑已经发现重用相同的ANDROID_ID (9774d56d682e549c是显示在我们的日志中的值)