我想要一些Android设备的唯一ID.我用以下代码尝试过它
String ts = Context.TELEPHONY_SERVICE;
TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(ts);
Run Code Online (Sandbox Code Playgroud)
但我知道这只适用于手机.
如果我的应用程序在某些笔记本电脑,上网本或其他类型的设备上运行怎么办?在这种情况下如何获得唯一ID?
hun*_*ngr 41
Android手机上有三种类型的标识符.
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)Android ID它是一个64位十六进制字符串,它是在设备首次启动时生成的.通常,除非出厂重置,否则不会更改.
Secure.getString(getContentResolver(), Secure.ANDROID_ID);
Run Code Online (Sandbox Code Playgroud)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所需的任何权限.
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_ID 中android.provider.Secure.Settings,看有没有什么帮助.
我正在从官方文档中添加一些有用的链接;
有关如何为安装应用程序的每个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)
小智 5
你可以试试这个:
String deviceId = Secure.getString(this.getContentResolver(),
Secure.ANDROID_ID);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
69343 次 |
| 最近记录: |