2015-11-06 60 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)