Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android 基础-2.0 拔打电话号码大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

1、添加权限

在AndroidManifest.xml 添加打电话权限

<uses-permission android:name="android.permission.Call_PHONE"/>

2、自动布局设置页面

Android 基础-2.0 拔打电话号码

<?xml version="1.0" encoding="utf-8"?>
<androidx.consTraintlayout.widget.ConsTraintLayout xmlns:android="http://scheR_2_11845@as.android.com/apk/res/android"
    xmlns:app="http://scheR_2_11845@as.android.com/apk/res-auto"
    xmlns:tools="http://scheR_2_11845@as.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <TextView
        android:id="@+id/tv_phone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp"
        android:text="@String/textPhone"
        app:layout_consTraintStart_toStartOf="parent"
        app:layout_consTraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/et_phone"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"
        android:layout_marginRight="10dp"
        android:hint="@String/textPhoneHint"
        app:layout_consTraintEnd_toEndOf="parent"
        app:layout_consTraintStart_toStartOf="parent"
        app:layout_consTraintTop_toBottomOf="@+id/tv_phone" />

    <Button
        android:id="@+id/btn_call"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="16dp"
        android:text="@String/textPhoneButton"
        app:layout_consTraintStart_toStartOf="parent"
        app:layout_consTraintTop_toBottomOf="@+id/et_phone" />


</androidx.consTraintlayout.widget.ConsTraintLayout>
View Code

页面效果

Android 基础-2.0 拔打电话号码

3、给Activity添加拔打代码

Android 基础-2.0 拔打电话号码

public class MainActivity extends  BaseActivity {

    private Button eBtCall;
    private EditText mEtPhone;

    @Override
    protected void onCreate(Bundle savedInstanceStatE) {
        super.onCreate(savedInstanceStatE);
        setContentView(R.layout.activity_main);

        eBtCall = findViewById(R.id.btn_call);
        mEtPhone = findViewById(R.id.et_phonE);
        eBtCall.setOnClickListener(new View.onClickListener() {
            @Override
            public void onClick(View v) {
                performCodeWithPermission("拔打电话权限",new PermissionCallBACk() {
                    @Override
                    public void hasPermission() {
                        Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:" + mEtPhone.getText()));
                        startActivity(intent);
                    }

                    @Override
                    public void noPermission() {

                    }
                },Manifest.permission.Call_PHONE);
            }
        });
    }
}
View Code

4、这里要注意,安卓在6.0之后是动态申请系统权限,因而封装一个权限的BaseActivity类,专门用于处理权限相关的。

Android 基础-2.0 拔打电话号码

package com.jiangys.telephonedial;

import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.os.build;
import android.widget.Toast;

import androidx.Annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

/**
 * @author Admin
 * @version $Rev$
 * @des ${TODO}
 * @updateAuthor $Author$
 * @updateDes ${TODO}
 */
public class BaseActivity extends AppCompatActivity {
    //**************** Android M Permission (Android 6.0权限控制代码封装)
    private int permissionrequestCode = 88;
    private PermissionCallBACk permissionRunnable;

    public interface PermissionCallBACk {
        void hasPermission();

        void noPermission();
    }

    /**
     * Android M运行时权限请求封装
     *
     * @param permissionDes 权限描述
     * @param runnable      请求权限回调
     * @param permissions   请求的权限(数组类型),直接从Manifest中读取相应的值,比如Manifest.permission.WRITE_CONTACTS
     */
    public void performCodeWithPermission(@NonNull String permissionDes,PermissionCallBACk runnable,@NonNull String... permissions) {
        if (permissions == null || permissions.length == 0)
            return;
        //        this.permissionrequestCode = requestCode;
        this.permissionRunnable = runnable;
        if ((Build.VERSION.SDK_INT < Build.VERSION_CODEs.M) || checkPermissionGranted(permissions)) {
            if (permissionRunnable != null) {
                permissionRunnable.hasPermission();
                permissionRunnable = null;
            }
        } else {
            //permission has not been granted.
            requestPermission(permissionDes,permissionrequestCode,permissions);
        }

    }

    private @R_450_8487@an checkPermissionGranted(String[] permissions) {
        @R_450_8487@an flag = true;
        for (String p : permissions) {
            if (ActivityCompat.checkSelfPermission(this,p) != PackageManager.PERMISSION_GRANTED) {
                flag = false;
                break;
            }
        }
        return flag;
    }

    private void requestPermission(String permissionDes,final int requestCode,final String[] permissions) {
        if (shouldShowrequestPermissionRationale(permissions)) {
            /*1. 第一次请求权限时,用户拒绝了,下一次:shouldShowrequestPermissionRationale()  返回 true,应该显示一些为什么需要这个权限的说明
            2.第二次请求权限时,用户拒绝了,并选择了“不在提醒”的选项时:shouldShowrequestPermissionRationale()  返回 false
            3. 设备的策略禁止当前应用获取这个权限的授权:shouldShowrequestPermissionRationale()  返回 false*/
            // Provide an additional rationale to the user if the permission was not granted
            // and the user would benefit from additional context for the use of the permission.
            // For example,if the request has been denied prevIoUsly.

            //            Snackbar.make(getWindow().getDecorView(),requestName,//                    Snackbar.LENGTH_INDEFINITE)
            //                    .setAction(R.String.common_ok,new View.onClickListener() {
            //                        @Override
            //                        public void onClick(View view) {
            //                            ActivityCompat.requestPermissions(BaseAppCompatActivity.this,//                                    permissions,//                                    requestCodE);
            //                        }
            //                    })
            //                    .show();
            //如果用户之前拒绝过此权限,再提示一次准备授权相关权限
            new AlertDialog.builder(this)
                    .settitle("提示")
                    .setmessage(permissionDes)
                    .setPositiveButton("授权",new DialogInterface.onClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog,int which) {
                            ActivityCompat.requestPermissions(BaseActivity.this,permissions,requestCodE);
                        }
                    }).show();

        } else {
            // Contact permissions have not been granted yet. request them directly.
            ActivityCompat.requestPermissions(BaseActivity.this,requestCodE);
        }
    }

    private @R_450_8487@an shouldShowrequestPermissionRationale(String[] permissions) {
        @R_450_8487@an flag = false;
        for (String p : permissions) {
            if (ActivityCompat.shouldShowrequestPermissionRationale(this,p)) {
                flag = true;
                break;
            }
        }
        return flag;
    }

    /**
     * CallBACk received when a permissions request has been completed.
     */
    @Override
    public void onrequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
        if (requestCode == permissionrequestCodE) {
            if (verifyPermissions(grantResults)) {
                if (permissionRunnable != null) {
                    permissionRunnable.hasPermission();
                    permissionRunnable = null;
                }
            } else {
                Toast.makeText(this,"暂无权限执行相关操作!",Toast.LENGTH_SHORT).show();
                if (permissionRunnable != null) {
                    permissionRunnable.noPermission();
                    permissionRunnable = null;
                }
            }
        } else {
            super.onrequestPermissionsResult(requestCode,grantResults);
        }

    }

    public @R_450_8487@an verifyPermissions(int[] grantResults) {
        // at least one result must be checked.
        if (grantResults.length < 1) {
            return false;
        }

        // Verify that each required permission has been granted,otherwise return false.
        for (int result : grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }
    //********************** END Android M Permission ****************************************
}
View Code

大佬总结

以上是大佬教程为你收集整理的Android 基础-2.0 拔打电话号码全部内容,希望文章能够帮你解决Android 基础-2.0 拔打电话号码所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。