【问题标题】:Where to place request permission for camera?在哪里放置相机的请求权限?
【发布时间】:2019-06-13 08:24:51
【问题描述】:

我需要在surfaceview 中显示相机预览的某些活动中请求相机位置权限。

请求权限函数需要放在哪里? onCreateonResume 还是 onSurfaceCreated

我需要在哪里设置相机?

【问题讨论】:

  • 在 onResume 中设置权限的最佳方式。
  • 理想情况下,您会在加载活动之前获得权限,但您可以在不干扰应用程序“流程”的任何地方请求它。 onResume 是大多数生产应用程序放置代码的地方,因为当用户改变方向时活动被破坏,并且保证会调用 onResume

标签: java android android-camera surfaceview android-permissions


【解决方案1】:

看到请求权限直接对应应用程序崩溃如果请求服务并且权限不可用。 我更愿意将权限放在 onResume 中,因为无论用户操作变成什么,例如最小化或电池电量不足对话框出现在屏幕顶部,我们都需要再次检查权限更改,以便您的活动更改可能是由于任何原因而发生的。有一个摄像头在网络请求后尝试打开,或者是什么情况。

将相机检查权限放入onResume。

那么让我们谈谈你将如何做到这一点。 有几种看法。我更喜欢做的是 我创建了一个 Helper 类,让我知道此代码的权限状态

class PermissionsHelper(activity: Activity) {
private val activity: Context

init { this.activity = activity }

fun isCameraPermissionAvailable()=ActivityCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED

}

}

因此,在您的活动的 onResume 方法中检查权限是否可用,否则请求权限。

 override fun onResume() {
    super.onResume()
    if (!PermissionsHelper(this).isCameraPermissionAvailable()) {
        requestPermissions(arrayOf(Manifest.permission.CAMERA), CAMERA_REQUEST_CODE)
    }
}

另外请注意两点

1) You should write permission for camera in manifeast so that app can request the permission
2) Check if the camera permission is available or not before opening the camera, if not you should again request for the permission

(与 onResume 阶段相同)

【讨论】:

    【解决方案2】:

    首先,在清单文件中定义权限。

    在java文件中,

    您必须在运行时使用checkSelfPermission 再次请求权限。这是非常必要的,因为如果您的用户没有授予他将无法访问相机的权限。当您希望相机实际出现时,您应该编写此代码以及与相机相关的所有功能。

    例如,如果有一个按钮说Open Camera,那么首先检查用户是否授予权限,然后打开相机。

    【讨论】:

      【解决方案3】:

      您可以在使用服务之前将权限放置在任何地方。从技术上讲,这并不重要。但是,通过启动屏幕请求许可并提供需要许可的原因或在使用服务之前请求许可是用户友好的。

      【讨论】:

        【解决方案4】:

        根据Android documentation,请求许可的最相关的地方可能是

        每次执行需要该权限的操作时。

        此建议背后的原因是从 Android 6.0(API 级别 23)开始,用户可以随时撤消任何应用的权限。因此,即使该应用程序昨天使用了相机,它也不能假设它今天仍然具有该权限。

        因此应用程序必须每次都“检查”权限,以执行需要该权限的操作。

        您可以在用户授予使用相机的权限“之后”设置相机和其他操作。您可以通过覆盖onRequestPermissionsResult来检查用户是否授予权限

        @Override
        public void onRequestPermissionsResult(int requestCode,
                String permissions[], int[] grantResults) {
            switch (requestCode) {
                case MY_PERMISSIONS_REQUEST_CAMERA: {
                    // If request is cancelled, the result arrays are empty.
                    if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        // permission was granted, yay! Do the
                        // camera-related task you need to do.
                    } else {
                        // permission denied, boo! Disable the
                        // functionality that depends on this permission.
                    }
                    return;
                }
        
                // other 'case' lines to check for other
                // permissions this app might request.
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-31
          • 2020-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多