2015-11-06 63 views
1

我正在開發一個應用程序,我需要一個設備的唯一ID。Android設備的獨特和不可修​​改的設備ID(包括沒有谷歌的設備)

此文章:Is there a unique Android device ID?首先讓我考慮使用ANDROID_ID。但我需要平板電腦和手機的可靠解決方案,有或沒​​有任何谷歌帳戶/軟件,就像中國的大多數服務被封鎖一樣。我正在尋找其他解決方案。

重要事項:出於安全原因,此ID必須是安全的,以免發生任何變化。當然,當設備植根於人或者真正想要與應用程序混淆時,這是不可能的,但至少對於普通用戶來說。此外,Mac addressTelephonyManager.getDeviceId()不可靠。

由於我針對手機和平板電腦(無論是否帶有Google),是否會爲每個設備獲取唯一設備ID無法修改的方法?

+0

幾乎所有從您的應用訪問的任何內容都可以使用root修改。 –

+0

這個ID並不是按照原樣使用,它將與其他參數混合並加密。我知道如果有人真的想要它可能,但對於普通用戶,我希望有最安全的解決方案 – Virthuss

+0

@FabinPaul我'要求一個安全的解決方案,包括非谷歌設備以及。我看到這個話題的人,它實際上是關於這個話題最有名的一個。但它對我的情況沒有幫助。 – Virthuss

回答

0

您可以使用WiFi MAC地址:

private String getWifiMacAddress() { 
     WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
     WifiInfo info = manager.getConnectionInfo(); 
     return info.getMacAddress(); 
    } 
+0

https://play.google.com/store/apps/details?id=com.wireless.macchanger:P –

+0

感謝您的回答,但這不夠安全。從谷歌:有可能從設備的WiFi或藍牙硬件檢索一個Mac地址。我們不建議將此用作唯一標識符。首先,並非所有設備都具有WiFi。另外,如果WiFi未打開,硬件可能不會報告Mac地址。 – Virthuss

+0

沒有wifi的設備是否存在? :O笑話...我認爲這是不可能的你想要的。當用戶是'root'時可以做任何事情。 –

0

您可以使用該設備的IMEI號碼。

你想呼叫 -

android.telephony.TelephonyManager.getDeviceId(). 

你需要在你的AndroidManifest.xml以下權限:

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

感謝但據我所知,這不適用於平板電腦... – Virthuss

+0

它也可以改變:https://play.google.com/store/apps/details?id=com.vivek.imeichanger –

0

設備植根後,可以修改IMEI號碼和MAC/WiFi地址。此外,從Android Marshmallow,用戶可能會撤銷對WiFi/MAC地址和藍牙地址的許可。如果您嘗試檢索這些值,您將看到一個簡單的虛擬身份證,該身份證在所有棉花糖設備中都是常見的。
檢查this link

1

對不起,我在充分理解它之前標記了此問題。就像@Johann所說,考慮將根植用戶納入等式將會使識別設備變得更加困難。

使用假設您的應用程序使用web服務,用戶必須以某種方式連接到互聯網,即通過數據計劃(用戶使用SIM卡)或WiFi。

因此,從硬件和生成結果字符串的唯一哈希碼組合的ID,你應該能夠唯一標識設備(理論上)。但我沒有測試過這個代碼,所以請檢查一下是否適合你。

final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE); 

final String tmDevice, tmSerial, androidId, wifi; 
tmDevice = "" + tm.getDeviceId(); 
tmSerial = "" + tm.getSimSerialNumber(); 
androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); 
WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
wifi = ""+ manager.getConnectionInfo().getMacAddress(); 

String unique_id = makeSHA1Hash(tmDevice + tmSerial + androidId + wifi); 

makeSHA1Hash

public String makeSHA1Hash(String input) 
     throws NoSuchAlgorithmException, UnsupportedEncodingException 
    { 
     MessageDigest md = MessageDigest.getInstance("SHA1"); 
     md.reset(); 
     byte[] buffer = input.getBytes("UTF-8"); 
     md.update(buffer); 
     byte[] digest = md.digest(); 

     String hexStr = ""; 
     for (int i = 0; i < digest.length; i++) { 
      hexStr += Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1); 
     } 
     return hexStr; 
    } 

希望它可以幫助你...

+0

沒問題!很高興你刪除國旗:)其餘的,似乎沒有「真正的」解決方案我的問題,所以我會留在ANDROID_ID和加密,如你所建議的。 – Virthuss

0

您可以使用Android設備第一次啓動時生成的唯一序列號,並且在生命週期中保持不變。

Settings.Secure.getString(getContext().getContentResolver(), Settings.Secure.ANDROID_ID)