Android(安卓)6.0运行时权限解决方案
16lz
2021-01-24
首先我们的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_CONTACTSgroup: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_VOICEMAILgroup:android.permission-group.CALENDAR permission:android.permission.READ_CALENDAR permission:android.permission.WRITE_CALENDARgroup:android.permission-group.CAMERA permission:android.permission.CAMERAgroup:android.permission-group.SENSORS permission:android.permission.BODY_SENSORSgroup:android.permission-group.LOCATION permission:android.permission.ACCESS_FINE_LOCATION permission:android.permission.ACCESS_COARSE_LOCATIONgroup:android.permission-group.STORAGE permission:android.permission.READ_EXTERNAL_STORAGE permission:android.permission.WRITE_EXTERNAL_STORAGEgroup:android.permission-group.MICROPHONE permission:android.permission.RECORD_AUDIOgroup: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); }}
另外我开通了微信个人公众号,欢迎大家关注,
如有疑问可以留言给我
更多相关文章
- Android(安卓)权限列表permission说明
- android 得到唯一码和电话号码
- Android(安卓)动态获取创建与删除文件权限
- android 开启关闭wifi服务
- Android(安卓)SQLITE 操作工具类
- android中一种欢迎界面模式
- Android(安卓)中如何复制文件的操作
- Android实现随屏幕旋转的TextView
- android FastJson的使用