2016 年 2 月 23 日
重大更改:Android 6 和设备 ID
在 Android 6 发布之前,用户在安装新应用时经常被要求授予权限。用户经常被要求授予 android.permission.READ_PHONE_STATE
权限,这被认为是一种危险权限。这导致许多人担心应用可能会利用所授予的权限进行某些操作,而选择不安装这些应用。
Android 6 通过将权限转移到按需系统来缓解这些担忧。现在,您可以在应用需要时请求 android.permission.READ_PHONE_STATE
。但是,此更改会给 Corona SDK API 带来一个问题,该 API 允许您使用 system.getInfo("deviceID")
获取设备的设备 ID。
如果用户的设备授予 android.permission.READ_PHONE_STATE
权限,则返回设备的唯一电话 ID(IMEI、MEID 或 ESN,具体取决于运营商)。对于没有电话或未授予权限的设备,将返回操作系统分配的唯一系统 ID。
如果您的应用当前使用 deviceID 值,那么任何升级到 Android 6 的用户很可能都会拥有与早期版本 Android 不同的 deviceID
。如果保持相同的 ID 对您的应用至关重要,则您必须采取措施以确保您的应用继续获取电话 ID 而不是操作系统 ID。
您可以在 main.lua 中通过在尝试获取 deviceID 之前请求正确的 android.permission.READ_PHONE_STATE
权限来做到这一点。考虑以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
-- 获取默认 deviceID local deviceID = system.getInfo( "deviceID" ) local deviceIDText = display.newText(deviceID, display.contentCenterX, 50, native.systemFontBold, 20 ) local function appPermissionsListener( event ) -- 无论用户选择什么,我们现在要么拥有电话权限,要么没有 -- 因此,请获取当前的 deviceID,以防它与权限检查前的初始值不同。 deviceID = system.getInfo( "deviceID" ) deviceIDText.text = deviceID end -- -- 所有这些仅对 Android 6 或更高版本有效,因此请不要打扰非 Android 6 用户 -- if system.getInfo( "androidApiLevel" ) >= 23 then -- 哇!Android 6 或更高版本 -- -- 检查用户是否之前已授予权限。 -- 如果他们没有,那么我们应该提示他们请求。 -- local grantedPermissions = system.getInfo( "grantedAppPermissions" ) local hasPhonePermission = false for i = 1, #grantedPermissions do -- -- 检查特定的 READ_PHONE_STATE 权限或“电话”组权限 -- if "android.permission.READ_PHONE_STATE" == grantedPermissions[i] or "Phone" == grantedPermissions[i] then -- 找到了电话权限 hasPhonePermission = true -- 退出循环。 break end end -- -- 如果我们到达这一点并且 hasPhonePermission 为 false,则表示我们在 -- 权限列表中没有找到它,因此提示用户请求。 -- if not hasPhonePermission then -- -- 创建一个表格,用于传递给 requestAppPermission 的选项 -- local permissionOptions = { appPermission = "android.permission.READ_PHONE_STATE", urgency = "Critical", listener = appPermissionsListener, rationaleTitle = "需要读取手机状态", rationaleDescription = "此应用需要此状态才能检索之前保存的数据。现在重新请求?", settingsRedirectTitle = "警告", settingsRedirectDescription = "如果没有访问设备唯一 ID 的能力,它将无法正常运行。请在“设置”中授予相机访问权限。" } native.showPopup( "requestAppPermission", permissionOptions ) end end |
由于基于操作系统的 ID 不需要特殊权限,我们建议您今后使用操作系统生成的 ID,而不是手机 ID。
有问题吗?请加入我们的 Corona Labs Android 论坛!
费利克斯 (Felix)
发布于 16:40,2 月 25 日我正在尝试实现这段代码,但它给出了一个运行时错误,因为 system.getInfo( “androidApiLevel” ) 返回 nil。我实现了一个 Android 的检查,例如
if system.getInfo( “platformName” ) == “Android” then
但它甚至在安卓设备上返回 nil。知道这里的问题是什么吗?
最好的,
费利克斯 (Felix)
费利克斯 (Felix)
发布于 17:11,2 月 25 日啊,没关系了。将 corona 更新到最新的公共版本解决了这个问题...
夏洛特·胡克 (Charlotte Hook)
发布于 04:00,3 月 13 日由于正在发布新版本的安卓系统,这是否意味着某些旧版本的安卓系统将不再兼容?我能找到的唯一文章来自 2014 年 4 月,其中说 2.3.3 是现在最早兼容的版本,只是想知道这是否会改变
罗布·米拉克 (Rob Miracle)
发布于 12:15,3 月 13 日我们仍然支持 Android 最低版本 2.3.3,但我们不知道这种情况会持续多久。越来越多的插件要求具有更高的最低版本的功能。这种情况在不久的将来不会发生,因为我们刚刚在 2 月份发布了一个仍然支持 2.3.3 的公共版本。