package com.zjw.myapplication; import android.Manifest; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.Toast; //1.2.2 p30 运行时权限机制 /* Android 6.0新特性 除了危险权限,其他都是普通权限,权限组中任何一个被授权,其他也被自动授权 Dangerous Permissions: group:android.permission-group.CONTACTS permission:android.permission.WRITE_CONTACTS permission:android.permission.GET_ACCOUNTS permission:android.permission.READ_CONTACTS group:android.permission-group.PHONE permission:android.permission.READ_CALL_LOG permission:android.permission.READ_PHONE_STATE permission:android.permission.CALL_PHONE permission:android.permission.WRITE_CALL_LOG permission:android.permission.USE_SIP permission:android.permission.PROCESS_OUTGOING_CALLS permission:com.android.voicemail.permission.ADD_VOICEMAIL group:android.permission-group.CALENDAR permission:android.permission.READ_CALENDAR permission:android.permission.WRITE_CALENDAR group:android.permission-group.CAMERA permission:android.permission.CAMERA group:android.permission-group.SENSORS permission:android.permission.BODY_SENSORS group:android.permission-group.LOCATION permission:android.permission.ACCESS_FINE_LOCATION permission:android.permission.ACCESS_COARSE_LOCATION group:android.permission-group.STORAGE permission:android.permission.READ_EXTERNAL_STORAGE permission:android.permission.WRITE_EXTERNAL_STORAGE group:android.permission-group.MICROPHONE permission:android.permission.RECORD_AUDIO group:android.permission-group.SMS permission:android.permission.READ_SMS permission:android.permission.RECEIVE_WAP_PUSH permission:android.permission.RECEIVE_MMS permission:android.permission.RECEIVE_SMS permission:android.permission.SEND_SMS permission:android.permission.READ_CELL_BROADCASTS */ /* 定义一个按钮打电话 第一次会询问是否授予权限,拒绝授予后,第二次会多一个不再询问,如果用户勾选了不再询问,我们可以给用户一个友好提示 shouldShowRequestPermissionRationale方法用于帮助 开发者向用户解释权限的情况,用户勾选“不再询问”,该方法会返回false */ public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找到控件 Button btnCall = (Button) findViewById(R.id.btn_call); //按钮点击事件 btnCall.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { requestPermission(); //申请权限 } }); } //申请权限 private void requestPermission() { //运行时权限,检查有没有 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { //没有就申请权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1); } else { //用户如果之前就允许了权限之后进行的操作 callPhone(); //打电话 } } //打电话 private void callPhone() { Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + "10086")); try { startActivity(intent); } catch (Exception 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) { //如果用户允许请求进行的操作 callPhone(); } else { //如果用户拒绝请求进行的操作 if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)) { AlertDialog alertDialog=new AlertDialog.Builder(this) .setMessage("该功能需要访问电话的权限,不开启将无法工作!") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).create(); alertDialog.show(); }else{ Toast.makeText(this, "You denid the permission", Toast.LENGTH_SHORT).show(); } } return; default: break; } } }
转载于:https://my.oschina.net/u/3620480/blog/1524347