在哪里放置摄像机的请求权限?

时间:2019-01-19 06:35:52

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

我需要在某些活动中请求相机位置权限,这些权限需要在fun findSumOfTwo(list: List<Int>, number: Int): Pair<Int, Int>? { return list .flatMap { it1 -> list.map { it2 -> Pair(it1, it2) } } .firstOrNull { it.first + it.second == number } } 中显示相机预览。

我需要在哪里放置请求权限功能? onCreate onResume onSurfaceCreated

我需要在哪里安装相机?

4 个答案:

答案 0 :(得分:0)

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

在java文件中,

您必须在运行时使用checkSelfPermission再次请求权限。这是非常必要的,就好像您未获得用户的权限(他将无法访问摄像机)一样。想要实际显示照相机时,应编写此代码以及与照相机有关的所有功能。

例如,如果有一个说Open Camera的按钮,则首先检查用户是否已授予许可,然后再打开相机。

答案 1 :(得分:0)

如果请求服务且该权限不可用,请参阅询问权限直接对应于应用程序崩溃。 我宁愿将许可权放在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 :(得分:0)

您可以在使用服务之前将权限放置在任何地方。从技术上讲,这并不重要。但是,通过启动屏幕来提供许可是很方便的,该启动屏幕提供了需要许可的原因或在使用服务之前就进行了许可。

答案 3 :(得分:0)

根据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.
    }
}