Android设备是否具有唯一ID,如果是这样,使用Java访问它的简单方法是什么?
我正在开发一个针对Android 4.0(API 14)及更高版本的Android应用程序.
我正在寻找一个每个设备唯一的序列号,并且这个序列号永远存在(与设备一起死亡,在出厂重置后不会改变).
我在网上发现了很多关于Android设备的唯一标识符的结果,但在android.os.Build.SERIAL数字上却很少.
到目前为止,我已经消除了ANDROID_ID的使用,因为它可能会在出厂重置后发生变化.我也消除了IMEI的使用,因为Android设备可能是非手机的.我无法使用wifi或蓝牙MAC ADDRESS,因为如果未启用硬件(基于我在网络上找到的内容),设备可能没有这样的硬件和/或这样的mac地址可能无法读取.
我相信我可能会去Android设备序列号.
可以使用android.os.Build.SERIAL轻松访问它(因为它是在API级别9中添加的,不需要任何其他权限).
我的问题是:
考虑到我的应用程序针对Android 4.0(API 14)及更高版本,是每个设备唯一的android设备的android.os.Build.SERIAL号码吗?
目前,android.os.Build.SERIAL的文档指示:硬件序列号(如果可用).仅限字母数字,不区分大小写. 这是否意味着序列号可能不可用?
什么是满足上述条件的另一种替代方案?
我想要一些Android设备的唯一ID.我用以下代码尝试过它
String ts = Context.TELEPHONY_SERVICE;
TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(ts);
Run Code Online (Sandbox Code Playgroud)
但我知道这只适用于手机.
如果我的应用程序在某些笔记本电脑,上网本或其他类型的设备上运行怎么办?在这种情况下如何获得唯一ID?
如何以编程方式访问下图中显示的值?

Google刚刚发布了Android 4.2,其中包括在单个设备上支持多个用户配置文件:http://developer.android.com/about/versions/android-4.2.html#MultipleUsers.
Google表示这对应用程序是透明的,但我认为它可能会对用于识别设备,用户和安装的数据模型产生影响.
一个问题是使用android_id.上面链接页面上的建议建议通过android_id以外的方法之一识别设备,但我相信android_id被广泛用于此目的.
我的主要问题是 - 每个用户配置文件都有自己的android_id,其含义是什么?
安装新操作系统或完成硬重置时会生成新的android_id - 在创建新的用户配置文件时可能会生成一个新的(这是问题#1)?我想可能不是,所以一个应用程序可以安装多次同一个android_id - 我认为这可能会破坏某些应用程序的服务器端数据模型.
无论哪种方式,根据您识别设备的方式,您现在可以发现特定应用可以在单个设备上进行多次安装.
另一个问题是用户.据推测,每个配置文件可以包含任意数量的Google帐户,但每个配置文件中的一个Google帐户必须与游戏商店相关联.我认为你的应用也可能有多个同时安装使用相同的设备(通过android_id)和同一个用户.我认为多个配置文件功能的常见用途是让单个用户在手机上拥有家庭和工作资料 - 通常使用不同的Google帐户,但在某些情况下,他们可能在每个配置文件中拥有相同的Google帐户(例如他们不需要两次付钱).
附注
以下是对新ARC平台(Android on Chrome)上ANDROID_ID 的类似讨论.小心 - ARC上的行为与Android上的行为不同.
可能重复:
如何获取Admob的设备ID
我正在我的Android设备上测试adMob并跟随文档,我正在尝试让设备ID执行adRequest.但是,我无法在logCat中找到设备ID!我做错了什么?
AdRequest adRequest = new AdRequest();
adRequest.addTestDevice(AdRequest.TEST_EMULATOR);
adRequest.addTestDevice("test");
Run Code Online (Sandbox Code Playgroud)
编辑:它不是重复,其他帖子的那些方法对我不起作用.
我需要获取安装了我的应用程序的Android设备的硬件序列代码.您可以看到此硬件序列号Settings > About Device > Status > Serial number.
我虽然可以使用它Settings.Secure.ANDROID_ID or android.os.Build.SERIAL,但它们都没有用,这意味着它们没有给我我想要的唯一标识符.例如android.os.Build.SERIAL,当您运行命令adb devices时,获取ADB上显示的唯一ID .
请注意,这个问题的目标不是找到可以帮助我的另一个唯一标识符,而只是获取设备硬件序列号.
谢谢您的帮助.
编辑:
请注意,我不是在寻找字符串android.os.BUILD.SERIAL提供的值.我知道如何获得这个价值,但我对此并不感兴趣.
我有三星设备,因此,他们使用的序列号与android.os.BUILD.SERIAL提供的序列号不同.
目前,我使用MAC地址作为Android设备的标识符.
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wInfo = wifiManager.getConnectionInfo();
String mac = wInfo.getMacAddress();
Run Code Online (Sandbox Code Playgroud)
但是,我发现mac某些用户的设备是空的.我有点困惑为什么它可能是空的.
如果你能找出原因,那就是最好的!
否则,您能否提供识别Android设备的替代方案?
我们如何从Android平板电脑(Android 3.0 SDK HoneyComb)获取唯一设备ID?
我还发现我们可以通过使用以下方式获取唯一的Android设备ID:String deviceId = Settings.System.getString(getContentResolver(),Settings.System.ANDROID_ID);
但是这里写的是Although, it is not guaranteed that the Android ID will be an unique identifier..
我也经历了一些SO问题:
并且还引用了这篇文章:http://android-developers.blogspot.com/2011/03/identifying-app-installations.html.
但我很困惑 how do we get/have Unique Device ID from the Android Tablet type of Device?
我刚刚将C2DM功能添加到我的Android应用程序中.
如果在我的应用程序中启动C2DM,则会发生以下情况.
从intent中检索设备令牌并将其发送到我的服务器
从那一刻起,一切都很好.客户端收到推送通知等.如果以下情况发生,则会出现问题:
用户在不禁用推送的情况下卸载应用程序.(完全删除它不仅更新)
如果在步骤5之后发送推送通知,我的应用仍会收到此通知.似乎从先前安装中检索到的令牌仍处于活动状态,并重新连接到我的应用程序的新实例.
这导致了以下问题:
这是C2DM系统中的错误还是我的设置有问题?
更新
我遵循了Berdons的建议并做了以下事情:
出于测试目的,每次我的应用程序启动时,只启动取消注册Intent.发送取消注册后,我的服务器的推送通知不会发送到我的应用程序.这似乎可以解决问题,但如果我现在进入C2DM设置屏幕并打开我的应用程序的推送通知,所有旧令牌再次激活,我会收到我在我的应用程序的当前安装中未注册的信息.
下一次更新
看来我不是唯一有这个问题的人:
我希望谷歌能够管理这些令牌,使得同一设备的旧令牌在发布新令牌后被禁用.我还希望在我向该应用程序发送取消注册Intent所有令牌后,该设备被标记为无效或从Google服务器中永久删除.如果这是某种形式的谷歌设计决定的特殊用例我不明白请赐教.
android ×10
admob ×1
android-c2dm ×1
android-wifi ×1
eclipse ×1
java ×1
multi-user ×1
settings ×1