Android 6.0运行时权限解决方案
2016-07-10 21:47
375 查看
首先我们的targetsdk设置为23
如图所示
然后我们在我们的在我们需要使用某一个权限的时候,调用下边的代码
然后在界面中回调我们申请权限的是否成功
ok,Android 6.0的运行时权限就这么简单就可以解决了,但是国内手机例如小米等6.0的系统是不弹出申请权限的对话款的.我的解决方案就是把targetsdk设置为22即可,就可以完美兼容了,也不用进行上边的代码申请权限.
另外我开通了微信个人公众号,欢迎大家关注,
如有疑问可以留言给我
如图所示
然后我们在我们的在我们需要使用某一个权限的时候,调用下边的代码
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); } }
另外我开通了微信个人公众号,欢迎大家关注,
如有疑问可以留言给我
相关文章推荐
- Android开源项目 开发及测试工具
- Android开源项目 优秀项目
- Android 创建一个新的Activity
- android.os.NetworkOnMainThreadException 异常处理
- Android开源项目 工具库
- Android-多线程AsyncTask
- Android 那些你所不知道的Bitmap对象详解
- 比想象中好用的Android单元测试——初探
- Android Paint属性详解
- Android之自定义ListView(一)
- Android中按图片像素缩放图片的一种方法
- Android开源项目 个性化控件(View)
- android样式开发遇到的小坑
- RxJava 在Android中的应用(二)
- android版ape,flac,wav,mp3播放器
- android打包
- Handler的介绍
- Activity生命周期详解(三)
- RxJava 在Android中的应用(一)
- 本地XML之Pull解析