Android 10仍可使用ANDROID_ID

12

根据谷歌的说法,在Android 10系统上,ANDROID_ID(也称为SSAID)不应该可访问,除非满足一些先决条件(请参见: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可以轻松地写入日志记录中。该值不是虚拟值而是实际的ANDROID_ID。 这已在模拟器和真实设备(Pixel 2)上进行了测试。


它正在运行于API 29。 - Sebastian Dine
你说在模拟器和仿真器上返回相同的结果,是这样的吗,@SebastianDine?从文档中可以猜测你得到了“_placeholder data_”。 - Giorgos Neokleous
不,它返回设备和模拟器的不同结果。它不是占位符。 - Sebastian Dine
7
为什么你认为Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID)会失败?在受影响的方法中抛出SecurityException的时候,它并没有被提及。 - Alex Lipov
2
@SebastianDine,从这个链接https://developer.android.com/about/versions/10/privacy/changes,我没有找到说ANDROID_ID将不再可访问的地方。请问您能指出来吗?该链接提到了设备序列号、IMEI、MEID、设备ID、SIM序列号和订阅ID。现在这些标识符与ANDROID_ID之间存在一个重大区别,即后者在恢复出厂设置时会更改,而IMEI等标识符是不可重置的(除非设备已经root)。我也在寻找像ANDROID_ID这样的ID。那么你最终使用了什么? - Dibzmania
显示剩余5条评论
1个回答

7

或许有些晚了,但根据Android O中的这篇文章(Android开发者博客)

  • ANDROID_ID值在包卸载/重新安装时不会改变,只要包名和签名密钥相同。应用程序可以依赖此值来在重新安装后保持状态。
  • 如果应用程序安装在运行较早版本的Android设备上,则当设备更新为Android O时,Android ID仍然保持不变,除非应用程序被卸载并重新安装。
  • Android ID值仅更改如果设备进行出厂设置或在卸载和重新安装事件之间签名密钥旋转。
  • 此更改仅适用于那些配备Google Play服务和广告ID的设备制造商。其他设备制造商可能提供可重置的替代ID或继续提供ANDROID ID。

我有一个疑问,请帮我解答。如何获取用户的唯一ID,即使清除数据也不会改变?我听说过“广告ID”,它能解决我的问题吗?请帮我解决这个问题。谢谢。 - Ravindra Kushwaha
获取一个唯一的ID并不容易,因为Google想保护用户免受不必要的跟踪和隐私问题。如果设备具有移动网络支持,您可以使用IMEI,但这需要额外的权限。至于广告ID,用户可以重置它。我的首选解决方案通常是ANDROID_ID。 - Poorya
谢谢你的建议!!!是否有可能获得所有应用程序都相同且在设备重新启动或数据清除时不会回滚的ID? - Ravindra Kushwaha
我能想到的唯一符合所有要求的解决方案是 IMEI 号码,正如之前提到的,只有带有蜂窝支持的设备才有此号码。 - Poorya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接