Android7.0动态申请打电话的权限

这篇博客介绍了在Android 7.0系统中如何动态申请打电话权限。通过布局文件设置拨打电话按钮,点击后显示对话框询问用户许可。用户同意后,应用将向系统请求打电话的权限。文中提到了DialogUtil.java作为弹窗工具类的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新建一个Android工程,在布局文件里面加入一个拨打电话按钮。


点击拨打电话之后,弹出对话框让用户选择是否允许申请权限。

当用户点击YES之后,就向系统申请权限。


布局文件如下,在布局文件中加入按钮,同时注册响应事件,callButtonClickAction:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="comnii.activity.MainActivity">

   <Button
           android:id="@+id/callButton"
           android:onClick="callButtonClickAction"
           android:text="拨打电话"
           android:layout_gravity="center"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"/>


</LinearLayout>

Manifest.xml文件,添加android.permission.CALL_PHONE打电话的权限。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="comnii.activity" >

    <!--打电话的权限-->
    <uses-permission android:name="android.permission.CALL_PHONE"/>

    <!--存储权限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>



    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:exported="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>

</manifest>

下面是MainActivity.java的代码,注意看代码注释,注释写的很详细

import android.Manifest;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import comnii.activity.type.RequestPermissionType;
import comnii.activity.util.DialogUtil;

public class MainActivity extends AppCompatActivity
{

    /**
     * context
     */
    private Context mContext;

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

        this.mContext = this;
    }

    /**
     * 点击打电话的按钮响应事件
     *
     * @param view view
     */
    public void callButtonClickAction(View view)
    {

        //先new出一个监听器,设置好监听
        DialogInterface.OnClickListener dialogOnclicListener = new DialogInterface.OnClickListener()
        {

            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                switch (which)
                {
                    case Dialog.BUTTON_POSITIVE:
                        Toast.makeText(MainActivity.this, "Yes" + which, Toast.LENGTH_SHORT).show();
                        requestPermission();
                        break;
                    case Dialog.BUTTON_NEGATIVE:
                        Toast.makeText(MainActivity.this, "No" + which, Toast.LENGTH_SHORT).show();
                        break;
                    case Dialog.BUTTON_NEUTRAL:
                        Toast.makeText(MainActivity.this, "Cancel" + which, Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        };

        //弹窗让用户选择,是否允许申请权限
        DialogUtil.showConfirm(mContext, "申请权限", "是否允许获取打电话权限?", dialogOnclicListener, dialogOnclicListener);
    }

    /**
     * 申请权限
     */
    private void requestPermission()
    {
        //判断Android版本是否大于23
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        {
            int checkCallPhonePermission = ContextCompat.checkSelfPermission(mContext, Manifest.permission.CALL_PHONE);

            if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED)
            {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE},
                        RequestPermissionType.REQUEST_CODE_ASK_CALL_PHONE);
                return;
            }
            else
            {
                callPhone();
            }
        }
        else
        {
            callPhone();
        }
    }

    /**
     * 注册权限申请回调
     * @param requestCode 申请码
     * @param permissions 申请的权限
     * @param grantResults 结果
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
    {
        switch (requestCode)
        {
            case  RequestPermissionType.REQUEST_CODE_ASK_CALL_PHONE:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
                {
                    callPhone();
                }
                else
                {
                    // Permission Denied
                    Toast.makeText(MainActivity.this, "CALL_PHONE Denied", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

    /**
     * 拨号方法
     */
    private void callPhone()
    {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:10086"));
        startActivity(intent);
    }
}



DialogUtil,java是是弹窗工具类

package comnii.activity.util;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.WindowManager;

/**
 * 对话框工具箱
 *
 * @author xiaopan
 */
public class DialogUtil
{
    /**
     * 显示一个对话框
     *
     * @param context                    上下文对象,最好给Activity,否则需要android.permission.SYSTEM_ALERT_WINDOW
     * @param title                      标题
     * @param message                    消息
     * @param confirmButton              确认按钮
     * @param confirmButtonClickListener 确认按钮点击监听器
     * @param centerButton               中间按钮
     * @param centerButtonClickListener  中间按钮点击监听器
     * @param cancelButton               取消按钮
     * @param cancelButtonClickListener  取消按钮点击监听器
     * @param onShowListener             显示监听器
     * @param cancelable                 是否允许通过点击返回按钮或者点击对话框之外的位置关闭对话框
     * @param onCancelListener           取消监听器
     * @param onDismissListener          销毁监听器
     * @return 对话框
     */
    public static AlertDialog showAlert(Context context, String title, String message,
                                        String confirmButton, DialogInterface.OnClickListener confirmButtonClickListener,
                                        String centerButton, DialogInterface.OnClickListener centerButtonClickListener,
                                        String cancelButton, DialogInterface.OnClickListener cancelButtonClickListener,
                                        DialogInterface.OnShowListener onShowListener, boolean cancelable,
                                        DialogInterface.OnCancelListener onCancelListener,
                                        DialogInterface.OnDismissListener onDismissListener)
    {
        AlertDialog.Builder promptBuilder = new AlertDialog.Builder(context);
        if (title != null)
        {
            promptBuilder.setTitle(title);
        }
        if (message != null)
        {
            promptBuilder.setMessage(message);
        }
        if (confirmButton != null)
        {
            promptBuilder.setPositiveButton(confirmButton, confirmButtonClickListener);
        }
        if (centerButton != null)
        {
            promptBuilder.setNeutralButton(centerButton, centerButtonClickListener);
        }
        if (cancelButton != null)
        {
            promptBuilder.setNegativeButton(cancelButton, cancelButtonClickListener);
        }
        promptBuilder.setCancelable(true);
        if (cancelable)
        {
            promptBuilder.setOnCancelListener(onCancelListener);
        }

        AlertDialog alertDialog = promptBuilder.create();
        if (!(context instanceof Activity))
        {
            alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        }
        alertDialog.setOnDismissListener(onDismissListener);
        alertDialog.setOnShowListener(onShowListener);
        alertDialog.show();
        return alertDialog;
    }


    /**
     * 显示一个对话框
     *
     * @param context                    上下文对象,最好给Activity,否则需要android.permission.SYSTEM_ALERT_WINDOW
     * @param title                      标题
     * @param message                    消息
     * @param confirmButtonClickListener 确认按钮点击监听器
     * @param cancelButtonClickListener  取消按钮点击监听器
     * @return 对话框
     */
    public static AlertDialog showConfirm(Context context, String title, String message,
                                        DialogInterface.OnClickListener confirmButtonClickListener,
                                        DialogInterface.OnClickListener cancelButtonClickListener)
    {
        return showAlert(context, title, message, "Yes",
                confirmButtonClickListener, null, null, "No", cancelButtonClickListener, null, true, null, null);
    }


    /**
     * 显示一个提示框
     *
     * @param context       上下文对象,最好给Activity,否则需要android.permission.SYSTEM_ALERT_WINDOW
     * @param message       提示的消息
     * @param confirmButton 确定按钮的名字
     */
    public static AlertDialog showPrompt(Context context, String message, String confirmButton)
    {
        return showAlert(context, null, message, confirmButton, null, null, null, null, null, null, true, null, null);
    }



    /**
     * 显示一个提示框
     *
     * @param context 上下文对象,最好给Activity,否则需要android.permission.SYSTEM_ALERT_WINDOW
     * @param message 提示的消息
     */
    public static AlertDialog showPrompt(Context context, String message)
    {
        return showAlert(context, null, message, "OK", null, null, null, null, null, null, true, null, null);
    }
}

RequestPermissionType.java是申请的权限Code
/**
 * Created by wzj on 2017/2/19.
 */
public interface RequestPermissionType
{

    /**
     * 请求打电话的权限码
     */
    int REQUEST_CODE_ASK_CALL_PHONE = 100;
}






评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dmfrm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值