您的位置:首页 > 移动开发 > Android开发

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

2017-02-19 10:34 691 查看
新建一个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: