我正在尝试在应用程序启动时请求多个权限,但只会询问其中一个权限,然后屏幕会冻结。我正在尝试要求: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
一次或两次。
任何帮助将不胜感激
答案 0 :(得分:2)
在授予Activity
之后,Permission
被销毁并重新创建的事实可能是问题的一部分:
你要求获得第一个许可,你得到它并且你要求第二个Permission
(所以你想要开始一个不属于你的app的Dialog
并等待结果 - 但是也许运行时不会为正在关闭的应用程序显示新的Dialog
?)
另外,你有while循环,阻止你的UI线程,直到Permission
被授予。在Dialog
(CAMERA
)甚至出现的情况下,它将永远循环。
每当您向用户请求Permission
时,您都会在onRequestPermissionsResult()
中获得结果。此时您可以执行下一步,例如请求下一个Permission