Android设备的唯一ID

Mud*_*sir 44 android

我想要一些Android设备的唯一ID.我用以下代码尝试过它

String ts = Context.TELEPHONY_SERVICE;
TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(ts);
Run Code Online (Sandbox Code Playgroud)

但我知道这只适用于手机.

如果我的应用程序在某些笔记本电脑,上网本或其他类型的设备上运行怎么办?在这种情况下如何获得唯一ID?

hun*_*ngr 41

Android手机上有三种类型的标识符.

  1. IMEI
  2. IMSI

    String ts = Context.TELEPHONY_SERVICE;
    TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(ts);
    String imsi = mTelephonyMgr.getSubscriberId();
    String imei = mTelephonyMgr.getDeviceId();
    
    Run Code Online (Sandbox Code Playgroud)
  3. Android ID它是一个64位十六进制字符串,它是在设备首次启动时生成的.通常,除非出厂重置,否则不会更改.

    Secure.getString(getContentResolver(), Secure.ANDROID_ID);
    
    Run Code Online (Sandbox Code Playgroud)

  • 更新3:字符串unique_id = android.provider.Settings.Secure.getString(getContentResolver(),android.provider.Settings.Secure.ANDROID_ID); 参考:http://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID (3认同)

Sre*_*v R 21

Secure.getString(getContentResolver(), Secure.ANDROID_ID);
Run Code Online (Sandbox Code Playgroud)

这不适用于所有设备.

一些Android设备有问题当我们尝试获取设备ID时,有些设备返回null.解决此问题的唯一方法是创建一个应该由我们自己生成的伪设备ID.此函数将为您生成一个唯一的设备ID你可以根据需要对这个功能进行修改.我在解决这个问题上也经常苦苦挣扎.

public String getDeviceID() {

/*String Return_DeviceID = USERNAME_and_PASSWORD.getString(DeviceID_key,"Guest");
return Return_DeviceID;*/

TelephonyManager TelephonyMgr = (TelephonyManager) getApplicationContext().getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
String m_szImei = TelephonyMgr.getDeviceId(); // Requires
// READ_PHONE_STATE

// 2 compute DEVICE ID
String m_szDevIDShort = "35"
+ // we make this look like a valid IMEI
Build.BOARD.length() % 10 + Build.BRAND.length() % 10
+ Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10
+ Build.DISPLAY.length() % 10 + Build.HOST.length() % 10
+ Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10
+ Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10
+ Build.TAGS.length() % 10 + Build.TYPE.length() % 10
+ Build.USER.length() % 10; // 13 digits
// 3 android ID - unreliable
String m_szAndroidID = Secure.getString(getContentResolver(),Secure.ANDROID_ID);
// 4 wifi manager, read MAC address - requires
// android.permission.ACCESS_WIFI_STATE or comes as null
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();
// 5 Bluetooth MAC address android.permission.BLUETOOTH required
BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
String m_szBTMAC = m_BluetoothAdapter.getAddress();
System.out.println("m_szBTMAC "+m_szBTMAC);

// 6 SUM THE IDs
String m_szLongID = m_szImei + m_szDevIDShort + m_szAndroidID+ m_szWLANMAC + m_szBTMAC;
System.out.println("m_szLongID "+m_szLongID);
MessageDigest m = null;
try {
m = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
                }
m.update(m_szLongID.getBytes(), 0, m_szLongID.length());
byte p_md5Data[] = m.digest();

String m_szUniqueID = new String();
for (int i = 0; i < p_md5Data.length; i++) {
int b = (0xFF & p_md5Data[i]);
// if it is a single digit, make sure it have 0 in front (proper
// padding)
if (b <= 0xF)
m_szUniqueID += "0";
// add number to string
m_szUniqueID += Integer.toHexString(b);
}
m_szUniqueID = m_szUniqueID.toUpperCase();

Log.i("-------------DeviceID------------", m_szUniqueID);
Log.d("DeviceIdCheck", "DeviceId that generated MPreferenceActivity:"+m_szUniqueID);

return m_szUniqueID;

}
Run Code Online (Sandbox Code Playgroud)


bha*_*adz 15

很抱歉碰到一个旧线程,但这个问题让我很头疼,我发现一篇好文章供有人阅读,这对我很有帮助.

有时在Android应用程序开发期间需要获取基于Android的智能手机设备的唯一ID.当用户想要跟踪应用程序的唯一设备安装时,这是必要的.

这在Android开发人员只想向少数特定设备发送Push消息的情况下也很有用.所以在这里有必要为每个设备都有一个UDID.

在Android中,有许多替代设备的UDID.下面列出了在Android应用程序中获取UDID的一些方法及其优点和缺点以及获取设备ID所需的任何权限.

  • IMEI :(国际移动设备识别码)
  • Android ID
  • WLAN MAC地址字符串
  • 蓝牙地址字符串

1)IMEI :(国际移动设备标识)

IMEI号是获取设备ID的非常好的主要来源.它对每个设备都是唯一的,并且取决于设备硬件.因此它对于每个设备也是独一无二的,并且在设备的使用寿命期间它是永久性的.

获取设备IMEI的代码片段如下,

TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String m_deviceId = TelephonyMgr.getDeviceId();
Run Code Online (Sandbox Code Playgroud)

为此,您的应用程序将需要清单文件中给出的权限"android.permission.READ_PHONE_STATE".

使用IMEI作为设备ID的优点:

IMEI对于每个设备都是唯一的.即使重新安装应用程序或设备已植根或出厂重置,它仍然是设备的唯一选择.

使用IMEI作为设备ID的缺点:

IMEI依赖于设备的SIM卡插槽,因此无法为不使用Simcard的设备获取IMEI.在双SIM卡设备中,我们为同一设备获得2个不同的IMEI,因为它有2个用于SIM卡的插槽.

2)Android ID

Android_ID是唯一的64位数字,在首次启动设备时生成并存储.当设备恢复出厂设置并生成新设备时,Android_ID将被清除.

获取Android_ID的代码如下所示,

String m_androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
Run Code Online (Sandbox Code Playgroud)

使用Android_ID作为设备ID的优点:

它是所有类型设备(智能手机和平板电脑)的唯一标识符.无需任何许可.

它将在所有设备中保持唯一,并且可在没有Simcard插槽的手机上使用.

使用Android_ID作为设备ID的缺点:

如果用户升级了Android操作系统版本,则可能会更改.如果设备已植根或在设备上完成恢复出厂设置,则ID会更改.还有一个中国Android设备制造商的问题是某些设备具有相同的Android_ID.

3)WLAN MAC地址字符串

我们也可以使用WLAN MAC地址获取Android手机的唯一ID.MAC地址对所有设备都是唯一的,适用于各种设备.

获取设备WLAN MAC地址的代码片段如下所示,

WifiManager m_wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
String m_wlanMacAdd = m_wm.getConnectionInfo().getMacAddress();
Run Code Online (Sandbox Code Playgroud)

您的应用程序将需要清单文件中给出的权限"android.permission.ACCESS_WIFI_STATE".

使用WLAN MAC地址作为设备ID的优点:

它是所有类型设备(智能手机和平板电脑)的唯一标识符.如果重新安装应用程序,它仍然是唯一的.

使用WLAN MAC地址作为设备ID的缺点:

如果设备没有wifi硬件,那么你会得到空MAC地址,但通常可以看到大多数Android设备都有wifi硬件,市场上几乎没有设备没有wifi硬件.

4)蓝牙地址字符串

我们也可以使用蓝牙设备获取Android手机的唯一ID.蓝牙设备地址对于具有蓝牙硬件的每个设备是唯一的.

获取蓝牙设备地址的代码段如下所示,

BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
String m_bluetoothAdd = m_BluetoothAdapter.getAddress();
Run Code Online (Sandbox Code Playgroud)

要获取上述代码,您的应用程序需要清单文件中给出的权限"android.permission.BLUETOOTH".

使用蓝牙设备地址作为设备ID的优点:它是所有类型设备(智能手机和平板电脑)的唯一标识符.所有设备中通常都有一个蓝牙硬件,并且不会发生变化.

使用蓝牙设备地址作为设备ID的缺点:如果设备没有蓝牙硬件,那么您将获得空.

根据我的说法,这些是获取Android智能手机设备的唯一设备ID以及使用它们的优缺点的最佳方法.现在,您可以根据Android应用程序开发要求决定使用哪种方法.

如果有任何其他方法来获取UDID并且弥补了上述方法的缺点,那么我很乐意在我的Android应用程序中探索这些方法.PL.分享评论框中的内容以及任何建议或疑问.

这是文章


Squ*_*onk 13

看看恒 ANDROID_IDandroid.provider.Secure.Settings,看有没有什么帮助.

我正在从官方文档中添加一些有用的链接;

  • 据传,ANDROID_ID在某些手机/固件版本上并不是唯一的 (3认同)
  • @Mudassir:是的......但在不同的情况下,几乎任何东西都可以改变.这取决于你想要的东西是多么"独特"和"永久".如果在恢复出厂设置期间更改了UID,则下次使用您正在编写的任何应用程序时,将使设备"无效".此外,出厂重置后,您的应用程序将不得不重新安装. (2认同)

Kev*_*ker 8

有关如何为安装应用程序的每个Android设备获取唯一标识符的详细说明,请参阅此官方Android开发人员博客帖子:

http://android-developers.blogspot.com/2011/03/identifying-app-installations.html

看起来最好的方法是在安装时生成一个自己,然后在重新启动应用程序时读取它.

我个人觉得这个可以接受但不理想.Android提供的任何一个标识符都不适用于所有情况,因为大多数都依赖于手机的无线电状态(wifi开/关,蜂窝开/关,蓝牙开/关).其他像Settings.Secure.ANDROID_ID必须由制造商实施,并不保证是唯一的.

以下是将数据写入INSTALLATION文件的示例,该文件将与应用程序在本地保存的任何其他数据一起存储.

public class Installation {
    private static String sID = null;
    private static final String INSTALLATION = "INSTALLATION";

    public synchronized static String id(Context context) {
        if (sID == null) {  
            File installation = new File(context.getFilesDir(), INSTALLATION);
            try {
                if (!installation.exists())
                    writeInstallationFile(installation);
                sID = readInstallationFile(installation);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return sID;
    }

    private static String readInstallationFile(File installation) throws IOException {
        RandomAccessFile f = new RandomAccessFile(installation, "r");
        byte[] bytes = new byte[(int) f.length()];
        f.readFully(bytes);
        f.close();
        return new String(bytes);
    }

    private static void writeInstallationFile(File installation) throws IOException {
        FileOutputStream out = new FileOutputStream(installation);
        String id = UUID.randomUUID().toString();
        out.write(id.getBytes());
        out.close();
    }
}
Run Code Online (Sandbox Code Playgroud)


Gre*_*som 6

使用MAC地址:

媒体访问控制地址(MAC地址)是分配给网络接口的唯一标识符

连接到网络的任何设备都保证有MAC地址,您可以通过转到设置>关于手机>状态在Android上找到它.

您应该能够使用蓝牙API获取蓝牙Mac地址.

  • 是的MAC(或至少本地报告)可以在任何已植根的设备上被覆盖. (2认同)

小智 5

你可以试试这个:

String deviceId = Secure.getString(this.getContentResolver(),
                Secure.ANDROID_ID);
Run Code Online (Sandbox Code Playgroud)