Android7.0动态申请打电话的权限
2017-02-19 10:34
691 查看
新建一个Android工程,在布局文件里面加入一个拨打电话按钮。
![](https://img-blog.csdn.net/20170219102245328)
点击拨打电话之后,弹出对话框让用户选择是否允许申请权限。
![](https://img-blog.csdn.net/20170219102359689)
当用户点击YES之后,就向系统申请权限。
![](https://img-blog.csdn.net/20170219102439993)
布局文件如下,在布局文件中加入按钮,同时注册响应事件,callButtonClickAction:
Manifest.xml文件,添加android.permission.CALL_PHONE打电话的权限。
下面是MainActivity.java的代码,注意看代码注释,注释写的很详细
DialogUtil,java是是弹窗工具类
点击拨打电话之后,弹出对话框让用户选择是否允许申请权限。
当用户点击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; }
相关文章推荐
- Android笔记 android 7.0 动态申请权限
- Android 6.0 动态权限申请
- android 如何动态申请权限
- Android动态权限判断以及动态权限申请
- android拨打电话崩溃6.0以上实时动态权限申请
- Android 新安全机制之动态权限申请
- android6.0 动态申请权限
- Android M动态申请获取权限android.permission.READ_PHONE_STATE
- Android之动态申请权限(API23以上需求)
- Android 新安全机制之动态权限申请
- android 动态申请权限
- android简单学习6.0的动态权限申请
- Android开发之利用注解简单实现动态权限申请
- Android 6.0动态权限申请
- Android中不支持动态申请权限的原因
- Android 6.0动态权限申请的处理
- Android 6.0 动态权限申请
- android 动态申请权限
- Android 6.0 动态权限申请
- Android 6.0 动态权限申请注意事项