根据谷歌的说法,在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)上进行了测试。
Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID)
会失败?在受影响的方法中抛出SecurityException
的时候,它并没有被提及。 - Alex Lipov