【问题标题】:ACCESS_FINE_LOCATION permissionsACCESS_FINE_LOCATION 权限
【发布时间】:2017-10-24 16:48:59
【问题描述】:

我一直在尝试弄清楚如何在 API 23+ 上正确设置 CAMERAACCESS_FINE_LOCATION 的 android 权限。

我的程序将请求CAMERA,但它不会在运行时请求ACCESS_FINE_LOCATION 权限。

我已阅读 permissionslocation 开发人员页面,但我似乎无法掌握如何正确请求权限。我也通过stackoverflow查看了答案,但仍然不明白。

谁能解释我在代码中做错了什么,以及如何解决它?

我的代码:

    private void connectCamera() {
    CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    try {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) ==
                    PackageManager.PERMISSION_GRANTED) {
                cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mBackgroundHandler);
            } else {
                if (shouldShowRequestPermissionRationale(android.Manifest.permission.CAMERA))  {
                    Toast.makeText(this,
                            "Video app required access to camera and location", Toast.LENGTH_SHORT).show();
                }
                requestPermissions(new String[]{android.Manifest.permission.CAMERA,
                        android.Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.ACCESS_COARSE_LOCATION
                }, REQUEST_CAMERA_PERMISSION_RESULT);
            }

        } else {
            cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mBackgroundHandler);
        }
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}


    @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_CAMERA_PERMISSION_RESULT) {
        if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(getApplicationContext(),
                    "Application will not run without camera and location services!", Toast.LENGTH_SHORT).show();
        }
    }
}

【问题讨论】:

  • 你的问题解决了吗?
  • 是的。谢谢您的帮助。您是否偶然知道 Androids Camera2 API?
  • 不客气!知道一点,但是网上有很多教程和示例代码。如果您在查找问题时遇到问题,请随时提出新问题 :)

标签: android android-activity


【解决方案1】:

您并没有在您提供的代码中要求任何地方的权限。要询问位置功能,您可以尝试以下示例:

ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                REQUEST_CODE_FINE_GPS);

此外,一旦用户授予使用此功能的权限,您就不会让您的应用打开相机。

在您的 onRequestPermissionsResult() 方法中,您应该添加一个 else 调用 openCamera

类似这样的:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_CAMERA_PERMISSION_RESULT) {
        if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(getApplicationContext(),
                    "Application will not run without camera and location services!", Toast.LENGTH_SHORT).show();
        }
        else {
            cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mBackgroundHandler);
        }
    }
}

验证步骤大致如下:

  1. 应用打开时,检查 API >= 23
  2. 如果 API >= 23,请检查是否已授予权限。
  3. 如果不是,请请求许可。
  4. 请求的结果将在onRequestPermissionsResult() 方法上。您必须在那里处理用户输入。如果他没有授予权限,并且此功能对于您的应用运行至关重要,请显示一个对话框或其他解释他为何应授予您权限的内容,然后再次询问。
  5. 如果获得许可,则获利。在您的应用上调用将使用该功能的方法。

看看this answer。那家伙创建了一个很好的辅助方法来检查和请求您可能需要的任意数量的权限。然后,您只需在onRequestPermissionsResult() 上处理它们。

PS:强烈建议您重新阅读the docs关于如何在 API 23+ 上请求权限,您的问题表明您不了解权限请求的基本概念。另外,请查看 Android 培训页面的this linkthis related question

【讨论】:

  • 谢谢。您对设置我的位置权限有什么建议吗?
  • 这是相同的工作流程。一旦您需要使用位置功能,请检查该权限,并询问用户您是否没有权限。
  • 另外,我可以补充一点,如果您要使用 API 23+,GPS 定位是您必须请求许可的一项功能
  • 你提到我没有要求位置权限。你能告诉我这段代码发生了什么吗?在我看来,以下代码将请求 CAMERA、FINE_LOCATION 和 COARSE_LOCATION
  • requestPermissions(new String[]{android.Manifest.permission.CAMERA, android.Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION }, REQUEST_CAMERA_PERMISSION_RESULT);
猜你喜欢
  • 1970-01-01
  • 2011-10-03
  • 2011-09-21
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多