从安卓权限做事的方式看问题

       最近因为 安卓6.0权限 还有 7.0文件共享 事情整的焦头烂额,暴露出一些问题,刚刚开始时并没有出现什么权限和共享文件的bug,后来陆陆续续多了一些高版本用户,导致崩溃率上升了不少,特此需要解决权限问题,之前一直用的是EasyPermission这个框架,刚刚开始也没怎么测试直接丢到项目中跑了,后来深入发现这种方法并非100%不出错,找了几个关于权限的框架,比如一个日本朋友写的PermissionDispatch,国内的没敢用,因为star的数太少了,来回的测试,认为提示不好,国内小米和华为的工程师喜欢搞事,找不出一套兼顾全部机型的方法,最后没辙了,直接上官网,老老实实看英文解释说明,写了一个demo放到优测去测试,结果效果非常好,虽然代码量多了点,那些框架用annotation注解去搞事,对代码各种封装,结果还是没能解决问题,实际上消耗的时间是非常大的,如果一开始做个老实人,应该啥事都没有,之前的文件存储也是一个道理,直接看英文文档,ok,终于弄懂了,对于国内博客各种抄袭表示深深地**  有时候真的怀疑信息的真实性,是不是生活在黑客帝国或者楚门的世界那样的地方。 


     最近kotlin很热,各种广告,在开发中也觉得安卓的空指针异常处理是非常难受的,明明不会为空的东西在某种情况下就空了,这种bug导致崩溃率又上升了几个点,这一个月的崩溃率2.0左右,离1.5差很多,在说发版本的问题,因为我和测试的疏忽,金额写反导致了俩次发布,实在是汗颜,谁知道这一个月经历了什么。 


    用时一个半月,也算又熟悉了并习惯了开发的生活,成年后的无限可能性让我着迷。 


最后为了字数贴代码   官网才是可靠的干爹

package com.example.robin.permissiontest;

import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private final int PERMISSIONS_REQUEST_CON_ST = 1231;
    String[] perms = {Manifest.permission.READ_CONTACTS, Manifest.permission.READ_EXTERNAL_STORAGE};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                camera();
            }
        });
    }

    private void camera() {
        if (hasNoPermission(perms)) {
            if (shouldShowExplanation(perms)) {
                // explain to the user *asynchronously* -- don't block
                Log.d("jack", "-----shouldShowExplanation---");
                showExplain();
            } else {
                Log.d("jack", "-----request permission---");
                // No explanation needed, we can request the permission.
                ActivityCompat.requestPermissions(MainActivity.this, perms, PERMISSIONS_REQUEST_CON_ST);
            }
        } else {
            Toast.makeText(MainActivity.this, "---u got permission----", Toast.LENGTH_SHORT).show();
            Log.d("jack", "-----u got permission do anything here---");
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        Log.d("jack", "--------onRequestPermissionsResult---------" + requestCode);
        switch (requestCode) {
            case PERMISSIONS_REQUEST_CON_ST:
                // If request is cancelled, the result arrays are empty.
                if (allPermissionGranted(grantResults)) {
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                    Log.d("jack", "-------onRequestPermissionsResult-----finally u got all permission----");
                    camera();
                } else {
                    if (!shouldShowExplanation(permissions)) {  // 完全被拒绝
                        goSetting();
                    } else {        //
                        Toast.makeText(MainActivity.this, "---permission denied----", Toast.LENGTH_SHORT).show();
                    }
                }
                return;
            default:
                break;

        }
    }

    private boolean shouldShowExplanation(String[] perms) {
        for (int i = 0; i < perms.length; i++) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, perms[i])) {
                return true;
            }
        }
        Log.d("jack", "-----shouldShowExplanation return false---");
        return false;
    }

    private boolean hasNoPermission(String[] perms) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            Log.d("jack", "-----hasPermission lower api 23---");
            return false;
        }
        for (int i = 0; i < perms.length; i++) {
            if (ContextCompat.checkSelfPermission(MainActivity.this, perms[i]) != PackageManager.PERMISSION_GRANTED) {
                return true;
            }
        }
        return false;
    }

    private void showExplain() {
        new AlertDialog.Builder(MainActivity.this)
                .setTitle("权限说明")
                .setMessage("为了功能正常使用,需要以下权限")
                .setNegativeButton("拒绝", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .setPositiveButton("授权", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ActivityCompat.requestPermissions(MainActivity.this, perms, PERMISSIONS_REQUEST_CON_ST);
                        dialog.dismiss();
                    }
                }).create().show();
    }



    private boolean allPermissionGranted(int[] grantResults){
        if(grantResults==null || grantResults.length == 0) return false;
        for(int i=0; i<grantResults.length; i++){
            if(grantResults[i] != PackageManager.PERMISSION_GRANTED){
                return false;
            }
        }
        return true;
    }

    private void goSetting() {
        new AlertDialog.Builder(MainActivity.this)
                .setTitle("提示")
                .setMessage("没有权限功能无法使用,进入系统设置授权?")
                .setNegativeButton("拒绝", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .setPositiveButton("设置", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //前往应用详情界面
                        try {
                            Uri packUri = Uri.parse("package:" + getPackageName());
                            Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packUri);
                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            startActivity(intent);
                            dialog.dismiss();
                        } catch (Exception e) {
                            Toast.makeText(MainActivity.this, "请手动进入系统设置进行授权", Toast.LENGTH_SHORT).show();
                        }
                        dialog.dismiss();
                    }
                }).create().show();
    }
}



I'm fish, I'm on.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值