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

Android 6.0运行时权限解决方案

2016-07-10 21:47 375 查看
首先我们的targetsdk设置为23

如图所示



然后我们在我们的在我们需要使用某一个权限的时候,调用下边的代码

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
//申请WRITE_EXTERNAL_STORAGE权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
}


然后在界面中回调我们申请权限的是否成功

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 201:
if (grantResults.length > 0) {
//确认权限
//处理自己的逻辑
//取消处理自己的逻辑
} else {
//取消权限
}
break;
}
}


ok,Android 6.0的运行时权限就这么简单就可以解决了,但是国内手机例如小米等6.0的系统是不弹出申请权限的对话款的.我的解决方案就是把targetsdk设置为22即可,就可以完美兼容了,也不用进行上边的代码申请权限.

虽然设置targetsdk可以免去申请权限的麻烦,但是一旦用户拒绝了权限,就会导致应用crash,所以既然省去不了,那就去简化申请权限的步骤吧看下边我自己封装的工具类

下边是一些需要去手动申请的权限列表.希望可以给你们帮助.

group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS

group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL

group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR

group:android.permission-group.CAMERA
permission:android.permission.CAMERA

group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS

group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION

group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE

group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO

group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS


package cn.yuan.xiaoyu.testmodule.utils;

import android.app.Activity;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;

/**
* Created by yukuoyuan on 2017/8/26.
* 这是一个处理权限的工具类
*/
public class PermissionsUtils {
private static PermissionsUtils sInstance;
private OnPermissionListener onPermissionListener;

private PermissionsUtils() {
}

public interface OnPermissionListener {
void onRequestPermissionSuccess(int requestCode);

void onRequestPermissionFailure(int requestCode);
}

public static PermissionsUtils instance() {
if (sInstance == null) {
synchronized (PermissionsUtils.class) {
if (sInstance == null) {
sInstance = new PermissionsUtils();
}
}
}
return sInstance;
}

/**
* 申请权限的方法
*
* @param context              当前界面
* @param permission           需要申请的权限
* @param requestCode          请求标识
* @param onPermissionListener 回调监听
*/
public void requestPermission(@NonNull Activity context, @NonNull String permission, int requestCode, OnPermissionListener onPermissionListener) {
this.onPermissionListener = onPermissionListener;
/***
* 是否是询问权限
*/
if (ContextCompat.checkSelfPermission(context,
permission)
!= PackageManager.PERMISSION_GRANTED) {
/**
* 权限询问
*/
ActivityCompat.requestPermissions(context,
new String[]{permission},
111);
} else if (ContextCompat.checkSelfPermission(context,
permission)
== PackageManager.PERMISSION_DENIED) {
/**
* 权限拒绝了
*/
if (onPermissionListener != null) {
onPermissionListener.onRequestPermissionFailure(requestCode);
}
} else {
/**
* 权限允许
*/
if (onPermissionListener != null) {
onPermissionListener.onRequestPermissionSuccess(requestCode);
}
}
}

/**
* 处理权限回调结果
*
* @param requestCode          请求标识
* @param grantResults         是否允许了权限
* @param onPermissionListener 回调监听
*/
public void onRequestPermissionsResult(int requestCode, int[] grantResults, OnPermissionListener onPermissionListener) {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (onPermissionListener != null) {
onPermissionListener.onRequestPermissionSuccess(requestCode);
}
} else {
if (onPermissionListener != null) {
onPermissionListener.onRequestPermissionFailure(requestCode);
}
}
}

}


使用方法示例

Activity中使用

package cn.yuan.xiaoyu.testmodule.activity;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import butterknife.Bind;
import butterknife.OnClick;
import cn.yuan.xiaoyu.R;
import cn.yuan.xiaoyu.commonmodule.activity.BaseActivity;
import cn.yuan.xiaoyu.commonmodule.utils.StatusBarCompatUtils;
import cn.yuan.xiaoyu.testmodule.utils.PermissionsUtils;

/**
* Created by yukuoyuan on 2017/3/31.
*/

public class RecycleviewsActivity extends BaseActivity implements PermissionsUtils.OnPermissionListener {

@Override
protected void bindPresenter() {

}

@Override
protected void initData(Bundle extras) {

}

@Override
public int getContentLayout() {
return R.layout.activity_recycleviews;
}

@Override
protected void initToolbar() {
}

@OnClick({R.id.iv_toolbar_left, R.id.tv_toolbar_title, R.id.bt_test_01, R.id.bt_test_02})
public void onClick(View view) {
switch (view.getId()) {
case R.id.iv_toolbar_left:
onBackPressed();
break;
case R.id.tv_toolbar_title:
break;
case R.id.bt_test_01:
PermissionsUtils.instance().requestPermission(this, Manifest.permission.CALL_PHONE, 111, this);
break;
case R.id.bt_test_02:
break;
}
}

/**
* 权限申请的回调
*
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
PermissionsUtils.instance().onRequestPermissionsResult(requestCode, grantResults, this);
}

/**
* 拨打电话
*/
public void callPhone() {
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + "13");
intent.setData(data);
startActivity(intent);
}

@Override
public void onRequestPermissionSuccess(int requestCode) {
showToast(this, "授权成功");
callPhone();
}

@Override
public void onRequestPermissionFailure(int requestCode) {
showToast(this, "授权失败");

}
}


Fragment中使用

package cn.yuan.xiaoyu.newsmodule.fragment;

import android.Manifest;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import butterknife.Bind;
import butterknife.OnClick;
import cn.yuan.xiaoyu.R;
import cn.yuan.xiaoyu.commonmodule.fragment.BaseFragment;
import cn.yuan.xiaoyu.testmodule.utils.PermissionsUtils;

/**
* Created by yukuoyuan on 2017/3/7.
* 这是一个新闻的视频列表的界面
*/

public class NewsVideosFragment extends BaseFragment implements PermissionsUtils.OnPermissionListener {

@Override
public void initdata(Bundle arguments) {

}

@Override
public int getContentLayout() {
return R.layout.fragment_newsvideo;
}

@Override
protected void bindPresenter() {

}

@Override
protected void initToolbar() {

}

@OnClick({R.id.bt_test_01, R.id.bt_test_02})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.bt_test_01:
PermissionsUtils.instance().requestPermission(getActivity(), Manifest.permission.CALL_PHONE, 111, this);

break;
case R.id.bt_test_02:
break;
}
}

@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
PermissionsUtils.instance().onRequestPermissionsResult(requestCode, grantResults, this);
}

@Override
public void onRequestPermissionSuccess(int requestCode) {
callPhone();

}

@Override
public void onRequestPermissionFailure(int requestCode) {
showToast(getActivity(), "授权失败");

}

public void callPhone() {
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + "10086");
intent.setData(data);
startActivity(intent);
}
}


另外我开通了微信个人公众号,欢迎大家关注,



如有疑问可以留言给我
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: