作者微信 bishe2022

代码功能演示视频在页面下方,请先观看;如需定制开发,联系页面右侧客服
Android 6.0 运行时权限检测

Custom Tab

normal permission权限:

dangerous permission级别权限

Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上,又新增了运行时权限动态检测(就是对dangerous permission级别权限进行动态权限监测),以下权限都需要在运行时判断:

身体传感器 
日历 
摄像头 
通讯录 
地理位置 
麦克风 
电话 
短信 
存储空间

dangerous permission级别权限其实是分组的,每组中包含多个权限。app在动态获取权限时显示的是一组权限,一旦你同意了本组权限中的一种权限在下次app调用本组中其他权限时系统默认已经授权不需要用户再次确认(在miui系统的6.0中测试发现每次都需要再次授权)。

小实例

在android studio项目中要想测试运行时权限检测必须在gradle中将targetSdkVersion 设置为23。如果是小于23系统会默认授予androidmainfast.xml中声明的权限,但是这是一种临时的解决方法还是需要做新机制的兼容的。

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"
    defaultConfig {
        applicationId "com.example.cike.testpermission"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

我们需要在app中每次需要危险权限时都去权限是否授予的检测,检测代码如下:

//contextCompat.checkSelfPermission()用于检测是否授予权限
 if (ContextCompat.checkSelfPermission(MainActivity.this, 
Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
//activitycompat.requestPermission()请求权限                  
ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.CALL_PHONE},1);
                } else {
                    calling();
                }

完整代码如下:

public class MainActivity extends AppCompatActivity {

    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (ContextCompat.checkSelfPermission(MainActivity.this, 
                Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
             ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.CALL_PHONE},1);
                } else {
                    calling();
                }
            }
        });
    }

    private void calling() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        Uri data = Uri.parse("tel:1234567890");
        intent.setData(data);
        startActivity(intent);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, 
    @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == 1) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                calling();
            } else {
                Toast.makeText(this, "权限被拒绝", Toast.LENGTH_SHORT).show();
            }
            return;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

效果图:

ttttt.png







转载自:http://blog.csdn.net/cike110120/article/details/51678215

Home