【问题标题】:Multiple Runtime Permissions - Only Requesting First One多个运行时权限 - 仅请求第一个
【发布时间】:2017-07-20 15:44:55
【问题描述】:

我试图在我的应用程序开始时请求多个权限,但只请求一个权限,然后屏幕冻结。我正在尝试请求:READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGECAMERABODY_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


【解决方案1】:

也许在授予Permission 之后Activity 被销毁并重新创建是问题的一部分:

你请求第一个权限,你得到它,你请求第二个Permission(所以你想启动一个Dialog,它不是你的应用程序的一部分并等待结果 - 但也许运行时会不为正在关闭的应用显示新的Dialog?)

另外,您还有 while 循环,在授予 Permission 之前阻塞您的 UI 线程。即使Dialog(对于CAMERA)出现,它也会永远循环。

每次向用户请求Permission时,都会在onRequestPermissionsResult()中得到结果,所以此时你可以进行下一步,例如请求下一个Permission

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 2016-07-22
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多