ACCESSAndroid 手机上赢得物理唯一标识码[转]

 

 

  1. 不无添加有谷歌账户的设备得以回来三个 ANDROID_ID
  2. 具有的CDMA设备对于 ANDROID_ID 和 TelephonyManager.getDeviceId()
    重临相同的值(只要在装置时添加了谷歌(谷歌(Google))账户)

 

唯一标识码那东西在互连网使用中尤其有用,例如检查和测试是或不是再度登记之类的。

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

 

我们在档次进度中或多或少会采纳到设备的唯一识别码,我们意在能够获取3个稳定、可信的装置唯一识别码。前日大家将介绍两种方法。

       1. DEVICE_ID

 

若果大家确实供给用到真实设备的标识,也许就须要用到DEVICE_ID。在原先,大家的Android设备是手提式有线电话机,那么些DEVICE_ID能够同通过getSystemService(Context.TELEPHONY_SEQX56VICE).getDeviceId()获取,它遵照不一样的无绳电话机配备重返IMEI,MEID恐怕ESN码,但它在运用的历程中会遇到许多题材:

  • 非手机设备:
    假诺只包罗Wifi的配备或许音乐播放器没有打电话的硬件效用的话就平昔不那几个DEVICE_ID
  • 权力: 选择此种方法,必要在AndroidManifest.xml中参加3个特许:android.permission.READ_PHONE_STATE,并且用户应当允许安装此选拔。作为手提式有线电话机来讲,IMEI是唯一的,它应当接近于
    359881030314356(除非您有3个尚未量产的手提式有线话机(水货)它或者有不行的IMEI,如:0000000000000)。,但一旦我们只为了取得它,没有用到别的的打电话功能,那那些权力有点大才小用
  • bug:在个别的一些手提式有线电话机配备上,该兑现有漏洞,会重返垃圾,如:zeros可能asterisks的出品

 

        2. MAC ADDRESS

 

我们也能够透过手提式有线电话机的Wifi或许蓝牙( Bluetooth® )设备得到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
(那不是1个实在的地方。而且以此地点能自由地被伪造。).WLan不必打开,就可读取些值。

The BT MAC Address
string
,
只在有蓝牙5.0的设备上运转。并且要加入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 . 蓝牙( Bluetooth® )没有须要打开,也能读取。

 

        3. Serial Number

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

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

在Android
2.3方可因此android.os.Build.SE福睿斯IAL获取,非手提式无线电话机设备能够通过该接口获取。

        4. ANDROID_ID

ANDROID_ID是设备第3回运转时产生和仓库储存的64bit的叁个数,当设备被wipe后该数重置

ANDROID_ID就如是获得Device ID的三个好采纳,但它也不平时:

 

  • 它在Android <=2.1 or
    Android >=2.3的版本是牢靠、稳定的,但在2.2的本子并不是百分之百可信的
  • 在主流厂商生产的配备上,有3个很常常的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成员都以字符串方式的,大家只取他们的长短消息。我们取到1贰个数字,并在后面加上“35”。这样这几个ID看起来就和1陆人IMEI一样了。

   总结

汇总以上所述,为了兑以后装置上更通用的收获装备唯一标识,大家能够完毕如此的贰个类,为每一种设备发生唯一的UUID,以ANDROID_ID为底蕴,在获取战败时以TelephonyManager.getDeviceId()为准备形式,假诺再失利,使用UUID的成形策略

 

原作地址

相关文章