Android动态获取6.0权限--运行时权限


在现在的安卓开发中,所有的APP都需要实现一个功能,那就是权限的获取。在Android的6.0版本以上一些涉及到隐私的权限在安装时不会主动给予,而是需要我们在代码中去手动获取所需要的权限。之前自己也在网上搜索过一些文章,要么是帮助不大,要么是达到的目的不完整,从而导致一脑门汗呐,所以我自己在摸索了一阵之后,参考部分文章,结合自己的一些思路,完成了一个大致还算完整的demo,供大家参考。有问题还望大家指正出来,感激不尽。。

先给大家看下效果图吧
获取权限
其实呢,实现过程很简单,只有一个权限获取的管理类去操作就好

管理类如下:

package cctx.love.android.permissionutils;

import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;

/**
 * 权限管理控制页面
 * @author CC
 */
public class CCpermission extends Activity {

    //权限默认请求个数
    public static final int PERMISSION_SIZE = 0;

    //权限默认请求个数
    public static final int PERMISSION_REQUEST_CODE = 321;

    //上下文
    private Activity activity;

    //权限集合
    private String[] permissions;

    //静态参数
    public static CCpermission mInstance;

    /**
     * 有参构造方法
     * @param activity
     * @param permissions
     */
    public CCpermission(Activity activity, String[] permissions){
        Log.i(activity + "", "CCpermission");
        this.activity = activity;
        this.permissions = permissions;
    }

    /**
     * 实例化当前对象
     * @return
     */
    public static CCpermission getmInstance(Activity activity, String[] permissions){
        //提升效率。防止重复创建
        if(mInstance == null){
            //加锁
            synchronized (CCpermission.class){
                //实例化对象
                if(mInstance == null)
                    mInstance = new CCpermission(activity, permissions);
            }
        }
        return mInstance;
    }

    /**
     * checkpermission
     * true==尚未获取
     * false==已获取
     * @param activity
     * @param permissions
     */
    public static boolean check_permission(Activity activity, String[] permissions){
        if(permissions.length == PERMISSION_SIZE)
            return false;
        // 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            for(int i = 0; i < permissions.length; i++){
                // 检查该权限是否已经获取
                int j = ContextCompat.checkSelfPermission(activity, permissions[i]);
                // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
                if (j != PackageManager.PERMISSION_GRANTED) {
                    start_permission(activity, permissions);
                }else{
                    start_permission(activity, permissions);
                }
            }
        }
        return false;
    }

    /**
     * requestpermission
     * @param activity
     * @param permissions
     */
    public static void start_permission(Activity activity, String[] permissions){
        if(permissions.length == PERMISSION_SIZE)
            return;
        //请求权限
        ActivityCompat.requestPermissions(activity, permissions, PERMISSION_REQUEST_CODE);
    }

}
注:这个里面了有两个主要方法,一个是判断当前权限是否已经获取,一个是获取当前权限。

在activity中调用也很简单,通过getmInstance方法去获取当前对象,再去调用下面的方法就好

activity.class如下

package cctx.love.android.permission;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import cctx.love.android.permissionutils.CCpermission;

public class MainActivity extends AppCompatActivity {

    // 要申请的权限
    private String[] permissions = {
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.ACCESS_COARSE_LOCATION
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                CCpermission.getmInstance(MainActivity.this, permissions).check_permission(MainActivity.this, permissions);
            }
        });

    }


    /**
     * 权限回调
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //PERMISSION_REQUEST_CODE
        if (requestCode == CCpermission.PERMISSION_REQUEST_CODE) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                for (int i = 0; i < grantResults.length; i++) {
                    if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                        Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();
                    } else if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                        // 判断用户是否点击了不再提醒。(检测该权限是否还可以申请)
                        boolean b = shouldShowRequestPermissionRationale(permissions[i]);
                        if (!b) {
                            // 提示用户去应用设置界面手动开启权限
                            Toast.makeText(this, "权限拒绝,并已勾选不再提示,请手动开启", Toast.LENGTH_SHORT).show();
                        } else {
                            // 提示用户去应用设置界面手动开启权限
                            Toast.makeText(this, "权限拒绝,请手动开启", Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            }
        }
    }

}

注:onRequestPermissionsResult:权限回调方法。听过这个去进行后续操作。

总之,安卓6.0的权限对于安卓来说是一个比较大的提升,从用户层考虑,他通过这种隐私权限主动获取来降低用户数据的丢失,确保用户手机系统的安全性。也算是一个好的提升


具体代码工作还是看demo,通过运行demo和查看打印日志的方式对权限获取的步骤和操作方法会更加清晰。
最后附上demo:源码在这里


q:486789970
email:[email protected]

如果有什么问题,欢迎大家指导。并相互联系,希望能够通过文章互相学习。

猜你喜欢

转载自blog.csdn.net/qq_35840038/article/details/88311830