1. 程式人生 > >Android 裝置唯一標識生成方式

Android 裝置唯一標識生成方式

Android裝置唯一標識生成方式

為什麼很多安卓應用都要獲取IMEI?

很多應用都會要求獲取IMEI,尤其神奇的是,我禁用了天貓客戶端的許可權,彈出來一行英文,大概是什麼內容獲取不到,無法登入,又試了一次,登入成功,發現許可權管理裡許可權竟然被打開了。

像天貓(支付寶)/微信這樣的登陸時校驗一下裝置串號是有意義的這是用來確保是由你的裝置在登陸。

IMEI一般作手機的唯一標識,用於服務端日誌統計,資料分析。

但是有些廠商的裝置,IMEI並不是總能夠獲取到,解決的辦法就是我們手動生成一個ID值,後面再詳細講解。

一、IMEI獲取

imei是裝置的一個編號值,獲取比較方便,不過有些裝置的裝置編號獲取不到,這種方式已經沒有多少人會採用。下面就講講怎麼獲取imei編號。

1、首先要獲取到裝置的imei編號,必須得開啟許可權,在AndroidManifest.xml檔案中新增入下欄位:

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

2、獲取imei值

private TelephonyManager manager;
manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
imei = manager.getDeviceId();
tv.setText(imei);

二、UUID生成

UUID生成的原理,先獲取裝置的標識資訊,如果能夠獲取到就使用該獲取到的值,否則就生成一個隨機數,然後通過快取和檔案的方式儲存這個值。

1、生成UUID部分的關鍵原始碼如下:

public DeviceUuidFactory(Context context) {
    if (uuid == null) {
        synchronized (DeviceUuidFactory.class) {
            if (uuid == null) {
                final SharedPreferences prefs = context.getSharedPreferences(PREFS_FILE
, 0);                 final String id = prefs.getString(PREFS_DEVICE_ID, null);                 if (id != null) {                     uuid = UUID.fromString(id);                 } else {                     if (recoverDeviceUuidFromSD() != null) {                         uuid = UUID.fromString(recoverDeviceUuidFromSD());                     } else {                         final String androidId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);                         try {                             if (!"9774d56d682e549c".equals(androidId)) {                                 uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8"));                                 try {                                     saveDeviceUuidToSD(EncryptUtils.encryptDES(uuid.toString(), KEY));                                 } catch (Exception e) {                                     e.printStackTrace();                                 }                             } else {                                 final String deviceId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();                                 uuid = deviceId != null ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")) : UUID.randomUUID();                                 try {                                     saveDeviceUuidToSD(EncryptUtils.encryptDES(uuid.toString(), KEY));                                 } catch (Exception e) {                                     e.printStackTrace();                                 }                             }                         } catch (UnsupportedEncodingException e) {                             throw new RuntimeException(e);                         }                     }                     prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString()).commit();                 }             }         }     } }

存快取和讀快取的方式,上面的原始碼已經寫出了處理方式,就不多講了。

2、將UUID儲存到SD卡的檔案中的方法

private static void saveDeviceUuidToSD(String uuid) {
    String dirPath = Environment.getExternalStorageDirectory().getAbsolutePath();
    File targetFile = new File(dirPath, DEVICE_UUID_FILE_NAME);
    if (targetFile != null) {
        if (targetFile.exists()) {

        } else {
            OutputStreamWriter osw;
            try {
                osw = new OutputStreamWriter(new FileOutputStream(targetFile), "utf-8");
                try {
                    osw.write(uuid);
                    osw.flush();
                    osw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

}

3、將UUID從檔案中讀取出來的方法

private static String recoverDeviceUuidFromSD() {
    try {
        String dirPath = Environment.getExternalStorageDirectory().getAbsolutePath();
        File dir = new File(dirPath);
        File uuidFile = new File(dir, DEVICE_UUID_FILE_NAME);
        if (!dir.exists() || !uuidFile.exists()) {
            return null;
        }
        FileReader fileReader = new FileReader(uuidFile);
        StringBuilder sb = new StringBuilder();
        char[] buffer = new char[100];
        int readCount;
        while ((readCount = fileReader.read(buffer)) > 0) {
            sb.append(buffer, 0, readCount);
        }
        //通過UUID.fromString來檢查uuid的格式正確性UUID uuid = UUID.fromString(EncryptUtils.decryptDES(sb.toString(), KEY));
        return uuid.toString();
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

4、獲取UUID

public static UUID getUuid() {
    return uuid;
}

說明幾點:

1、讀寫檔案需要開啟SDCard的讀寫許可權,在AndroidManifest.xml檔案中新增入下欄位:

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

2、呼叫方法

 private DeviceUuidFactory uuidFactory;
 uuidFactory = new DeviceUuidFactory(this);
 tv1.setText(uuidFactory.getUuid() + "");

3、因為是以檔案的形式儲存的uuid值,容易被人修改,所以我採用了以下兩種方式:

1)將檔案作為隱藏檔案儲存,例如:

   DEVICE_UUID_FILE_NAME = ".dev_id.txt"
         2)我採用了DES對生成的uuid值進行了加密儲存,這樣在一定程度上能夠確保內容不會被修改,絕對不能夠被修改我個人覺得是不現實的。
具體的實現請參照事例demo中的原始碼。

相關推薦

Android 裝置唯一標識生成方式

Android裝置唯一標識生成方式 為什麼很多安卓應用都要獲取IMEI? 很多應用都會要求獲取IMEI,尤其神奇的是,我禁用了天貓客戶端的許可權,彈出來一行英文,大概是什麼內容獲取不到,無法登入,又試了一次,登入成功,發現許可權管理裡許可權竟然被打開了。 像天貓(支付寶)/

獲取Android裝置唯一標識

唯一標識碼這東西在網路應用中非常有用,例如檢測是否重複註冊之類的。import android.provider.Settings.Secure;private String android_id = Secure.getString(getContext().getContentResolver(),

Android裝置唯一標識小記

許可權: <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 測試裝置: 小米pad2,HTCd816t(有卡),華為4c(無卡),vivo X6L

[Android][獲取Android裝置唯一標識]

1.落筆緣由 最近需要獲取能夠標誌Android裝置的唯一標識,但是由於Android系統版本不同或者root等諸多原因,造成有些裝置標識為NULL或者標識相同的問題,在網上搜索了相關資料,總結一下各種情況。 2.程式碼 import android.

android獲取裝置唯一標識完美解決方案的思考以及實現方式

前言 由於在開發中需要開發遊客模式,在使用者沒有登入的情況下必須確保裝置的唯一性,於是慣性思維想到的肯定是使用DevicesId 來作為裝置的唯一標識,用以代替使用者登入以後的唯一識別符號。 但是由於國內複雜的rom定製情況,以及使用者許可權禁止的情況。De

android獲取裝置唯一標識

IMEI 百度百科解釋:IMEI(International Mobile Equipment Identity)是國際移動裝置身份碼的縮寫,國際移動裝備辨識碼,是由15位數字組成的“電子串號”,它與每臺行動電話機一一對應,而且該碼是全世界唯一的。每一隻行動電話機在組裝完成後都將被賦予一個全

Android獲取裝置唯一標識解決方案

關於Android裝置唯一識別符號號 前言 由於在開發中需要開發遊客模式,在使用者沒有登入的情況下必須確保裝置的唯一性,於是慣性思維想到的肯定是使用DevicesId 來作為裝置的唯一標識,用以代替使用者登入以後的唯一識別符號。 但是由於國內複雜的rom定製情況,以及使

安卓獲取渠道名渠道id Android獲取裝置唯一標識的終極解決方法,防止安卓7.0時崩潰問題

一,先說獲取渠道名(這裡以友盟為例) /* * 4.5.1新加渠道名欄位,用來傳給後臺去統計各個渠道下載量 * */ public static String getSource() { //獲取渠道名 Strin

Android獲取裝置唯一標識

話不多說,先貼程式碼 /**獲取裝置唯一標識碼
 * @param context 上下文
 * @return 裝置唯一標識碼
 */
 public static String getUDID

android獲取裝置唯一標識完美解決方案

這是Android系統為開發者提供的用於標識手機裝置的串號,也是各種方法中普適性較高的,可以說幾乎所有的裝置都可以返回這個串號,並且唯一性良好。 這個DEVICE_ID可以同通過下面的方法獲取: TelephonyManager tm = (TelephonyManager)getSystemServi

Android下獲取裝置唯一標識(UDID, DeviceID)

android下獲取裝置唯一標識原本非常簡單(至少不會像iOS一樣禁用這個,禁用那個),但是由於裝置的多樣性需要考慮的東西也對應複雜起來。 先附上完整程式碼protected static final String PREFS_FILE = "gank_device_id.

獲取iOS裝置唯一標識

轉自:https://www.cnblogs.com/fdyjm/p/7125710.html UDID 在之前的版本是可以被使用的,iOS5及以後,被蘋果禁止使用了(棄用了)。雖然,這個UDID用得很廣泛,但是,不得不說的是,它在慢慢的遠離開發者,不能在考慮使用UDID了。至於這個標示符是

裝置唯一標識方法(Unique Identifier):如何在Windows系統上獲取裝置唯一標識 zz

原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html          唯一的標識一個裝置是一個基本功能,可以擁有很多應用場景,比如軟體授權(如何保證你的軟體在授權後才能在特定機

如何獲取Android裝置唯一識別碼

如果我們想唯一識別一臺Android裝置,就需要獲取裝置的唯一識別碼。怎麼獲取呢? 下面是Android裝置一些可供選擇的唯一識別碼及其適用範圍: IMEI (International Mobile Equipment Identity Number,國際移動裝置識別碼) 用於在手機網路中識別

獲取android手機唯一標識

    因為很多軟體都有這個功能,所以說是非常重要的,比如說一個使用者賬號只能繫結3個裝置,那麼得到裝置的唯一標示將是非常重要的。     我猜那麼你肯定首先想到的就是得到裝置IMEI, TelephonyManager telephonyMana

Android裝置唯一識別符號ID

一、獲取各種單一的裝置標識方式 1、DEVICE_ID 概念:是區別移動裝置的標誌,儲存在移動裝置中,可用於監控被竊或無效的移動裝置。 優點:根據不同的手機裝置返回IMEI,MEID或者ESN碼,唯一性良好 缺點:由於獲取

手機唯一標識生成方案

首先,就目前掌握的資料來看,該問題沒有徹底的解決方案。網路資料很多,主要分為4類。建議採用方案4。 方案一:Android裝置標識或裝置硬體資訊 常用的有: 1)藍芽/Wifi的Mac地址、IMSI、sim卡序列號; 2)CPU 的名稱、核數、頻率,Ram大小、Rom大小

關於裝置唯一標識

首先結論是令人失望的,對於android來說,這是一個沒有完美方案的問題。大家只能努力提高它的準確性,對於大的公司來說,可以自己開發出一套自己的機制,例如我上家公司成立過一個手機指紋的專案,專門處理裝置唯一性的問題防止使用者刷單,原理很簡單,就是儘可能的把手機能讀取到的資訊

iOS得到裝置唯一標識的各種方案及推薦使用方案的介紹

由於我們後臺判斷App登入時根據唯一標識來判斷的在不同終端登入的,如果唯一標識不一樣,說明是換了裝置,但是我們的使用者名稱密碼是我們同一系列的app公用的,所以得保證同一公司旗下的app在同一裝置下的唯一標識是同一個,避免出現同一裝置登陸同一系列其他app時提示換了裝置,說個簡單的例子如:我的使用者名稱是aa

各種獲取裝置唯一標識的方法介紹

//現在蘋果對隱私方面很嚴  很難獲取一種較好的裝置唯一識別符號方法,下面幾篇博文僅做參考: 使用UUID作為手機唯一識別符號在app刪除並重新安裝後會重新生成。當我們把第一次生成的UUID儲存到KeyChain中就能解決這個問題。  推薦大家使用SFHFKeychai