android - Android 10 仍可使用 ANDROID_ID
问题描述
根据谷歌的说法,如果没有一些先决条件,ANDROID_ID(也称为 SSAID)不应该在 Android 10 系统上访问(参见:https ://developer.android.com/about/versions/10/privacy/changes )
• If your app targets Android 10 or higher, a SecurityException occurs.
• If your app targets Android 9 (API level 28) or lower, the method
returns null or placeholder data if the app has the READ_PHONE_STATE
permission. Otherwise, a SecurityException occurs.
我的问题是,我仍然能够在没有上述任何前提条件的情况下访问 ANDROID_ID。
我创建了一个目标平台为 Android 10 API 级别 29 的 Kotlin 项目。
在这个项目中,我运行了这段代码:
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.Settings
import android.util.Log
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.i("ANDROID ID", "##### READ Android ID ######")
try {
val my_android_id = Settings.Secure.getString(this.contentResolver, Settings.Secure.ANDROID_ID)
Log.i("ANDROID ID", my_android_id)
}
catch (e: SecurityException){
Log.i("ANDROID ID", "Secure Exception!")
}
}
}
结果是,ANDROID_ID 被写入 logcat 没有任何问题。该值不是虚拟值,而是实际的 ANDROID_ID。这已经在模拟器和真实设备(Pixel 2)上进行了测试。
解决方案
也许为时已晚,但根据 android O android developer's blog中的这篇文章
- 只要软件包名称和签名密钥相同,ANDROID_ID 值不会在软件包卸载/重新安装时更改。应用程序可以依靠此值在重新安装时保持状态。
- 如果应用程序安装在运行早期版本 Android 的设备上,则当设备更新到 Android O 时,Android ID 保持不变,除非卸载并重新安装该应用程序。
- 仅当设备恢复出厂设置或签名密钥在卸载和重新安装事件之间轮换时,Android ID 值才会更改。
- 只有附带 Google Play 服务和广告 ID 的设备制造商才需要进行此更改。其他设备制造商可能会提供替代的可重置 ID 或继续提供 ANDROID ID。
推荐阅读
- c# - 如何在组合框中使用“foreach”
- sql - 表中的 SQL 计数
- c# - 根据特定条件添加Xelement c#
- c++ - 在结构中添加 n 枚举命名空间时出错
- c# - 生成所有长度为 M (1
感谢您抽出时间来阅读。我正在做一个更大的项目,该项目需要一个根据标题中描述的规则生成所有数字的函数。如果输入为 M=3 且 N=5 输出应为:111,112,113,114,115,121....555 对于输入 M=4 且 N=2 输出应为:1111,1112,1121...2222
很长一
- node.js - 皮诺转运蛋白和 PM2
- bash - Compute Engine 在实例启动时启动节点服务器
- javascript - Ajax / JQuery - 成功时显示闪存消息
- swift - viewDidLayoutSubviews() 问题
- vim - 安装“vim-plug”后,我无法再编辑 .vimrc