Android6.0运行时权限管理

Android6.0
全称:Marshmallow
主要更新:电源管理(应用待机)、App link(应用之间交互)、指纹识别、应用程序权限管理等等
Android6.0权限主要分为两类Normal Permissions和Dangerous Permission
我们可以通过adb shell pm list permissions -d -g查看危险权限组
对于危险权限我们需要在程序中进行判断,具体实现代码如下:
一、自己封装权限管理模块

package com.czhappy.permissiontest.utils;

/**
 * Description:
 * User: chenzheng
 * Date: 2016/12/14 0014
 * Time: 15:10
 */
public class Constants {

    public static final int WRITE_EXTERNAL_CODE = 0X01;
    public static final int CALL_PHONE_CODE = 0X02;
}
package com.czhappy.permissiontest.activity;

import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;

import com.czhappy.permissiontest.utils.Constants;

/**
 * Description:
 * User: chenzheng
 * Date: 2016/12/14 0014
 * Time: 15:03
 */
public class BaseActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
    }

    public boolean hasPermission(String... permissions){

        for(String permission : permissions){

            if(ContextCompat.checkSelfPermission(this, permission)!= PackageManager.PERMISSION_GRANTED){
                return false;

            }
        }
        return true;
    }

    public void requestPermission(int code, String... permissions){

        ActivityCompat.requestPermissions(this, permissions, code);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch(requestCode){
            case Constants.WRITE_EXTERNAL_CODE:
                if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    doSdCardPermission();
                }else{
                    Toast.makeText(BaseActivity.this, "权限被拒绝了", Toast.LENGTH_LONG).show();
                }
                break;
            case Constants.CALL_PHONE_CODE:
                if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    doPhoneCall();
                }else{
                    Toast.makeText(BaseActivity.this, "权限被拒绝了", Toast.LENGTH_LONG).show();
                }
                break;
        }
    }

    /**
     * 默认的sdcard处理权限
     */
    public void doSdCardPermission(){

    }

    /**
     * 默认的打电话权限
     */
    public void doPhoneCall(){

    }


}
package com.czhappy.permissiontest.activity;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.czhappy.permissiontest.R;
import com.czhappy.permissiontest.utils.Constants;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.FileCallback;

import java.io.File;

import okhttp3.Call;
import okhttp3.Response;

public class MainActivity extends BaseActivity implements View.OnClickListener {

    private Button phonecall_btn, download_btn;

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

        initView();
    }

    private void initView() {
        phonecall_btn = (Button) this.findViewById(R.id.phonecall_btn);
        phonecall_btn.setOnClickListener(this);
        download_btn = (Button) this.findViewById(R.id.download_btn);
        download_btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.phonecall_btn://拨打电话
                goPhoneCall();
                break;
            case R.id.download_btn://文件下载
                sdCardPermission();
                break;
        }
    }

    private void sdCardPermission() {
        if (hasPermission(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE})) {
            doSdCardPermission();
        } else {
            requestPermission(Constants.WRITE_EXTERNAL_CODE, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE});
        }

    }

    @Override
    public void doSdCardPermission() {
        OkGo.get("http://avatar.csdn.net/E/F/1/1_chenzheng8975.jpg")
                .tag(this)
                .execute(new FileCallback(System.currentTimeMillis() + ".jpg") {
                    @Override
                    public void onSuccess(File file, Call call, Response response) {
                        Log.e("tag", file.getAbsolutePath());
                    }
                });

    }

    private void goPhoneCall() {
        if (hasPermission(new String[]{Manifest.permission.CALL_PHONE})) {
            doPhoneCall();
        } else {
            requestPermission(Constants.CALL_PHONE_CODE, new String[]{Manifest.permission.CALL_PHONE});
        }
    }

    @Override
    public void doPhoneCall() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        Uri data = Uri.parse("tel:" + "10086");
        intent.setData(data);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        this.startActivity(intent);
    }

}

二、使用开源库permissionGen实现
github地址:https://github.com/lovedise/PermissionGen

package com.czhappy.permissiontest.activity;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.czhappy.permissiontest.R;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.FileCallback;

import java.io.File;

import kr.co.namee.permissiongen.PermissionGen;
import kr.co.namee.permissiongen.PermissionSuccess;
import okhttp3.Call;
import okhttp3.Response;

public class MainActivity extends Activity implements View.OnClickListener {

    private Button phonecall_btn, download_btn;

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

        initView();
    }

    private void initView() {
        phonecall_btn = (Button) this.findViewById(R.id.phonecall_btn);
        phonecall_btn.setOnClickListener(this);
        download_btn = (Button) this.findViewById(R.id.download_btn);
        download_btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.phonecall_btn://拨打电话
                goPhoneCall();
                break;
            case R.id.download_btn://文件下载
                sdCardPermission();
                break;
        }
    }

    private void sdCardPermission() {
        PermissionGen.needPermission(this, 100,
                new String[] {
                        Manifest.permission.WRITE_EXTERNAL_STORAGE
                }
        );
    }

    @PermissionSuccess(requestCode = 200)
    public void doSdCardPermission() {
        OkGo.get("http://avatar.csdn.net/E/F/1/1_chenzheng8975.jpg")
                .tag(this)
                .execute(new FileCallback(System.currentTimeMillis() + ".jpg") {
                    @Override
                    public void onSuccess(File file, Call call, Response response) {
                        Log.e("tag", file.getAbsolutePath());
                    }
                });

    }

    private void goPhoneCall() {
        PermissionGen.needPermission(this, 100,
                new String[] {
                        Manifest.permission.CALL_PHONE
                }
        );
    }

    @PermissionSuccess(requestCode = 100)
    public void doPhoneCall() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        Uri data = Uri.parse("tel:" + "10086");
        intent.setData(data);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        this.startActivity(intent);
    }

    @Override public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                                     int[] grantResults) {
        PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
    }

}

三、基于BaseActivity运行时权限封装
PermissionListener.java

package com.czhappy.permissiontest.utils;

import java.util.List;

/**
 * Description:
 * User: chenzheng
 * Date: 2016/12/31 0031
 * Time: 14:53
 */
public interface PermissionListener {

    void onGranted();
    void onDenied(List<String> deniedPermission);
}

ActivityCollector.java

package com.czhappy.permissiontest.utils;

import android.app.Activity;

import java.util.ArrayList;
import java.util.List;

/**
 * Description:
 * User: chenzheng
 * Date: 2016/12/31 0031
 * Time: 15:14
 */
public class ActivityCollector {

    public static List<Activity> activityList = new ArrayList<>();

    public static void addActivity(Activity activity){
        activityList.add(activity);

    }

    public static void removeActivity(Activity activity){
        activityList.remove(activity);

    }

    public static Activity getTopActivity(){
        if(activityList.isEmpty()){
            return null;
        }else{
            //获取栈顶Activity
            return activityList.get(activityList.size()-1);
        }
    }
}

BasePermissionsActivity.java

package com.czhappy.permissiontest.activity;

import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;

import com.czhappy.permissiontest.utils.ActivityCollector;
import com.czhappy.permissiontest.utils.PermissionListener;

import java.util.ArrayList;
import java.util.List;

/**
 * Description:
 * User: chenzheng
 * Date: 2016/12/31 0031
 * Time: 14:41
 */
public class BasePermissionsActivity extends AppCompatActivity {

    private static PermissionListener mListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityCollector.addActivity(this);
    }

    public static void requestRuntimePermission(String[] permissions, PermissionListener listener) {
        Activity topActivity = ActivityCollector.getTopActivity();
        if(topActivity==null){
            return;
        }
        mListener = listener;
        List<String> permissionList = new ArrayList<String>();
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(topActivity, permission) != PackageManager.PERMISSION_GRANTED) {
                permissionList.add(permission);
            }

        }
        if (!permissionList.isEmpty()) {
            ActivityCompat.requestPermissions(topActivity, permissionList.toArray(new String[permissionList.size()]), 1);
        } else {
            mListener.onGranted();

        }

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0) {
                    List<String> deniedPermissions = new ArrayList<String>();
                    for (int i = 0; i < grantResults.length; i++) {
                        int grantResult = grantResults[i];
                        String permission = permissions[i];
                        if (grantResult != PackageManager.PERMISSION_GRANTED) {
                            deniedPermissions.add(permission);
                        }
                    }
                    if (deniedPermissions.isEmpty()) {
                        mListener.onGranted();
                    } else {
                        mListener.onDenied(deniedPermissions);
                    }

                }
                break;
            default:
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值