自从安卓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);
}
}