Android學習_唯一值(Android_id、IMEI、Wifi MAC)
如果希望可以"鎖"某些事情只能讓特定機器執行,不管是手機上的功能、伺服器的服務或是系統的登入,都必須先取得一個唯一值,網路上也有許多取得唯一值得方法,看了很多相關的文章,似乎每一種方法都有些許問題,可能還是需要看狀況來決定該用哪種方式:
1. IMEI(android developer說明)
TelephonyManager tM=(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
String imei = tM.getDeviceId();
Log.v("ola_log", "imei:" + imei);
權限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
說明:手機的IMEI值。
缺點:由權限(READ_PHONE_STATE)可看出,IMEI值為"電話"的屬性,對於Wifi版本的平板會取得NULL值。
2. Android_id(android developer說明)
String android_id = Secure.getString(this.getBaseContext().getContentResolver(), Secure.ANDROID_ID);
Log.v("ola_log", "android_id:" + android_id);
說明:設備第一次啟動時產生的序號。
缺點:網路上部分文章指出,某些廠牌會有android_id重複的情況產生;當機器回原廠設定時,Android_id將會變更。
3. Wifi MAC(android developer說明)
WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
Log.v("ola_log", "MacAddress:" + wifiInfo.getMacAddress());
權限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
說明:Wifi的MAC。
缺點:網路上部分文章指出,機器沒有開啟Wifi時取不到MAC;但我關閉平板Wifi還是正常取到值。
4. Build.SERIAL(android developer說明)
String BuildSERIAL = android.os.Build.SERIAL;
Log.v("ola_log", "BuildSERIAL:" + BuildSERIAL);
說明:硬體的唯一值。
缺點:該值必須要API Level 9才支援;這個問題看專案類型可大可小,對於某些專案來說甚至不是問題。
5. UUID(android developer說明)
String UUID_Value = UUID.randomUUID().toString();
Log.v("ola_log", "UUID_Value:" + UUID_Value);
說明:randomUUID可以隨機的製造一個唯一值,或是利用其他內建方法製造唯一值(EX:nameUUIDFromBytes (byte[] name))。
缺點:必須要自己處理UUID的製造及儲存,若使用randomUUID則代表的是"該次安裝的唯一值"。
感覺一件很簡單的事情,其實也不單純勒。
如果希望可以"鎖"某些事情只能讓特定機器執行,不管是手機上的功能、伺服器的服務或是系統的登入,都必須先取得一個唯一值,網路上也有許多取得唯一值得方法,看了很多相關的文章,似乎每一種方法都有些許問題,可能還是需要看狀況來決定該用哪種方式:
1. IMEI(android developer說明)
TelephonyManager tM=(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
String imei = tM.getDeviceId();
Log.v("ola_log", "imei:" + imei);
權限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
說明:手機的IMEI值。
缺點:由權限(READ_PHONE_STATE)可看出,IMEI值為"電話"的屬性,對於Wifi版本的平板會取得NULL值。
2. Android_id(android developer說明)
String android_id = Secure.getString(this.getBaseContext().getContentResolver(), Secure.ANDROID_ID);
Log.v("ola_log", "android_id:" + android_id);
說明:設備第一次啟動時產生的序號。
缺點:網路上部分文章指出,某些廠牌會有android_id重複的情況產生;當機器回原廠設定時,Android_id將會變更。
3. Wifi MAC(android developer說明)
WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
Log.v("ola_log", "MacAddress:" + wifiInfo.getMacAddress());
權限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
說明:Wifi的MAC。
缺點:網路上部分文章指出,機器沒有開啟Wifi時取不到MAC;但我關閉平板Wifi還是正常取到值。
4. Build.SERIAL(android developer說明)
String BuildSERIAL = android.os.Build.SERIAL;
Log.v("ola_log", "BuildSERIAL:" + BuildSERIAL);
說明:硬體的唯一值。
缺點:該值必須要API Level 9才支援;這個問題看專案類型可大可小,對於某些專案來說甚至不是問題。
5. UUID(android developer說明)
String UUID_Value = UUID.randomUUID().toString();
Log.v("ola_log", "UUID_Value:" + UUID_Value);
說明:randomUUID可以隨機的製造一個唯一值,或是利用其他內建方法製造唯一值(EX:nameUUIDFromBytes (byte[] name))。
缺點:必須要自己處理UUID的製造及儲存,若使用randomUUID則代表的是"該次安裝的唯一值"。
感覺一件很簡單的事情,其實也不單純勒。