为较新的 Android API 修复相机权限的正确方法是什么?

What's the correct way to fix camera permissions for the newer Android APIs?

对于 21 岁以上的新 API 许可内容,我有点迷茫。我的最小值是 21,目标值是 23。

我的清单中有这个:

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE"/>

<uses-feature
    android:name="android.hardware.camera"
    android:required="false"/>

这是正确的吗?即使没有相机,人们也能下载我的应用程序吗?

人们可以正常下载您的应用。但是如果你的target SDK是23,你就得实现Runtime Permission。这意味着您必须在运行时检查并请求相机权限。

默认不授予相机权限。如果您不检查它,您的应用程序将崩溃。

这是 API 23 上使用运行时权限的教程 Link

你可以使用 google 的 easypermission 库,它很容易使用

在你的 activity 重写 onRequestPermissionsResult 像这样:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        // Forward results to EasyPermissions
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }
}

然后实现权限回调

public class MainActivity extends AppCompatActivity
    implements EasyPermissions.PermissionCallbacks {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        // Forward results to EasyPermissions
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

    @Override
    public void onPermissionsGranted(int requestCode, List<String> list) {
        // Some permissions have been granted
        // ...
    }

    @Override
    public void onPermissionsDenied(int requestCode, List<String> list) {
        // Some permissions have been denied
        // ...
    }
}

并像这样请求相机许可:

@AfterPermissionGranted(RC_CAMERA_PERM)
    public void cameraTask() {
        if (EasyPermissions.hasPermissions(this, Manifest.permission.CAMERA)) {
            // Have permission, do the thing!
            Toast.makeText(this, "TODO: Camera things", Toast.LENGTH_LONG).show();
        } else {
            // Ask for one permission
            EasyPermissions.requestPermissions(this, getString(R.string.rationale_camera),
                    RC_CAMERA_PERM, Manifest.permission.CAMERA);
        }
    }

如需更多代码示例,请查看此 github easypermission 存储库 android

easypemission

编码愉快