MainActivity.java:
1 package broadcastreceiver.lgqrlchinese.com.heima76android_1_phonedall; 2 3 import android.Manifest; 4 import android.app.Activity; 5 import android.content.Intent; 6 import android.content.pm.PackageManager; 7 import android.net.Uri; 8 import android.os.Bundle; 9 import android.provider.Settings; 10 import android.support.v4.app.ActivityCompat; 11 import android.support.v4.content.ContextCompat; 12 import android.text.TextUtils; 13 import android.view.View; 14 import android.widget.Button; 15 import android.widget.EditText; 16 import android.widget.Toast; 17 18 public class MainActivity extends Activity { 19 20 private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 1; 21 private Button btn_dial; 22 private EditText et_number; 23 24 @Override 25 protected void onCreate(Bundle savedInstanceState) { 26 super.onCreate(savedInstanceState); 27 setContentView(R.layout.activity_main); 28 // 找到控件 29 et_number = (EditText) findViewById(R.id.ed); 30 btn_dial = (Button) findViewById(R.id.button); 31 32 // 给按钮设置监听(点击事件) 33 btn_dial.setOnClickListener(new View.OnClickListener() { // 匿名内部类 34 // 按钮点击时回调 35 @Override 36 public void onClick(View view) { 37 // 检查是否获得了权限(Android6.0运行时权限) 38 if (ContextCompat.checkSelfPermission(MainActivity.this, 39 Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){ 40 // 没有获得授权,申请授权 41 if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, 42 Manifest.permission.CALL_PHONE)) { 43 // 返回值: 44 // 如果app之前请求过该权限,被用户拒绝, 这个方法就会返回true. 45 // 如果用户之前拒绝权限的时候勾选了对话框中”Don’t ask again”的选项,那么这个方法会返回false. 46 // 如果设备策略禁止应用拥有这条权限, 这个方法也返回false. 47 // 弹窗需要解释为何需要该权限,再次请求授权 48 Toast.makeText(MainActivity.this, "请授权!", Toast.LENGTH_LONG).show(); 49 50 // 帮跳转到该应用的设置界面,让用户手动授权 51 Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 52 Uri uri = Uri.fromParts("package", getPackageName(), null); 53 intent.setData(uri); 54 startActivity(intent); 55 }else{ 56 // 不需要解释为何需要该权限,直接请求授权 57 ActivityCompat.requestPermissions(MainActivity.this, 58 new String[]{Manifest.permission.CALL_PHONE}, 59 MY_PERMISSIONS_REQUEST_CALL_PHONE); 60 } 61 }else { 62 // 已经获得授权,可以打电话 63 CallPhone(); 64 } 65 } 66 }); 67 } 68 69 private void CallPhone() { 70 String number = et_number.getText().toString(); 71 if (TextUtils.isEmpty(number)) { 72 // 提醒用户 73 // 注意:在这个匿名内部类中如果用this则表示是View.OnClickListener类的对象, 74 // 所以必须用MainActivity.this来指定上下文环境。 75 Toast.makeText(MainActivity.this, "号码不能为空!", Toast.LENGTH_SHORT).show(); 76 } else { 77 // 拨号:激活系统的拨号组件 78 Intent intent = new Intent(); // 意图对象:动作 + 数据 79 intent.setAction(Intent.ACTION_CALL); // 设置动作 80 Uri data = Uri.parse("tel:" + number); // 设置数据 81 intent.setData(data); 82 startActivity(intent); // 激活Activity组件 83 } 84 } 85 86 // 处理权限申请的回调 87 @Override 88 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 89 switch (requestCode){ 90 case MY_PERMISSIONS_REQUEST_CALL_PHONE: { 91 if (grantResults.length > 0 92 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 93 // 授权成功,继续打电话 94 CallPhone(); 95 } else { 96 // 授权失败! 97 Toast.makeText(this, "授权失败!", Toast.LENGTH_LONG).show(); 98 } 99 break; 100 } 101 } 102 103 } 104 }
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:id="@+id/ed" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入手机号" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="拨打" /> </LinearLayout> </android.support.constraint.ConstraintLayout>
添加权限:
1 <uses-permission android:name="android.permission.CALL_PHONE"/>