首先我们的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);    }}

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

如有疑问可以留言给我

更多相关文章

  1. Android(安卓)权限列表permission说明
  2. android 得到唯一码和电话号码
  3. Android(安卓)动态获取创建与删除文件权限
  4. android 开启关闭wifi服务
  5. Android(安卓)SQLITE 操作工具类
  6. android中一种欢迎界面模式
  7. Android(安卓)中如何复制文件的操作
  8. Android实现随屏幕旋转的TextView
  9. android FastJson的使用

随机推荐

  1. java 构造器内部的多态方法和行为
  2. java I/O流初步认识使用
  3. JavaScript-C/C++ (SpiderMonkey) 引擎嵌
  4. Object 开发中常用的重写方法总结toStrin
  5. 在spring 中如何注入map,set,list,property
  6. Spring Hibernate:没有类型为org.hibernat
  7. Java-马士兵设计模式学习笔记-装饰者模式
  8. 在Java中包含运行JavaScript的引擎的原因
  9. Java数组的运用
  10. JSP页面中有一个按钮 点击之后执行JAVA文