不用三方 , 自己做Android6.0运行时权限的处理
来源:互联网 发布:夏川里美 知乎 编辑:程序博客网 时间:2024/06/08 18:41
自从安卓6.0出来以后 , 运行时权限有时候也成为了一个梗 下面将叫你如何利用自带的API , 处理运行时权限问题
拿最简单的拨打电话为例
在Manifest.xml中配置所需权限是必不可少的, 权限可参考http://blog.csdn.net/true100/article/details/51644268
通话所用到的权限是
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
这里我新建一个CallActivity类, 引用一个布局,布局只有一个按钮
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.administrator.jvmandroid.CallActivity"> <Button android:id="@+id/m_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="拨打电话" /></RelativeLayout>
我们先声明一个String数组用来存放所需要申请的权限
String[] mPermission = {Manifest.permission.CALL_PHONE};
我们将判断权限的代码抽成一个方法叫isPermission();
然后在onCreate方法中调用
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.mBtn = (Button) findViewById(R.id.m_btn); mBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startToActivity(); } }); isPermission();//<-----调用位置在这里 } /** *判断是否有这个权限 * @see ContextCompat.checkSelfPermission() 这个方法是系统自带的检查权限方法 具有两个返回值 * @see PackageManager#PERMISSION_DENIED 不具有权限 , 需要申请 * @see PackageManager#PERMISSION_GRANTED 具有权限 */ public void isPermission() { if (ContextCompat.checkSelfPermission(this, mPermission[0]) == PackageManager.PERMISSION_DENIED) { //如果返回值是PackageManager#PERMISSION_DENIED的话 证明不具备权限, 则需要向用户申请 调用ActivityCompat#requestPermission(),这个方法会回调onRequestPermissionsResult() ActivityCompat.requestPermissions(this, mPermission, 100); } }
剩下的我们在onRequestPermissionsResult()在做权限判断
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { //requestCode是在上个方法中标识的 if (requestCode == 100) { if (grantResults[0] == PackageManager.PERMISSION_DENIED) { //grantResults返回的是申请权限成功或者失败 如果返回的是PackageManager#PERMISSION_DENIED,证明没有调用成功(这个判断默认会在用户选择不再询问后调用), 如果用户拒绝 则弹出dailog告诉用户为什么需要这个权限 alertSetting(); } } } /** * 弹出对话框告诉用户为什么需要这个权限 */ private void alertSetting() { AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); alertDialog.setTitle("有权限未申请"); alertDialog.setIcon(R.mipmap.ic_launcher); alertDialog.setMessage("拒绝权限可能导致某些功能异常,可到设置页面开启权限"); alertDialog.setPositiveButton("设置", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Uri uri = Uri.parse("package:" + getPackageName()); Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, uri); startActivity(intent); dialog.dismiss(); } }); alertDialog.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); alertDialog.create().show(); }
我这里选择的如果用户未做选择就翻回来的话不判断, 当用户点击通话的时候在进行判断权限
/** * 跳转到打电话 */ private void startToActivity() { //接着调用权限检查方法 isPermission(); Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setData(Uri.parse("tel:***********")); startActivity(intent); }
在6.0手机上测试可用 完整的代码如下
import android.Manifest;import android.content.DialogInterface;import android.content.Intent;import android.content.pm.PackageManager;import android.net.Uri;import android.os.Bundle;import android.provider.Settings;import android.support.annotation.NonNull;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.AlertDialog;import android.view.View;import android.widget.Button;public class CallActivity extends BaseActivity { private Button mBtn; String[] mPermission = {Manifest.permission.CALL_PHONE}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.mBtn = (Button) findViewById(R.id.m_btn); mBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startToActivity(); } }); isPermission(); } /** * 先检查是否具有权限 * @see PackageManager#PERMISSION_DENIED 不具有权限 , 需要申请 * @see PackageManager#PERMISSION_GRANTED 具有权限 */ public void isPermission() { if (ContextCompat.checkSelfPermission(this, mPermission[0]) == PackageManager.PERMISSION_DENIED) { ActivityCompat.requestPermissions(this, mPermission, 100); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == 100) { if (grantResults[0] == PackageManager.PERMISSION_DENIED) { alertSetting(); } } } /** * 弹出对话框告诉用户为什么需要这个权限 */ private void alertSetting() { AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); alertDialog.setTitle("有权限未申请"); alertDialog.setIcon(R.mipmap.ic_launcher); alertDialog.setMessage("拒绝权限可能导致某些功能异常,可到设置页面开启权限"); alertDialog.setPositiveButton("设置", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Uri uri = Uri.parse("package:" + getPackageName()); Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, uri); startActivity(intent); dialog.dismiss(); } }); alertDialog.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); alertDialog.create().show(); } /** * 跳转到打电话 */ private void startToActivity() { isPermission(); Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setData(Uri.parse("tel:***********")); startActivity(intent); }}
0 0
- 不用三方 , 自己做Android6.0运行时权限的处理
- Android6.0运行时权限的处理
- Android6.0+运行时权限的处理
- Android6.0运行时权限处理(项目中使用到的一种形式,没有使用第三方库)
- Android6.0运行时权限处理
- Android6.0运行时权限处理详解
- android6.0运行时权限处理简介
- Android6.0运行时权限处理
- Android6.0运行时权限处理透析
- 关于Android6.0运行时权限处理
- Android6.0运行时权限的处理及解决办法
- Android6.0运行时权限的处理及解决办法
- Android6.0运行时权限解析,RxPermissions的使用,自己封装一套权限框架
- Android6.0运行时权限解析,RxPermissions的使用,自己封装一套权限框架
- Android6.0运行时权限的封装
- Android6.0的运行时权限
- android6.0 运行时权限处理完全解析
- Android6.0运行时权限处理-超简单封装
- 用遥控器控制led灯亮以及LCD上显示相应的按键数
- VMware扩容
- C++静态全局变量的不可见性
- FZU - 2150 bfs [kuangbin带你飞]专题一
- ubuntu16.04下进行android开发
- 不用三方 , 自己做Android6.0运行时权限的处理
- 数据结构的内存分配、对齐,及指针加1的含义
- 关于JAVA语言的跨平台性的理解
- [Git]Git教程之msysgit(命令行形式)
- 前端面试题整理
- XiaomiRouter自学之路(02-软硬件环境搭建)
- Java是一个内容繁杂的系统
- 基于python的互联网软件测试开发(自动化测试)-全集合
- 蓝桥杯算法提高 第二大整数