zoukankan      html  css  js  c++  java
  • Android 基础-2.0 拔打*

    1、添加权限

    在AndroidManifest.xml 添加打电话权限

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

    2、自动布局设置页面

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.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">
    
    
        <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

    页面效果

    3、给Activity添加拔打代码

    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类,专门用于处理权限相关的。

    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 boolean checkPermissionGranted(String[] permissions) {
            boolean 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, permissions, requestCode);
            }
        }
    
        private boolean shouldShowRequestPermissionRationale(String[] permissions) {
            boolean 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, permissions, grantResults);
            }
    
        }
    
        public boolean 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
  • 相关阅读:
    TCP协议的常见面试题
    Fedora 31 Beta 发布
    教你玩转Git-合并冲突
    使用Python搭建http服务器
    如何在Linux中复制文档
    小知识:讲述Linux命令别名与资源文件的区别
    centos7配置nfs共享存储服务
    30个关于Shell脚本的经典案例(中)
    轻量级前端MVVM框架avalon
    轻量级前端MVVM框架avalon
  • 原文地址:https://www.cnblogs.com/jys509/p/11059222.html
Copyright © 2011-2022 走看看