Android设备是否具有唯一ID,如果是这样,使用Java访问它的简单方法是什么?
我有一个应用程序,我想作为付费应用程序进入市场.我想有其他版本的"试用"版本,时间限制为5天?
我该怎么做呢?
我正在开发一个针对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的各种哈希和排列来识别我的用户....
但事实证明,9774d56d682e549c是一个神奇的ID返回
Secure.getString(getContentResolver(), Secure.ANDROID_ID);
Run Code Online (Sandbox Code Playgroud)
对于大量的设备......似乎我构建的每个模拟器都具有相同的ID,并且许多其他人的手机(许多moto机器人!)和闪存的OS mods倾向于返回相同的重复值.非MotoDroid/Non-Flashed手机似乎都给了我一个独特的字符串.但是这个在我的DB中大约有60次!
我将优化我的应用程序以在注册之前检查该字符串,但是建议的方法是处理它以获得另一个唯一值?
我目前的想法是检查它,生成一个非常大的随机值,哈希它,然后存储比SharedPreferences然后使用ANDROID_ID或存储在sharedprefs中的那个(如果用户手机给出了值).任何人都有更好的想法,或者这似乎足以缓解这个疯狂的错误?
任何人都可以告诉我Android中设备UDID的长度,因为我在Android中获得了UDID,它只有16个字符,但iPhone UDID长度为40.
我使用以下代码来检测ID:
id = android.provider.Settings.System.getString(super.getContentResolver(),
android.provider.Settings.Secure.ANDROID_ID);
Run Code Online (Sandbox Code Playgroud) 如上所述, Oreo为每个应用程序提供了唯一的ANDROID_ID,这使得上一个命令无法按照我的意愿获取id.
adb shell settings get secure android_id
Run Code Online (Sandbox Code Playgroud)
我怎么能在Oreo上获得特定应用所看到的android id?
欢迎Root和非root解决方案.
我有一个 Web 应用程序,它为每个用户保留一个用户 ID 和 Firebase 通知令牌。用户和令牌在 Android 设备上创建并发送到服务器,因此服务器知道将通知发送到哪里(因为令牌)。
这里的问题是,一个用户可以登录多个设备。如果用户在两个设备上,那么我应该向两个设备发送通知。Web 应用程序知道一个用户 ID 的 2 个令牌。那没问题。
但是如果我在同一台设备上卸载并安装该应用程序呢?我为用户获得了一个新令牌,因此我将其保存到 Web 应用程序中,但随后我为一个用户 ID 获得了 3 个令牌。这是不正确的,因为我应该只有 2 个令牌(一个令牌是旧的)。
我知道我也可以保存设备 ID (UUID),所以我知道那台设备上的令牌已更改,因此我可以删除设备的旧令牌。但是对于 Android SDK 23 及更高版本,我需要请求特殊权限才能读取 UUID。但我不想打扰用户要求访问 UUID 的权限。
所以我这里有问题。我只想为我的 Web 应用程序上的一个用户 ID 保留 VALID 令牌(如果用户有 2 部手机,那么我应该只为用户保留 2 个令牌),但如果没有用户接受许可,我不知道如何。
请在这里帮助我,我真的找不到标准解决方案和答案:(我想有一些标准解决方案。
谢谢!
Android Q 限制对 IMEI 和序列号的访问。它仅适用于具有特殊运营商许可的平台和应用程序。此外,权限 READ_PRIVILEGED_PHONE_STATE 不适用于非平台应用程序。
现有版本(Android P、Android O、Android M)我们使用序列号来唯一标识设备。现在,我们在尝试访问设备标识符时遇到了以下异常。
Android Q 限制对 IMEI 和序列号的访问。
06-21 12:37:07.460 1250 2555 W DevicePolicyManager: Package com.nagra.nmp.corepaktest (uid=10201, pid=32694) cannot access Device IDs
06-21 12:37:07.460 1250 2555 W TelephonyPermissions: reportAccessDeniedToReadIdentifiers:com.nagra.nmp.corepaktest:getSerial:isPreinstalled=false:isPrivApp=false
06-21 12:37:07.464 32694 32718 W System.err: java.lang.SecurityException: getSerial: The user 10201 does not meet the requirements to access device identifiers.
06-21 12:37:07.464 32694 32718 W System.err: at android.os.Parcel.createException(Parcel.java:2069)
06-21 12:37:07.464 32694 32718 W System.err: at android.os.Parcel.readException(Parcel.java:2037)
06-21 12:37:07.465 32694 32718 …Run Code Online (Sandbox Code Playgroud) 我现在面临一个大问题.在Android官方参考中找到:http: //developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID
public static final String ANDROID_ID
*在API级别3中添加
在设备首次启动时随机生成的64位数字(作为十六进制字符串),应在设备的生命周期内保持不变.(如果在设备上执行恢复出厂设置,则该值可能会更改.)常量值:"android_id"*
但是有超过500个平板电脑出售(A10 AllWinner)ANDROID_ID并非真正随机生成,我看到(从我的网络服务日志中)有几个设备具有相同的数字!
为什么?
我该如何解决这个问题?如何生成唯一ID?假设所有设备的串行代码始终相同(多个Android设备上的序列号相同.Adb无用.如何更改序列号?)并且MAC地址无法始终可用.