滴水穿石
https://developer.android.com/reference/android/Manifest.permission.html 权限列表(需翻墙)
运行时权限
为了更好的保护用户的安全和隐藏,android在6.0系统中引用了运行时权限这个功能。6.0之前我们都是在AndroidManifest.xml加入类似 <uses-permission android:name="android.permission.INTERNET"/> 来进行权限声明,加入这些权限声明在安装应用的时候在弹出的安装窗口上面会将这些权限声明展示出来,让用户决定进不进行安装,但是很多app不管需不需要先申请了再说,导致权限混乱的情况,像微信申请一些用不到的权限的时候,你只能确认除非不用它。6.0系统中加入了运行时权限,使用户不需要在安装的时候一次性授权所有的权限,可以在app中使用到的时候再进行申请授权。普通授权系统会自动授权,危险授权关系用户的隐私和设备安全行就需要进行申请了。
正常拨打电话:
Intent intent=new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:123456"));
startActivity(intent);
这个如果在AndroidManifest里面进行了声明,在6.0以下的系统时没有问题的,但是在6.0之后的系统就会报Permission Denial错误了。这是由于权限被禁止了,在6.0以上的系统在使用危险权限的时候必须进行运行时权限处理。
private void init() {
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},1);
}else {
call();
}
}
private void call() {
try {
Intent intent=new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:123456"));
startActivity(intent);
}catch (SecurityException e){
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
call();
}else{
Toast.makeText(this,"你不给我权限我进去不了哦",Toast.LENGTH_SHORT).show();
}
break;
}
}
在使用打电话的时候 调用init();第一步先判断用户是否给予权限,如果给予了权限那么就正常使用这个功能,ContextCompat.checkSelfPermission()接收两个参数,第一个没什么好说的,第二个是具体的权限名,如上就是打电话的权限,当用户进入到这步的时候,界面会弹出一个授权窗口,如果是则选择ok,这样就正常进入打电话,否的话就弹出一句"你不给我权限我进去不了哦",当用户下次需要这个权限的时候如果上次给予了权限那么就能正常调用,否则继续弹出申请了。