android 6.0权限,如果不请求权限则会报错

我的看法

最近随着6.0版本的扩散,我发现了一些权限问题,有视频,拍照,语音等等都涉及到。

在6.0版本,android增加了一个权限管理,如果项目使用api23以上,但是代码中如果不添加请求权限代码的话,那么则会报错。

如果程序中调用了语音方面的话,这属于危险级别权限,如果不在AndroidManifest添加权限,一旦调用语音也会报错。

有人说将api改成23以下就好了,我认为这段时间的确可以将就下,但是随着android版本的迭代快速的情况下,越早了解越早掌握权限这方面功能越好。

这个链接十分详细的介绍了权限细节以及如何请求。
http://www.jianshu.com/p/dbe4d37731e6(http://www.jianshu.com/p/dbe4d37731e6)

第三方库动态权限检测,一句话代码搞定!
https://github.com/forJrking/HeiPermission(https://github.com/forJrking/HeiPermission)

权限组

权限组 权限
CALENDAR日历 READ_CALENDAR
WRITE_CALENDAR
CAMERA相机 CAMERA
WRITE_CALENDAR
CAMERA联络 READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
LOCATION位置 ACCESS_FINE_LOCATION 允许一个程序访问精良位置(如GPS) (Allows an application to access fine (e.g., GPS) location)
ACCESS_COARSE_LOCATION 允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location)
MICROPHONE麦克风 RECORD_AUDIO
PHONE电话 READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
SENSORS传感器 BODY_SENSORS
SMS短讯服务 SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
STORAGE存储 READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE

我的应用这么写

其实基本核心就这两段代码

这个用来请求权限

public static final int EXTERNAL_STORAGE_REQ_CODE = 10 ;
    
    public void requestPermission(){
        //判断当前Activity是否已经获得了该权限
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {

            //如果App的权限申请曾经被用户拒绝过,就需要在这里跟用户做出解释
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                Toast.makeText(this,"please give me the permission",Toast.LENGTH_SHORT).show();
            } else {
                //进行权限请求
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        EXTERNAL_STORAGE_REQ_CODE);
            }
        }
    }

当用户操作后,就跳到该方法

@Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case EXTERNAL_STORAGE_REQ_CODE: {
                // 如果请求被拒绝,那么通常grantResults数组为空
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //申请成功,进行相应操作
                } else {
                    //申请失败,可以继续向用户解释。
                }
                return;
            }
        }
    }

可以再改进一些

1.像我的日记diary,写入sd卡这个权限是必要的,所以是在app欢迎界面的时候,就进行了权限要求,如果客户拒绝,那就循环请求:) 哈哈哈哈哈
2.解释为什么需要这些权限是很有必要的

改进后的代码

逻辑:比如我的日记diary需要相机、麦克风、存储权限,并且我需要开始app的时候就启动请求权限,只有存储权限是必要的。而相机、麦克风权限,可以在使用的时候再请求

/* *
 * 这是根据设置来切换风格的
 * Created by zhongjh on 2016/3/12.
 */
public class StartActivity extends ToolBarActivity {

    //存储请求权限的requestCode
    public static final int EXTERNAL_STORAGE_REQ_CODE = 1;
//    //拍照请求权限的requestCode
//    public static final int EXTERNAL_CAMERA_REQ_CODE = 2;
//    //麦克风请求权限的requestCode
//    public static final int MICROPHONE_STORAGE_REQ_CODE = 3;

    @Override
    protected void onInitCreate(Bundle savedInstanceState) {
        //请求存储权限
        if (requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, "日记diary需要请求您的SD卡权限!把数据存储在SD卡方便您私人移植!否则运行不了日记diary!", EXTERNAL_STORAGE_REQ_CODE)) {
            start();
        }
    }

    @Override
    protected void onInitListener() {

    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String permissions[], @NonNull int[] grantResults) {
        switch (requestCode) {
            case EXTERNAL_STORAGE_REQ_CODE: {
                // 如果请求被拒绝,那么通常grantResults数组为空
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //申请成功,进行相应操作
                    Toast.makeText(this, "授权成功!请重新打开日记diary让数据库生效!", Toast.LENGTH_SHORT).show();
                    StartActivity.this.finish();
                } else {
                    //申请失败,可以继续向用户解释。
                    requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, "日记diary需要请求您的SD卡权限!把数据存储在SD卡方便您私人移植!否则运行不了日记diary!", EXTERNAL_STORAGE_REQ_CODE);
                }

            }
        }
    }

    /**
     * 所有授权都通过了就显示正式的app
     */
    private void start() {
        requestWindowFeature(Window.FEATURE_NO_TITLE);// 填充标题栏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        SharedPreferences sp = getActivity().getSharedPreferences(UserSetting.SETTING, MODE_PRIVATE);

        int setting_main = sp.getInt(UserSetting.SETTING_MAIN, -1);
        Intent intent = new Intent();
        //根据类型打开窗体
        switch (setting_main) {
            case 0:
                intent.setClass(getActivity(), MainActivity.class);
                startActivity(intent);
                break;
            case 1:
                intent.setClass(getActivity(), MainTwoActivity.class);
                startActivity(intent);
                break;
            case -1:
                //这是个欢迎界面,这个欢迎界面结束后就赋值setting_main为1
                intent.setClass(getActivity(), PagerActivity.class);
                startActivity(intent);
                break;
        }
        getActivity().finish();
    }

    /**
     * @param permission  权限
     * @param ContentText 对话框提示内容
     * @param requestCode 权限请求号,返回时需要用到
     * @return 是否授权
     */
    public boolean requestPermission(String permission, String ContentText, int requestCode) {
        //判断当前Activity是否已经获得了该权限
        if (ContextCompat.checkSelfPermission(this,
                permission)
                != PackageManager.PERMISSION_GRANTED) {

            //如果App的权限申请曾经被用户拒绝过,就需要在这里跟用户做出解释
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    permission)) {
                // 构造对话框
                SweetAlertDialog sweetAlertDialog = new SweetAlertDialog(getActivity(), SweetAlertDialog.WARNING_TYPE);
                sweetAlertDialog.setContentText(ContentText);
                sweetAlertDialog.setCancelable(false);
                sweetAlertDialog.setConfirmText("确定");
                sweetAlertDialog.setConfirmClickListener(sweetAlertDialog1 -> {
                    sweetAlertDialog1.dismiss();
                    //进行权限请求
                    ActivityCompat.requestPermissions(this,
                            new String[]{permission},
                            requestCode);
                });
                sweetAlertDialog.show();
            } else {
                //进行权限请求
                ActivityCompat.requestPermissions(this,
                        new String[]{permission},
                        requestCode);
            }
            return false;
        } else {
            return true;
        }
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容