Android 手机上取得物理唯一标识码[转]

 

 

  1. 所有添加有谷歌账户的设备可回来一个 ANDROID_ID
  2. 具有的CDMA设备对 ANDROID_ID 和 TelephonyManager.getDeviceId()
    返回相同的值(只要以安装时补充加了谷歌账户)

 

唯标识码这东西在网以被好有因此,例如检测是否再登记之类的。

import android.provider.Settings.Secure;
private String android_id =
Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID);

 

咱们当路进程中要么多要掉会动用到设备的唯一识别码,我们盼望能得到一个安宁、可靠的装置唯一识别码。今天咱们将介绍几种方法。

       1. DEVICE_ID

 

使我们真的用为此到真实设备的标识,可能就需用到DEVICE_ID。在以前,我们的Android设备是手机,这个DEVICE_ID可以跟通过getSystemService(Context.TELEPHONY_SERVICE).getDeviceId()获取,它根据不同的无绳电话机配备返回IMEI,MEID或者ESN码,但它在动用的进程遭到会赶上许多题材:

  • 非手机设备:
    如果单独含有Wifi的设施或者音乐播放器没有打电话的硬件功能的语句就从未有过是DEVICE_ID
  • 权力: 采用这种植办法,需要以AndroidManifest.xml中加入一个认可:android.permission.READ_PHONE_STATE,并且用户应允许安装之以。作为手机来讲,IMEI是绝无仅有的,它应当接近于
    359881030314356(除非您产生一个尚无量产的手机(水货)它恐怕发不行的IMEI,如:0000000000000)。,但如果我们就以获取其,没有就此到另外的通话功能,那这个权力有点大才小用
  • bug:在个别的一部分手机设备上,该兑现有尾巴,会回垃圾,如:zeros或者asterisks的活

 

        2. MAC ADDRESS

 

咱吧可经过手机的Wifi或者蓝牙设备得到MAC ADDRESS作为DEVICE
ID,但是并无建议这样做,因为并无是持有的设备都产生Wifi,并且,如果Wifi没有打开,那硬件配备无法赶回MAC
ADDRESS.

The WLAN MAC Address
string,
是另一个唯一ID。但是你需要吗而的工进入android.permission.ACCESS_WIFI_STATE 权限,否则是地址会为null。

 WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();

Returns: 00:11:22:33:44:55
(这不是一个实际的地点。而且此地点能随便地被仿冒。).WLan不必打开,就可读博来值。

The BT MAC Address
string,
只以产生蓝牙的装置及运行。并且只要投入android.permission.BLUETOOTH 权限.

BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter      m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();      String m_szBTMAC = m_BluetoothAdapter.getAddress();

Returns: 43:25:78:50:93:38 . 蓝牙没有必要打开,也克读取。

 

        3. Serial Number

具SIM卡的装置可以经过getSystemService(Context.TELEPHONY_SERVIEC).getSimSerialNumber();获取到

sim serial number。 注意对CDMA设备,返回的是一个空值。

在Android
2.3好通过android.os.Build.SERIAL获取,非手机设备得以经过该接口获取。

        4. ANDROID_ID

ANDROID_ID是装备第一不行开行时发出及贮的64bit的一个频繁,当设备为wipe后该数重置

ANDROID_ID似乎是抱Device ID的一个好选,但她也来瑕疵:

 

  • 它们以Android <=2.1 or
    Android >=2.3之版本是牢靠、稳定之,但以2.2的本并无是100%可靠的
  • 于主流厂商生产的配备及,有一个生经常的bug,就是每个设备都见面起同样之ANDROID_ID:9774d56d682e549c
  • String m_szAndroidID
    = Secure.getString(getContentResolver(), Secure.ANDROID_ID)

 

        5. Installtion ID : UUID

上述四栽艺术还生要多要掉是的终将的局限性或者bug,在此,有另外一种植艺术解决,就是利用UUID,该法无需访问设备的资源,也和设备项目无关。

这种措施是透过当程序安装后率先软运行后生成一个ID实现之,但欠方法跟设备唯一标识不相同,它见面盖不同之应用程序而发不同的ID,而未是装备唯一ID。因此经常用来标识在某个应用被的唯一ID(即Installtion
ID),或者跟应用之设置数量。很幸运的,Google Developer
Blog提供了这般的一个框架:

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();
    }
}

6 Pseudo-Unique ID,
这个于任何Android手机中都有效
发生一部分奇之气象,一些而平板计算机的安没有打电话功能,或者您切莫情愿在READ_PHONE_STATE许可。而而依旧思念博得唯一序列号之类的东西。这时你可以经过取出ROM版本、制造商、CPU型号、以及另外硬件信息来落实即一点。这样计算出来的ID不是绝无仅有的(因为一旦个别单手机应用了一致的硬件及Rom
镜像)。但应懂得的是,出现类似场面的可能性基本可以忽略。要实现就或多或少,你可以下Build类:

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  

绝大多数的Build成员都是字符串形式之,我们仅获得他们的尺寸信息。我们赢得到13个数字,并在前方加上“35”。这样是ID看起便同15个IMEI一样了。

   总结

综合以上所述,为了贯彻以配备及还通用的落装备唯一标识,我们好兑现如此的一个类似,为每个设备发生唯一的UUID,以ANDROID_ID为根基,在获得失败时以TelephonyManager.getDeviceId()为准备方式,如果再失败,使用UUID的变策略

 

原文地址

相关文章