Android6.0:动态权限申请

来源:互联网 发布:excel把多列数据合并 编辑:程序博客网 时间:2024/05/16 12:38

EasyPermissions

这个是google提供的,github 地址:EasyPermissions

效果图:

这里写图片描述

gradle

dependencies {    ...    compile 'pub.devrel:easypermissions:0.2.1'    ...}

XML中还是需要声明权限-例:

<uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.READ_CONTACTS" />

步骤

  • 重写方法onRequestPermissionsResult(...)
  • 需要权限的时候,先检查有没有这个权限

    • 有:进行逻辑操作
    • 没有:请求权限
  • (可选)让类Activity或Fragment实现EasyPermissions.PermissionCallbacks

  • (可选)系统设置完成后

Step1:onRequestPermissionsResult(…)

官方demo推荐重写这个方法,没发现什么用处

@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {    super.onRequestPermissionsResult(requestCode, permissions, grantResults);    // Forward results to EasyPermissions    EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);}

Step2:需要权限的时候,先检查有没有这个权限

if (EasyPermissions.hasPermissions(MainActivity.this, Manifest.permission.CAMERA)) {    //有此权限    toast.setText("已经有CAMERA权限了");    toast.show();} else {//没有此权限,需要重新申请  getResources().getString(R.string.positive_button)    EasyPermissions.requestPermissions(this, "请求camera权限", RC_CAMERA_PERM, Manifest.permission.CAMERA);}

Step3:让类Activity或Fragment实现EasyPermissions.PermissionCallbacks

implements EasyPermissions.PermissionCallbacks

需要重写的方法:

//同意授权@Overridepublic void onPermissionsGranted(int requestCode, List<String> list) {    toast.setText("Granted");    toast.show();}//拒绝授权。 同时点击“不在询问” + 拒绝后,调用这个方法@Overridepublic void onPermissionsDenied(int requestCode, List<String> perms) {    //用户点击拒绝后,弹出dialog,点击“确定”会去设置界面    if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {        new AppSettingsDialog.Builder(this, "点击确定去设置界面设置权限")                .setTitle("Title")                .setPositiveButton("确定2")                .setNegativeButton("取消2", null /* click listener */)                .setRequestCode(requestCode)                .build()                .show();    }}

Step4;系统设置完成后

在系统设置界面,设置完权限后,返回当前界面后调用这个方法

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    if (requestCode == RC_LOCATION_CONTACTS_PERM) {        toast.setText("onActivityResult定位和获取联系人权限");        toast.show();    } else if (requestCode == RC_CAMERA_PERM) {        toast.setText("onActivityResult拍照权限");        toast.show();    }}

完整代码

public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {    private Toast toast;    private static final int RC_CAMERA_PERM = 100;//camera权限    private static final int RC_LOCATION_CONTACTS_PERM = 101;//定位和联系人权限    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        toast = Toast.makeText(MainActivity.this, "", Toast.LENGTH_SHORT);        findViewById(R.id.btn_camera).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                cameraTask();            }        });        findViewById(R.id.btn_location_contracts).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                locationAndContactsTask();            }        });    }    @AfterPermissionGranted(RC_LOCATION_CONTACTS_PERM)    private void locationAndContactsTask() {        String[] perms = {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_CONTACTS};        if (EasyPermissions.hasPermissions(MainActivity.this, perms)) {            toast.setText("已经获取READ_CONTACTS + ACCESS_FINE_LOCATION权限了");            toast.show();        } else {            EasyPermissions.requestPermissions(this, "请求定位和联系人权限", RC_LOCATION_CONTACTS_PERM, perms);        }    }    @AfterPermissionGranted(RC_CAMERA_PERM)    private void cameraTask() {        if (EasyPermissions.hasPermissions(MainActivity.this, Manifest.permission.CAMERA)) {            //有此权限            toast.setText("已经有CAMERA权限了");            toast.show();        } else {//没有此权限,需要重新申请  getResources().getString(R.string.positive_button)            EasyPermissions.requestPermissions(this, "请求camera权限", RC_CAMERA_PERM, Manifest.permission.CAMERA);        }    }    //官方demo推荐重写这个方法,没发现什么用处    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull 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) {        toast.setText("Granted");        toast.show();    }    //同时点击“不在询问” + 拒绝后,调用这个方法    @Override    public void onPermissionsDenied(int requestCode, List<String> perms) {        //用户点击拒绝后,弹出dialog,点击“确定”会去设置界面        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {            new AppSettingsDialog.Builder(this, "点击确定去设置界面设置权限")                    .setTitle("Title")                    .setPositiveButton("确定2")                    .setNegativeButton("取消2", null /* click listener */)                    .setRequestCode(requestCode)                    .build()                    .show();        }    }    //在系统设置界面,设置完权限后,返回当前界面后调用这个方法    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (requestCode == RC_LOCATION_CONTACTS_PERM) {            toast.setText("onActivityResult定位和获取联系人权限");            toast.show();        } else if (requestCode == RC_CAMERA_PERM) {            toast.setText("onActivityResult拍照权限");            toast.show();        }    }}
0 0
原创粉丝点击