Android设备的唯一且不可修改的设备ID(包括没有谷歌的设备)

时间:2015-11-06 09:48:39

标签: android

我正在开发一个应用程序,其中我将需要设备的唯一ID。

这篇文章:Is there a unique Android device ID?首先让我考虑使用ANDROID_ID。但我需要一个可靠的平板电脑和手机解决方案,有或没有任何谷歌帐户/软件,就像在中国大多数服务被阻止。我正在寻找其他解决方案

重要提示:出于安全原因,此ID必须是安全的,不会有任何更改。当然,当设备植根或有人真的想弄乱应用程序时,这是不可能的,但至少对普通用户而言。此外,Mac addressTelephonyManager.getDeviceId()不可靠。

由于我的目标是手机和平板电脑,无论是否有Google,是否可以让每台设备都无法修改独特的设备ID?

5 个答案:

答案 0 :(得分:1)

对不起,我在完全理解之前标记了这个问题。就像@Johann所说的那样,考虑根系用户进入等式会使识别设备变得更加困难。

假设您的应用程序使用webservice,用户必须以某种方式连接到Internet,即通过数据计划(使用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;
    }

希望它对你有所帮助......

答案 1 :(得分:0)

您可以使用wifi mac地址:

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

答案 2 :(得分:0)

您可以使用设备imei号码。

你想打电话 -

  android.telephony.TelephonyManager.getDeviceId().

您需要在AndroidManifest.xml中获得以下权限:

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

答案 3 :(得分:0)

我认为使用Mac地址或Wi-Fi模块识别设备会很好。即使在廉价的中国设备上,它也非常独特。 看看WifiInfo类: http://developer.android.com/reference/android/net/wifi/WifiInfo.html

应该适用于设备识别。

答案 4 :(得分:0)

设备植根后,可以修改IMEI号和MAC / WiFi地址。此外,从Android Marshmallow,用户可以撤销对WiFi / MAC地址和蓝牙地址的许可。如果您尝试检索这些值,您将看到一个简单的虚拟ID,这在所有Marshmallow设备中都很常见。
检查this link