假设您有这样的方法:
public boolean saveFile (Url url, String content) {
// save the file, this can be done a lot of different ways, but
// basically the point is...
return save_was_successful;
}
在整个应用程序中,如果您想将文件保存到外部存储,您可以执行类似...
if (saveFile(external_storage_url, "this is a test")) {
// yay, success!
} else { // notify the user something was wrong or handle the error }
这是一个简化的例子,所以不要谈论我关于阻止 UI、正确处理异常等的案例。如果你不喜欢文件保存,你可以想象一个getContact()
或getPhoneState()
什么。关键是它是一个需要权限的操作,它返回一些值,并且在整个应用程序中使用。
在 Android <= Lollipop 中,如果用户已安装并同意授予android.permission.WRITE_EXTERNAL_STORAGE
或其他任何内容,一切都会好起来的。
但是在新的 Marshmallow (API 23)运行时权限模型中,在将文件保存到外部存储之前,您应该 (1) 检查权限是否已被授予。 如果不是,可能 (2)显示请求的理由(如果系统认为这是一个好主意)与祝酒或其他任何东西,并且 (3) 要求用户通过对话授予权限,然后基本上坐下来等待打回来...
(所以你的应用程序坐在那里,等待......)
(4) 当用户最终响应对话框时,onRequestPermissionsResult()方法将触发,您的代码现在 (5) 必须筛选他们实际响应的权限请求,无论用户说是还是否(对我的知道没有办法处理“不”与“不并且不要再问”),(6)首先弄清楚他们试图完成的事情,这促使整个请求许可过程,所以程序终于可以 (7)继续做那件事了。
要了解用户在步骤 (6) 中尝试执行的操作,需要事先传递一个特殊代码(“权限请求响应”),该代码在文档中描述为权限请求类型的标识符(相机/联系人/等) .) 但在我看来更像是“具体来说,当你意识到你需要请求权限时你正在尝试做的事情”代码,因为相同的权限/组可以在你的代码中用于多种目的,所以获得许可后,您需要使用此代码将执行返回到适当的位置。
我可能完全误解了这应该是如何工作的——所以请让我知道我是否离题了——但更大的一点是我真的不知道如何考虑用/saveFile()
由于异步“等待用户响应”部分,前面描述的方法。我考虑过的想法很老套,而且肯定是错误的。
今天的Android Developer Podcast暗示可能会有一个同步解决方案指日可待,甚至有人谈到了 Android Studio 中一种神奇的、一步 alt-enter 类型的“添加权限请求”工具。尽管如此,如何将运行时许可过程推入一个saveFile()
或其他任何东西 - 我正在考虑以下内容:
public boolean saveFile(Url url, String content) {
// this next line will check for the permission, ask the user
// for permission if required, maybe even handle the rationale
// situation
if (!checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE,
R.string.permission_storage_rationale))
{
return false; // or throw an exception or whatever
} else {
// try to save the file
return save_was_successful;
}
}
checkPermission()
因此,如果用户没有并且拒绝授予权限,上述操作将失败。也许可以使用循环checkPermission()
来尝试最多询问 3 次或其他内容,或者如果该方法处理了一个理智的不烦人的策略,那就更好了。
这样的事情可能吗?可取的?任何这样的解决方案会阻止 UI 线程吗?从播客看来,谷歌可能会有一个类似的解决方案即将推出,但我想了解是否有什么东西——一个便利类、一个模式、什么东西——不需要每个人都必须重构所有需要权限的操作,我必须假设这可能会变得非常混乱。
抱歉这个冗长的问题,但我想尽可能完整。我会把我的答案从广播中删除。谢谢!
更新:这是上面提到的播客的成绩单。
大约在41:20 收听。在本次讨论中:
粗略的成绩单:
Tor Norbye(工具团队):“所以对于开发人员来说,这似乎不应该做很多工作。但我理解部分问题是这些不是同步调用,对吧?所以你必须——实际上改变你的 Activity 的编写方式,让它有一个回调——所以它真的有点像一个状态机……对于这个状态,你—— ”
Poiesz(产品经理):“啊-我想-有一个-可能有同步响应的选项-- ”
诺拜:“哦。那会让事情—— ”
Poiesz:“我可以在内部与人们交谈。我记得有一次关于同步的讨论——但我们可以找到答案。 ”
Norbye:“是的。事实上,我们可能应该把它变成工具。在那里你有一个简单的重构...... ”
然后他谈到了在工具中使用注释来确定哪些 API 需要权限..(到目前为止,这在 IMO 中还没有那么好用),以及他希望有一天这些工具在发现未经检查的“危险”时如何实际生成所需的代码" 方法调用:
Norbye:“ ......那么如果你也在 M 上,它会说,‘嘿,你实际上是在检查这个权限还是在捕捉安全异常?’,如果你不是,我们会说“你可能需要做一些事情来请求这里的许可。” 不过,我想要的是有一个快速修复,你可以去“CHING!” 它插入了所有正确的东西来询问,但是当我看到事情的时候,这需要重组很多东西——添加接口和回调,改变流程,而我们做不到。但如果有一个简单的同步模式作为临时的东西或永久的东西,那会[很棒]。 ”