告别默认的 Android 权限

告别默认的 Android 权限

在过去的一个月里,我们一直专注于 Corona 每日构建 的许多小细节,特别是那些我称之为“隐形问题”的问题。这些问题在短期内解决似乎没有意义,但对于平台的长期健康至关重要。

其中一个隐形问题是 Android 权限,更准确地说,是默认权限。过去,我们习惯于默认启用几个默认权限

  • INTERNET
  • READ_PHONE_STATE
  • ACCESS_NETWORK_STATE

然而,这意味着我们为不需要这些权限的应用程序强加了某些权限。在这些情况下,许多应用商店的评论会不公平地惩罚应用程序。

为了解决这个问题,我们一直想摆脱这些默认设置。事实上,我们早就想摆脱它们了,但当我们深入研究这个问题时,我们意识到这是一个相当大的问题——如果我们想正确地解决这个问题的话。

我很高兴地报告,我们终于解决了这个问题,从每日构建 1030 开始,默认权限将不复存在!

当 API 需要尚未请求的权限时出现的警告现在,我们可以采取一种简单的方法。那意味着只是删除权限,让你自己弄清楚要添加哪些权限。然而,这有严重的缺点。例如,如果你的应用程序进行了 Web API 调用并且没有设置 INTERNET 权限,它就会崩溃,你就会想知道为什么。

因此,按照 Corona Labs 的一贯做法,我们希望在保持 Corona 使用体验的同时,给你更多的控制权。这意味着逐个检查 API,看看哪些 API 受这些权限更改的影响。

现在,当你使用 API 并忘记设置权限时,我们会在 OS 生成的异常杀死应用程序之前捕获它。然后,我们会弹出一个警报,如这里所示,通知你缺少哪个权限。这种反馈让你的生活非常轻松,因为你确切地知道哪里出了问题。

在实践中,这意味着你需要更加注意你在 build.settings 中列出的权限,因为某些 API 需要 Android 权限才能正常工作。此外,如果你使用某些第三方服务,你可能在隐式地使用权限。在我们的示例中,我们会尝试向你展示哪些权限是必需的以及为什么。

例如,如果你需要进行 Web API 调用,你需要添加 INTERNET 权限

settings =
{
android =
{
usesPermissions =
{
"android.permission.INTERNET",
},
},
}

我们已经更新了我们所有示例代码中的 build.settings 文件,以正确显示如何执行此操作,并且还更新了每日构建 API 文档。以下事件、库、库函数和对象方法受到影响

  • heading 事件
  • location 事件
  • ads
  • analytics
  • display.capture()
  • display.captureBounds()
  • display.captureScreen()
  • facebook
  • gameNetwork
  • media.newRecording()
  • media.playVideo()
  • media.save()
  • media.show()
  • native.newMapView()
  • native.newWebView()
  • native.showWebPopup()
  • network.download()
  • network.request()
  • socket
  • store.init()
  • system.getInfo()
  • system.scheduleNotification()
  • system.vibrate()
  • mapView:getUserLocation()
  • mapView.isLocationVisible()
  • recording:startRecording()
  • webView:request()
walter
19 条评论
  • Ingemar
    发布于 17:08,2 月 18 日

    感谢您花时间把它做对了 🙂

  • J. A. Whye
    发布于 17:32,2 月 18 日

    这很酷。但是为什么不更进一步呢——如果我的应用程序使用了 Web API 调用,那么为什么 Corona SDK 不为我启用该权限呢?

    不是想给你们增加工作量,只是好奇… 😉

    Jay

    • Walter
      发布于 17:44,2 月 18 日

      很酷的想法,但例如,Corona 不会知道,在应用程序使用的过程中,稍后是否会有代码执行点调用像 system.vibrate() 这样的需要权限的 API。至少,这是一个非常非常困难的问题。我认为在一般情况下它实际上是不可能的,但你必须去问一些计算机科学理论教授 🙂

      • J. A. Whye
        发布于 22:59,2 月 18 日

        我猜我更多的是在考虑 Corona 在源代码中(编译时)看到这一点

        native.newWebView()

        ...然后知道需要哪些权限才能使其正常工作并将其添加到 build.settings 中。

        由于我已经在 Outlaw(Corona 项目管理器)中进行了一些预处理,我可能会添加一些类似的东西,但如果有需要完成的编码,并且我可以让你们而不是我来做,我将其视为一场胜利。😉

        Jay

        • Kenneth
          发布于 01:41,2 月 22 日

          你可以执行一个简单的字符串扫描来查找“native.newWebView()”,但这不会起作用,因为你可以轻松地执行:“local n = native; n.newWebView()”或“native = 1; native.newWebView()”,这意味着你必须评估代码才能找出什么指向什么。

          一旦你尝试评估代码,你就会遇到这样一个问题,即所有这些都是动态类型的,因此你正在执行的范围会对你的结果产生影响。然后还有“停止问题”,这意味着你无法确定任意代码是否实际执行。

          因此,在一般情况下,你无法确定它。但是对于大多数用户,尤其是没有经验的用户来说,如果你只执行字符串扫描并假设所有代码都被执行,可能会有很大帮助。

          关于主题:非常棒的工作!

          现在我们只需要类似的东西来选择加入 OpenFeint、Inneractive、AdMobi、Zong 等库,这样广告扫描器就不会标记 Corona 构建的应用程序。有了这个,我实际上可以直接从 Corona 发布 .apk 了 🙂。

  • Joe
    发布于 18:48,2 月 18 日

    感谢您不断改进 - 这绝对是会让很多人高兴的事情之一

  • Larry Meadows
    发布于 21:57,2 月 18 日

    我同意你,Walter。

    如果你查看所有主要的语言 Java、C++、C#,你都必须在文件和项目中包含命名空间和库才能进行编译。

    你也许可以使用预编译器,但这更麻烦。

    感谢您的更新……糟糕的是,我在看到此更新前 10 分钟上传了我的应用程序。

    我必须再做一次 🙂

    Larry

  • Daniel Williams
    发布于 17:12,2 月 19 日

    我们可以在哪里查看所有 Android 权限?

  • HaZeX
    发布于 03:54,2 月 21 日

    太棒了。我们等了很久了。我们很高兴你改变了它。

  • Peter Chen
    发布于 17:50,2 月 21 日

    这是一个很好的改进,特别是它也影响了库。以 Corona SDK 编译的 Android 应用程序为例,有些人不使用 adknowledge、flurry、inmobi、openfeint、zong 等。这些库可以自动删除吗?我确信,当这些库被删除时,大小会大大减小。

  • FloobLabs
    发布于 19:23,2 月 21 日

    谢谢大家!

  • Nameless
    发布于 06:25,2 月 22 日

    刚刚下载了最新的构建版本,并尝试在 Android 设备上测试 inneractive 示例应用程序 - 结果遇到了运行时错误!这非常有帮助,但我想不是所有的 build.settings 都已经更新了。

  • Arsalan Shah
    发布于 11:02,4 月 10 日

    我是一名大学生。我开发了一款名为“HighwayRun”的游戏(尚未发布)。我一直在恳求大学购买 Corona SDK 许可证。他们对此非常不重视,让我的应用程序处于搁置状态 :(. 现在他们最近购买了许可证,我很高兴听到这个新的构建。 😛 感谢 coronalabs. 🙂

  • Arsalan Shah
    发布于 11:49,4 月 10 日

    在新版本中,广告无法正常工作。🙁
    我已经在 build.settings 中添加了所有必需的权限。有人能告诉我这是怎么回事吗?

  • 帕特里克
    发布于 4 月 14 日 21:41

    感谢大家持续的努力。这个功能尤其是一个很好的补充。

  • 马特
    发布于 4 月 28 日 21:29

    感谢 Corona Labs 的辛勤工作!

  • 马特
    发布于 4 月 30 日 22:40

    你们对摄像头的评论让我有点沮丧,我本来都准备好要入手了。你知道这个摄像头和 SGS4 相比如何吗?

  • 帕斯卡
    发布于 3 月 26 日 16:24

    为什么这个示例在 build.settings 中没有权限也能工作?我不明白。