美文网首页
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