Android 6.0 运行时权限处理

来源:互联网 发布:java 弱引用list 编辑:程序博客网 时间:2024/06/01 21:39

M权限简单说明

由于M对权限的管理更加严格,dangerous的都需要用户点击授权,可以用命令查询如下,

adb shell pm list permissions -d -g

SvcCOPSSH@WIN-6 ~$ adb shell pm list permissions -d -gDangerous Permissions:group:android.permission-group.CONTACTS  permission:android.permission.WRITE_CONTACTS  permission:android.permission.GET_ACCOUNTS  permission:android.permission.READ_CONTACTSgroup:android.permission-group.PHONE  permission:android.permission.READ_CALL_LOG  permission:android.permission.READ_PHONE_STATE  permission:android.permission.CALL_PHONE  permission:android.permission.WRITE_CALL_LOG  permission:android.permission.USE_SIP  permission:android.permission.PROCESS_OUTGOING_CALLS  permission:com.android.voicemail.permission.ADD_VOICEMAILgroup:android.permission-group.CALENDAR  permission:android.permission.READ_CALENDAR  permission:android.permission.WRITE_CALENDARgroup:android.permission-group.CAMERA  permission:android.permission.CAMERAgroup:android.permission-group.SENSORS  permission:android.permission.BODY_SENSORSgroup:android.permission-group.LOCATION  permission:android.permission.ACCESS_FINE_LOCATION  permission:android.permission.ACCESS_COARSE_LOCATIONgroup:android.permission-group.STORAGE  permission:android.permission.READ_EXTERNAL_STORAGE  permission:android.permission.WRITE_EXTERNAL_STORAGEgroup:android.permission-group.MICROPHONE  permission:android.permission.RECORD_AUDIOgroup:android.permission-group.SMS  permission:android.permission.READ_SMS  permission:android.permission.RECEIVE_WAP_PUSH  permission:android.permission.RECEIVE_MMS  permission:android.permission.RECEIVE_SMS  permission:android.permission.SEND_SMS  permission:android.permission.READ_CELL_BROADCASTS

列出了当前机器中所有dangerous的权限


针对APP动态处理的实例

package com.dragon.android.permissionrequest;import android.Manifest;import android.content.DialogInterface;import android.content.Intent;import android.content.pm.PackageManager;import android.net.Uri;import android.os.Build;import android.os.Bundle;import android.provider.Settings;import android.support.annotation.NonNull;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.widget.Toast;public class MainActivity extends AppCompatActivity {    // 要申请的权限    private String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};    private AlertDialog dialog;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {            // 检查该权限是否已经获取            int i = ContextCompat.checkSelfPermission(this, permissions[0]);            // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝            if (i != PackageManager.PERMISSION_GRANTED) {                // 如果没有授予该权限,就去提示用户请求                showDialogTipUserRequestPermission();            }        }    }    // 提示用户该请求权限的弹出框    private void showDialogTipUserRequestPermission() {        new AlertDialog.Builder(this)                .setTitle("存储权限不可用")                .setMessage("由于支付宝需要获取存储空间,为你存储个人信息;\n否则,您将无法正常使用支付宝")                .setPositiveButton("立即开启", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        startRequestPermission();                    }                })                .setNegativeButton("取消", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        finish();                    }                }).setCancelable(false).show();    }    // 开始提交请求权限    private void startRequestPermission() {        ActivityCompat.requestPermissions(this, permissions, 321);    }    // 用户权限 申请 的回调方法    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if (requestCode == 321) {            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {                    // 判断用户是否 点击了不再提醒。(检测该权限是否还可以申请)                    boolean b = shouldShowRequestPermissionRationale(permissions[0]);                    if (!b) {                        // 用户还是想用我的 APP 的                        // 提示用户去应用设置界面手动开启权限                        showDialogTipUserGoToAppSettting();                    } else                        finish();                } else {                    Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();                }            }        }    }    // 提示用户去应用设置界面手动开启权限    private void showDialogTipUserGoToAppSettting() {        dialog = new AlertDialog.Builder(this)                .setTitle("存储权限不可用")                .setMessage("请在-应用设置-权限-中,允许支付宝使用存储权限来保存用户数据")                .setPositiveButton("立即开启", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        // 跳转到应用设置界面                        goToAppSetting();                    }                })                .setNegativeButton("取消", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        finish();                    }                }).setCancelable(false).show();    }    // 跳转到当前应用的设置界面    private void goToAppSetting() {        Intent intent = new Intent();        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);        Uri uri = Uri.fromParts("package", getPackageName(), null);        intent.setData(uri);        startActivityForResult(intent, 123);    }    //    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (requestCode == 123) {            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                // 检查该权限是否已经获取                int i = ContextCompat.checkSelfPermission(this, permissions[0]);                // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝                if (i != PackageManager.PERMISSION_GRANTED) {                    // 提示用户应该去应用设置界面手动开启权限                    showDialogTipUserGoToAppSettting();                } else {                    if (dialog != null && dialog.isShowing()) {                        dialog.dismiss();                    }                    Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();                }            }        }    }}


0 0
原创粉丝点击