独特的设备ID

时间:2010-08-11 13:55:21

标签: android

Android手机上是否有任何唯一ID?如果是那么它有多少位数? 我如何通过我的程序访问它?

由于 迪帕克

3 个答案:

答案 0 :(得分:5)

使用IMEI,IMSI ......时会出现几个问题:

http://android-developers.blogspot.pt/2011/03/identifying-app-installations.html

推荐方法是使用:

http://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID

String unique_id = android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);

答案 1 :(得分:4)

答案 2 :(得分:3)

有关如何为安装应用程序的每个Android设备获取唯一标识符的详细说明,请参阅此官方Android开发人员博客帖子:

http://android-developers.blogspot.com/2011/03/identifying-app-installations.html

最好的方法是在安装时生成一个自己,然后在重新启动应用程序时读取它。

我个人认为这是可以接受但不理想的。 Android提供的任何一个标识符都不适用于所有情况,因为大多数都依赖于手机的无线电状态(wifi开/关,蜂窝开/关,蓝牙开/关)。其他像Settings.Secure.ANDROID_ID必须由制造商实施,并不保证是唯一的。

以下是将数据写入INSTALLATION文件的示例,该文件将与应用程序在本地保存的任何其他数据一起存储。

public class Installation {
    private static String sID = null;
    private static final String INSTALLATION = "INSTALLATION";

    public synchronized static String id(Context context) {
        if (sID == null) {  
            File installation = new File(context.getFilesDir(), INSTALLATION);
            try {
                if (!installation.exists())
                    writeInstallationFile(installation);
                sID = readInstallationFile(installation);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return sID;
    }

    private static String readInstallationFile(File installation) throws IOException {
        RandomAccessFile f = new RandomAccessFile(installation, "r");
        byte[] bytes = new byte[(int) f.length()];
        f.readFully(bytes);
        f.close();
        return new String(bytes);
    }

    private static void writeInstallationFile(File installation) throws IOException {
        FileOutputStream out = new FileOutputStream(installation);
        String id = UUID.randomUUID().toString();
        out.write(id.getBytes());
        out.close();
    }
}