2013 年 2 月 18 日
告别默认的 Android 权限
在过去的一个月里,我们一直专注于 Corona 每日构建 的许多小细节,特别是那些我称之为“隐形问题”的问题。这些问题在短期内解决似乎没有意义,但对于平台的长期健康至关重要。
其中一个隐形问题是 Android 权限,更准确地说,是默认权限。过去,我们习惯于默认启用几个默认权限
- INTERNET
- READ_PHONE_STATE
- ACCESS_NETWORK_STATE
然而,这意味着我们为不需要这些权限的应用程序强加了某些权限。在这些情况下,许多应用商店的评论会不公平地惩罚应用程序。
为了解决这个问题,我们一直想摆脱这些默认设置。事实上,我们早就想摆脱它们了,但当我们深入研究这个问题时,我们意识到这是一个相当大的问题——如果我们想正确地解决这个问题的话。
我很高兴地报告,我们终于解决了这个问题,从每日构建 1030 开始,默认权限将不复存在!
现在,我们可以采取一种简单的方法。那意味着只是删除权限,让你自己弄清楚要添加哪些权限。然而,这有严重的缺点。例如,如果你的应用程序进行了 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()
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 权限?
Joshua Quick
发布于 18:26,2 月 19 日Google 在这里记录了 Android 权限……
https://developer.android.com.cn/guide/topics/manifest/manifest-intro.html#perms
https://developer.android.com.cn/reference/android/Manifest.permission.html
我们还更新了每日构建页面上的 API 文档,以指示它们所需的权限。我们还更新了所有示例项目的“build.settings”文件,以在最新的每日构建中反映此更改。
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 中没有权限也能工作?我不明白。