Android权限机制,在Android6.0之前,其实一直很简单,在AndroidManifest.xml中进行权限声明,通过一个Intent调用即可。
以打电话为例:
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
public void ButtonCall(View v){
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:0123456789"));
startActivity(intent);
}
界面很简单,点击Button,打电话
可以看到,打电话成功,那么在Android6.0项目中也这么干,会怎样呢?
接下来,手动更改编译目标版本,
然后Sync now一下,卸载之前的Demo版本,run一下。
点击打电话,然后崩了,如下图:
看一下logcat:
很明显。没有运行时权限,那么,今天的重点来了,运行时权限怎么搞定。
Android6.0运行时权限
主要有下面几个步骤:
1. 在AndroidManifest.xml中进行权限声明(跟之前一样)
2. 动态权限申请
3. 重写 onRequestPermissionsResult方法
4. 通过Intent调用
public class MainActivity extends AppCompatActivity {
private Button buttonCall;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonCall = (Button) findViewById(R.id.ButtonCall);
buttonCall.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 {
//有权限,调用打电话方法
MakeCall();
}
}
});
}
public void MakeCall(){
try {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:0123456789"));
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){
//有权限,调用打电话方法
MakeCall();
}else{
//没有权限,给一个Toast提示
Toast.makeText(this,"您拒绝了权限",Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
}
点击允许,就可以打电话了,运行时权限只在第一次申请时询问,之后就不再显示,不过可以再“设置”里取消权限。