美文网首页
Android6.0动态权限封装

Android6.0动态权限封装

作者: 方_f666 | 来源:发表于2019-11-20 13:23 被阅读0次

一个高扩展性,移植性的Android6.0动态权限封装。

首先在BaseActivity或BaseFragment进行封装:

package com.example.android6;

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

public class BaseActivity extends AppCompatActivity {
    //判断是否拥有对应的权限
    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 requestCode, String... permissions) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(permissions, requestCode);
        }
    }

    public static final int EXTERNAL_STORATE_PERIMISSION = 0x01;//读写SD卡权限
    public static final int CAMERA_PERMISSION = 0x02;//camera权限

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case EXTERNAL_STORATE_PERIMISSION:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    doSDCard();
                }
                break;
            case CAMERA_PERMISSION:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    doCamera();
                }
                break;

        }
    }

    //读写SD卡业务逻辑,由具体的子类实现
    public void doSDCard() {
    }

    //使用相机业务逻辑,由具体的子类实现
    public void doCamera() {
    }

}

其次在AndroidManifest中申请对应权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />

最后在实际要用到的Activity和Fragment中调用:

package com.example.android6;

import android.Manifest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;

public class MainActivity extends BaseActivity {

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

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.tv_external_storage_permission:
               if (hasPermission(Manifest.permission.CAMERA)) {
                    //拥有此权限,那么直接执行业务逻辑
                    doSDCard();
                } else{
                    //还没有对应权限
                    requestPermission(BaseActivity.EXTERNAL_STORATE_PERIMISSION, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}); 
                }
                break;
            case R.id.tv_camera_permission:
                if (hasPermission(Manifest.permission.CAMERA)) {
                    //拥有此权限,那么直接执行业务逻辑
                    doCamera();
                } else {
                    //还没有对应权限
                    requestPermission(BaseActivity.CAMERA_PERMISSION, new String[]{Manifest.permission.CAMERA}); 
                break;
        }
    }

    @Override
    public void doSDCard() {
        super.doSDCard();
        //业务逻辑
    }

    @Override
    public void doCamera() {
        super.doCamera();
        //业务逻辑
    }
}

附上xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_external_storage_permission"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="读写权限"
        android:padding="20dp"
        android:background="#ccc"
        android:onClick="onClick"
         />
    <TextView
        android:id="@+id/tv_camera_permission"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="相机权限"
        android:padding="20dp"
        android:layout_marginTop="30dp"
        android:background="#ccc"
        android:onClick="onClick"
        />
</LinearLayout>

相关文章

网友评论

      本文标题:Android6.0动态权限封装

      本文链接:https://www.haomeiwen.com/subject/pzloictx.html