我们在使用一些官方app时,刚下载进去之后经常会弹出各种各样的权限获取请求,今天简单学习了下,希望不会误人子弟哈哈哈哈。

一、将需要用到的权限添加到Manifest清单里

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>

 这一步很重要,本人Debug时发现如果缺少这步,进入界面后点击屏幕毫无反应......

private static final String[] REQUEST_PERMISSIONS = {
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.RECORD_AUDIO,
};
private static final int PERMISSION_REQUEST_CODE = 1;

 同时将对应的权限放到1个String数组里,标记一个权限申请标识码。

二、OnStart方法申请权限

在OnStart方法里判断权限是否申请过,如果没有,进行申请,申请的方法里用到了之前的String数组和权限申请标识码

@Override
protected void onStart() {
    super.onStart();
    if (!hasPermissionsGranted(REQUEST_PERMISSIONS)) {
        Log.d(Tag,"-------activityCompat.requestPermissions--------");
        ActivityCompat.requestPermissions(this, REQUEST_PERMISSIONS, PERMISSION_REQUEST_CODE);
    }
}

hasPermissionsGranted()方法:遍历String里的权限检测是否已经授予。

 /**
     * ContextCompat类的checkSelfPermission方法用于检测用户是否授权了某个权限。
     * PackageManager.PERMISSION_DENIED : -1
     * PackageManager.PERMISSION_GRANTED : 0 表示授权成功
     */
    public boolean hasPermissionsGranted(@NonNull String[] permissions) {
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(this, permission)
                    != PackageManager.PERMISSION_GRANTED) {
                return false;
                //此时没有授权,返回false
            }
        }
        return true;
        //已经授权过,返回true
    }

 onRequestPermissionsResult()方法:在对应的Activity中获取到回调结果,通过标识码和hasPermissionsGranted()方法判断是否授予权限成功,失败则调用finish()方法退出应用。

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    Log.d(Tag,"-------onRequestPermissionsResult--------");
    if (requestCode == PERMISSION_REQUEST_CODE) {
       if (!hasPermissionsGranted(REQUEST_PERMISSIONS)) {//返回false代表申请失败
           Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show();
           this.finish();
       }
    } else {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

综上一个简单的权限申请demo已经成功。后续也可以在定制化的申请弹窗方面研究一下。

如有错误和疑问,敬请矫正!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐