Android API23后处理“危险”permission的方法

昨天,在练习使用隐式intent中有一个打电话的demo,使用的源代码如下:

    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:10086"));
            startActivity(intent);
        }
    

发现startActivity(intent) 那出现错误提示: “Call requires permission which may be rejected by user”

Google后在stackoverflow发现有人和我一样的问题,是Android M后升级了权限管理的方式,一些危险权限必须实时(Run Time)声明。然后给出了解决代码:


if (mContext.checkSelfPermission(Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse(“tel:” + phoneNumber));
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(callIntent);
}

方法有了,但是还没解决啊,直接复制有问题!在SegmentFault上提问,经过指点,是自己Java基础有待提高,简单修改一下就行了,修改后如下:

button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if(MainActivity.this.checkSelfPermission(Manifest.permission.CALL_PHONE)== PackageManager.PERMISSION_GRANTED) {
callPhone();
}else{
//
}
}else{
callPhone();
}
});
void callPhone(){
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse(“tel:10086”));
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//noinspection ResourceType
startActivity(callIntent);
}

成功解决。
后来又发现,如果把原来错误代码中的’ACTION_CALL换成ACTION_DIAL也行,只是点击Button后只会跳到电话,不会拨通电话,相当于把危险权限降低为低级权限,避免Android M的权限检查。

SegmentFault上的另外一个回答“直接使用Support Library中兼容的代码”先mark着,后面再自己琢磨怎么弄吧!



Update
已发现解决办法,参考使用AS建立的login Activity模板,待更新。

参考链接:
http://stackoverflow.com/questions/33208974/activity-intent-permission-android-m-sdk-23
http://developer.android.com/intl/pt-br/training/permissions/requesting.html
http://developer.android.com/intl/pt-br/training/permissions/requesting.htmll