Google 运行时请求权限处理

Google 7.0版本开始,需要在代码中加入权限检查。否则,就无法上Google Play商店。
相关文档:https://developer.android.com/training/permissions/requesting.html
不过,文档十分含糊,不踩几个坑是不可能搞清楚的。

在此我列出相关API,并加以说明
ActivityCompat.requestPermissions 请求权限,如果部分权限需要用户确认,就好弹出系统消息框,确认是否 开启权限。

Activity.onRequestPermissionsResult 请求权限结果回调接口,需要在主Activity中实现。

ContextCompat.checkSelfPermission 检查是否有请求

Activity.shouldShowRequestPermissionRationale 检查是否点选了“禁止后不再询问”选项。

以下为参考代码

public class MainActivity extends NativeActivity
{
    private static final int PERMISSION_REQUEST_CODE = 200;
    //需要检查的权限列表
    private static final String[] permissions = new String[]
    {
        "android.permission.WRITE_EXTERNAL_STORAGE",
        "android.permission.READ_PHONE_STATE",
        "android.permission.SEND_SMS",
        "android.permission.GET_ACCOUNTS",
        "android.permission.RECEIVE_SMS",
    };

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        //检查权限
        requestPermissions(permissions);
        super.onCreate();
    }

    /**
     * 权限检查函数
     */
    private void requestPermissions(String[] permissions)
    {
        if(permissions == null || permissions.length == 0)
            return;
        ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_CODE);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        Log.d("SiriusActivity", "onRequestPermissionsResult requestCode="+requestCode);
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0)
                {
                    //定义拒绝权限数
                    int deny_count = 0;
                    //挑出被拒绝的权限
                    for(int i=0; i<permissions.length; ++i)
                    {
                        if(grantResults[i] == PackageManager.PERMISSION_GRANTED)
                            //通过
                            Log.d("MainActivity", permissions[i] + " is GRANTED")
                        else
                        {
                            //权限被拒绝
                            Log.d("MainActivity", permissions[i] + " is DENIED")
                            deny_count += 1;
                        }
                    }
                    if(deny_count>0)
                        //有权限被拒绝
                        doFinishMessageBox();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
    /**
     * 退出对话框
     */
    private void doFinishMessageBox()
    {
        new AlertDialog.Builder(this)
                .setMessage("警告\n" +
                        "有权限被拒绝啦!"
                )
                .setPositiveButton("确定",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //退出
                        MainActivity.instance.finish();
                    }
                })
                .setCancelable(false)
                .create()
                .show();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值