【发布时间】:2017-07-20 15:44:55
【问题描述】:
我试图在我的应用程序开始时请求多个权限,但只请求一个权限,然后屏幕冻结。我正在尝试请求:READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE、CAMERA 和 BODY_SENSORS。
让我感到困惑的是,我启动这个应用程序只要求读取和写入权限,它会要求它们,就是这样,应用程序的其余部分会顺利运行,但在添加其他两个之后,应用程序会冻结。
旁注:这有点烦人,但我做权限的方式是我马上要求他们,所以当应用程序打开并且权限弹出窗口出现时它仍然是一个白屏。接受读/写权限后,应用程序冻结并停留在此白屏上。另外,我肯定也将权限添加到我的清单中。
我将包括我的一个权限调用的样子,因为所有其余的实际上都是相同的,只是更改需要哪个权限。下面我包括我的CAMERA 的样子:
int permissionCheck3 = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
if(permissionCheck3 != PackageManager.PERMISSION_GRANTED){
if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)){
showExplanation("Permission Needed", "Rationale", Manifest.permission.CAMERA, REQUEST_PERMISSION_CAMERA);
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CAMERA);
}
}
while(permissionCheck3 != PackageManager.PERMISSION_GRANTED){
permissionCheck3 = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
}
在我分配 TextViews、Buttons 和其他类似的东西之后,我在我的 onCreate 应用程序的一开始就使用上面的代码。
private void showPhoneStatePermissionCAMERA(boolean displayToast){
int permissionCheckCAMERA = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
if(permissionCheckCAMERA != PackageManager.PERMISSION_GRANTED) {
if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
showExplanation("Permission Needed", "Rationale", Manifest.permission.CAMERA, REQUEST_PERMISSION_CAMERA);
} else {
requestPermission(Manifest.permission.CAMERA, REQUEST_PERMISSION_CAMERA);
}
} else {
if(displayToast){
Toast.makeText(SignIn.this, "CAMERA Permission (already) Granted!", Toast.LENGTH_SHORT).show();
}
}
}
这里有更多信息:我一直在对其进行更多测试,并且发生了一些有趣的事情:当我第一次进入应用程序时,它会请求第一个权限,然后冻结。如果我退出应用程序并重新打开它,它会请求第二个权限,然后冻结,依此类推,直到所有权限都被接受或拒绝,然后继续应用程序。
也许不相关,但是当我在应用程序启动之前点击运行时,我不断收到java.util.zip.ZipException: File too short to be a zip file: 0 一两次。
任何帮助将不胜感激
【问题讨论】:
-
我不确定你的应用为什么会死机,所以我不会发布答案。但也许在授予权限后 Activity 被销毁并重新创建的事实是问题的一部分:您请求第一个权限,您获得它并请求第二个权限(所以您想启动一个不是您的应用程序的一部分并等待结果 - 但也许运行时不会为正在关闭的应用程序显示新的对话框?)另外,您有 while 循环,阻塞您的 UI 线程,直到授予权限。即使没有显示对话框(用于 CAMERA),它也会永远循环
-
@0X0nosugar 感谢您的回复!我一直在尝试使用它,所以我的应用程序将等到它收到答案,直到它进入下一次权限尝试,但我没有任何成功。你有什么方法可以推荐,让我等待一个人的回应,直到它开始下一个?再次感谢
-
每次向用户请求权限,都会在
onRequestPermissionsResult()得到结果,所以此时可以进行下一步,比如请求下一个权限。 -
@0X0nosugar 成功了!非常感谢您的帮助,请将您的两个 cmets 作为问题发布,以便我将其标记为答案。
标签: android permissions