开发语言:Java
开发工具:Android Studio 3.5 RC 2 JDK1.8
SDK:API 29 Android 10.0
1.电话拨号器的实现
项目说明:这个小小的项目设计一个权限的问题。查看文档:https://developer.android.google.cn/training/permissions/requesting?hl=en,页面如下
说了一大堆,最后翻到后面,说有一个例子,点进去研究了一会,似乎找到了灵感。
模拟器中的界面如下:软件安装后的界面,右边是拨打界面
Module相关文件的代码如下:
res/layout/activity_main.xml文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:id="@+id/mLayout" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/title" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/title" android:id="@+id/edit1" android:inputType="number" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="makeCall" android:text="@string/buttonText" /> </LinearLayout>
AndroidManifest.xml清单文件需要提供 <user-permission android:name="android.permission.CALL_PHONE" />
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.aaa.phoneCall"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.CALL_PHONE"/> </manifest>
res/values/string.xml文件
<resources> <string name="app_name">01_电话拨号器</string> <string name="title">输入电话号码</string> <string name="buttonText">拨打电话</string> <string name="grant">不给授权,就不给你用</string> <string name="call_phone">请授予权限用于拨打电话</string> <string name="ok">Okay</string> <string name="call_phone_denied">获取拨号权限被拒绝</string> <string name="yes">软件运行需要CALL_PHONE权限</string> </resources>
MainActivity.java文件
package com.aaa.phoneCall; import android.Manifest; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.Toast; import androidx.core.app.ActivityCompat; import com.google.android.material.snackbar.Snackbar; public class MainActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback{ private static final int MY_CODE = 0; private EditText editText; LinearLayout mLayout ; private final static String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = findViewById(R.id.edit1); mLayout = findViewById(R.id.mLayout); } public void makeCall(View view){ getPermission(); } public void getPermission() { String[] permissions = {Manifest.permission.CALL_PHONE}; int code = ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE); if(code == PackageManager.PERMISSION_GRANTED ){ // got the CALL_PHONE permission. startCall(); // make the call }else { // didn't got the CALL_PHONE permission. requestCallPhonePermission(); // request the CALL_PHONE permission } } public void requestCallPhonePermission(){ if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CALL_PHONE)) { // didn't got CALL_PHONE permission. Toast.makeText(getApplicationContext(),R.string.yes,Toast.LENGTH_LONG).show(); // tip the app run need the permission }else{ ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CALL_PHONE}, MY_CODE); } } public void startCall(){ String number = editText.getText().toString().trim(); // get the phone number. Log.i(TAG, "makeCall: "+number); Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+number)); startActivity(intent); } @Override public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults) { if (requestCode == MY_CODE ) { // Request for CALL_PHONE permission. if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(getApplicationContext(),R.string.yes,Toast.LENGTH_LONG).show(); startCall(); } else { // Permission request was denied. Snackbar.make(mLayout, R.string.call_phone_denied,Snackbar.LENGTH_SHORT).show(); } } } }