文章

安卓10设备信息

安卓10设备信息

任务

  1. 写一个应用,展示设备信息,可参考网上资料,但要自己敲代码,写布局。
  2. 应用完成后,写一篇文档,总结Android从5.1开始,到Android 12,在隐私方面的变化,对设备信息获取的影响。

Android 6.0

  • 对于使用 WLAN API 和 Bluetooth API 的应用,Android 移除了对设备本地硬件标识符的编程访问权WifiInfo.getMacAddress() 方法和 BluetoothAdapter.getAddress() 方法会返回常量值 02:00:00:00:00:00。
  • 必须拥有 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限,才能通过蓝牙和 WLAN 扫描访问附近外部设备的硬件标识符。

Android 7.0

  • 在Android for Work 环境开发应用中,设备所有者可以访问设备标识符。设备所有者可以使用 DevicePolicyManager.getWifiMacAddress() 访问设备的 WLAN MAC 地址。如果设备上从未启用 WLAN,则此方法将返回一个 null 值。

Android 8.0

针对所有API级别的应用

  • net.hostname 系统属性不可获取

  • 对于在 OTA 之前安装到某个版本 Android 8.0(API 级别 26)的应用,除非在 OTA 后卸载并重新安装,否则 ANDROID_ID 的值将保持不变。要在 OTA 后在卸载期间保留值,开发者可以使用密钥/值备份关联旧值和新值。

  • 对于安装在运行 Android 8.0 的设备上的应用,ANDROID_ID 的值现在将根据应用签署密钥和用户确定作用域。应用签署密钥、用户和设备的每个组合都具有唯一的 ANDROID_ID 值。因此,在相同设备上运行但具有不同签署密钥的应用将不会再看到相同的 Android ID(即使对于同一用户来说,也是如此)。

  • 只要签署密钥相同(并且应用未在 OTA 之前安装到某个版本的 O),ANDROID_ID 的值在软件包卸载或重新安装时就不会发生变化。

  • 即使系统更新导致软件包签署密钥发生变化,ANDROID_ID 的值也不会变化。

  • 要借助一个简单的标准系统实现应用获利,请使用广告 ID。广告 ID 是 Google Play 服务针对广告服务提供的唯一 ID,此 ID 可由用户重置。

针对8.0或更高版本的应用

  • 系统属性 net.dns1、net.dns2、net.dns3 和 net.dns4不再可用
  • 要获取 DNS 服务器之类的网络连接信息,具有 ACCESS_NETWORK_STATE权限的应用可以注册 NetworkRequest 或 NetworkCallback 对象。这些类在 Android 5.0(API 级别 21)及更高版本中提供。
  • Build.SERIAL 已弃用。需要知道硬件序列号的应用应改为使用新的 Build.getSerial() 函数,该函数要求具有READ_PHONE_STATE权限。
  • LauncherAppsAPI 不再允许工作资料应用获取有关主个人资料的信息。当某个用户在托管配置文件中时,LauncherApps API 的行为就像同一配置文件组的其他配置文件中未安装任何应用一样。和之前一样,尝试访问无关联的个人资料会引发 SecurityExceptions。

Android 9

  • 限制访问通话记录。Android 9 引入 CALL_LOG权限组并将 READ_CALL_LOG、WRITE_CALL_LOG和 PROCESS_OUTGOING_CALLS权限移入该组。 在之前的 Android 版本中,这些权限位于 PHONE权限组。对于需要访问通话敏感信息(如读取通话记录和识别电话号码)的应用,该 CALL_LOG 权限组为用户提供了更好的控制和可见性。如果您的应用需要访问通话记录或者需要处理去电,则您必须向 CALL_LOG 权限组明确请求这些权限。 否则会发生 SecurityException。
  • 限制访问电话号码。在未首先获得 READ_CALL_LOG权限的情况下,除了应用的用例需要的其他权限之外,运行于 Android 9 上的应用无法读取电话号码或手机状态。

  • 限制访问 Wi-Fi 位置和连接信息。在 Android 9 中,应用进行 Wi-Fi 扫描的权限要求比之前的版本更严格。 详情请参阅Wi-Fi扫描限制。类似的限制也适用于 getConnectionInfo() 函数,该函数返回描述当前 Wi-Fi 连接的 WifiInfo 对象。 如果调用应用具有以下权限,则只能使用该对象的函数来检索 SSID 和 BSSID 值:

    • ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION

    • ACCESS_WIFI_STATE

    检索 SSID 或 BSSID 还需要在设备上启用位置服务(在 Settings > Location 下)。

  • Wi-Fi 的 NETWORK_STATE_CHANGED_ACTION系统广播不再包含 SSID(之前为 EXTRA_SSID)、BSSID(之前为 EXTRA_BSSID)或连接信息(之前为 EXTRA_NETWORK_INFO)。 如果应用需要此信息,请改为调用 getConnectionInfo()。

  • 构建序列号Build.SERIAL弃用,始终设为 “UNKNOWN”,以保护用户隐私。如果需要访问设备的硬件序列号,应请求 READ_PHONE_STATE 权限,然后调用 getSerial()。

Android 10.0

  • 移除了联系人亲密程度信息

  • 随机分配MAC地址。默认情况下,在Android 10 或更高版本的设备上系统会传输随机分配的 MAC 地址。
    • 获取随机分配的 MAC 地址:设备所有者应用和资料所有者应用可以通过调用 getRandomizedMacAddress() 检索分配给特定网络的随机分配 MAC 地址。
    • 获取实际的出厂 MAC 地址:设备所有者应用可以通过调用 getWifiMacAddress()检索设备的实际硬件 MAC 地址。此方法对于跟踪设备队列非常有用。
  • 对 /proc/net 文件系统的访问权限实施了限制。在搭载 Android 10 或更高版本的设备上,应用无法访问 /proc/net,其中包含与设备的网络状态相关的信息。需要访问这些信息的应用(如 VPN)应使用 NetworkStatsManager或 ConnectivityManager类。

  • 对不可重置的设备标识符实施了限制。从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。三方应用无法声明特许权限。

  • 限制了对剪贴板数据的访问权限。除非应用是默认输入法 (IME)或是目前处于焦点的应用,否则它无法访问 Android 10 或更高版本平台上的剪贴板数据。

  • 保护 USB 设备序列号。以 Android 10 或更高版本为目标平台的应用只能在用户授予其访问 USB 设备或配件的权限后才能读取序列号。

Android 11

  • 永久 SIM 卡标识符:在 Android 11 及更高版本中,使用 getIccId() 方法访问不可重置的 ICCID 受到限制。该方法会返回一个非 null 的空字符串。如需唯一标识设备上安装的 SIM 卡,请改用 getSubscriptionId() 方法。订阅 ID 会提供一个索引值(从 1 开始),用于唯一识别已安装的 SIM 卡(包括实体 SIM 卡和电子 SIM 卡)。除非设备恢复出厂设置,否则此标识符的值对于给定 SIM 卡是保持不变的。

Android 12

  • 在 Android 12 中,当某个应用首次调用 getPrimaryClip() 以访问来自其他应用的 ClipData 时,系统会显示一条消息框消息,通知用户此次剪贴板访问。
本文由作者按照 CC BY 4.0 进行授权