Android Permission 权限 工具类

2020-11-09  本文已影响0人  不会看源码

【导读】
为了方便Android 6.0的权限申请,记录两个工具类的使用。一是通过单独的activity去申请,一是通过BaseActivity去申请。

【步骤】

    <!--AndroidManifest.xml 申请需要的权限-->
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.READ_CALL_LOG"/>
    <uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
    <uses-permission android:name="android.permission.USE_SIP"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.BODY_SENSORS"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
//布局代码

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="horizontal"
        android:padding="8dp">

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/bt_request"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#FF9800"
            android:paddingStart="8dp"
            android:paddingEnd="8dp"
            android:text="申请权限"
            android:textColor="#ffffff"
            android:textSize="12sp" />

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/bt_quit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:background="#F44336"
            android:text="退出"
            android:textColor="#ffffff"
            android:textSize="12sp" />

    </LinearLayout>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fillViewport="true"
        android:overScrollMode="never">

        <LinearLayout
            android:id="@+id/ll_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" />
    </ScrollView>

</LinearLayout>
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import com.technology.myapplication.R;
import com.technology.myapplication.utils.LogUtils;
import java.util.ArrayList;
import java.util.List;


public class PermissionActivity extends AppCompatActivity {

    private final String TAG = "PermissionActivity";
    /**
     * 1. 摄像头: android.permission-group.CAMERA
     * android.permission.CAMERA
     * <p>
     * 2.定位:android.permission-group.LOCATION
     * android.permission.ACCESS_FINE_LOCATION
     * android.permission.ACCESS_COARSE_LOCATION
     * <p>
     * 3.麦克风:android.permission-group.MICROPHONE
     * android.permission.RECORD_AUDIO
     * <p>
     * 4.设备相关信息:android.permission-group.PHONE
     * android.permission.READ_PHONE_STATE
     * android.permission.CALL_PHONE
     * android.permission.READ_CALL_LOG
     * android.permission.WRITE_CALL_LOG
     * com.android.voicemail.permission.ADD_VOICEMAIL
     * android.permission.USE_SIP
     * android.permission.PROCESS_OUTGOING_CALLS
     * <p>
     * 5.存储空间:android.permission-group.STORAGE
     * android.permission.READ_EXTERNAL_STORAGE
     * android.permission.WRITE_EXTERNAL_STORAGE
     * <p>
     * 6.传感器: group:android.permission-group.SENSORS
     * permission:android.permission.BODY_SENSORS
     */
    private final String[] mStrings = {
            Manifest.permission.CAMERA,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.RECORD_AUDIO,
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.CALL_PHONE,
            Manifest.permission.READ_CALL_LOG,
            Manifest.permission.WRITE_CALL_LOG,
//            Manifest.permission.ADD_VOICEMAIL,
            Manifest.permission.USE_SIP,
//            Manifest.permission.PROCESS_OUTGOING_CALLS,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.BODY_SENSORS,
            Manifest.permission.CHANGE_WIFI_STATE
//            Manifest.permission.WRITE_SETTINGS
    };


    private LinearLayout mLinearLayout;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_permission);
        mLinearLayout = findViewById(R.id.ll_layout);

        findViewById(R.id.bt_quit).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        findViewById(R.id.bt_request).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startSystem();
            }
        });


        check();
    }


    private void check() {
        List<String> data = new ArrayList<>();
        for (String permission : mStrings) {
            if (ActivityCompat.checkSelfPermission(PermissionActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {
                //没有权限,申请权限
                data.add(permission);

            } else {
                addView(permission, "已经申请过了");
            }
        }

        String[] strings = new String[data.size()];
        data.toArray(strings);
        LogUtils.e(TAG, "需要申请的权限 = " + strings.length);

        //申请权限,其中RC_PERMISSION是权限申请码,用来标志权限申请的
        if (!data.isEmpty()) {
            ActivityCompat.requestPermissions(PermissionActivity.this, strings, 101);
        } else {
            start();
        }
    }

    private void start() {
        LogUtils.e(TAG, "--申请权限完成,调整界面--");
    }

    private void addView(String permission, String title) {
        TextView textView = new TextView(this);
        textView.setPadding(20, 20, 0, 0);
        String s = "失败";
        if (!title.contains(s)) {
            textView.setTextColor(Color.BLACK);
        } else {
            textView.setTextColor(Color.RED);
        }
        textView.setTextSize(16);
        textView.setText(permission + ":" + title);
        mLinearLayout.addView(textView);
    }

    private void startSystem() {
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", this.getPackageName(), null);
        intent.setData(uri);
        startActivity(intent);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        int code = 101;
        if (requestCode == code) {
            int length = permissions.length;
            int start = 0;
            for (int i = 0; i < length; i++) {
                String permission = permissions[i];
                if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                    //成功
                    LogUtils.e(TAG, "权限申请成功 = " + permission);
                    addView(permission, "权限申请成功");
                    start ++;

                } else {
                    //不成功
                    LogUtils.e(TAG, "权限申请失败 = " + permission);
                    addView(permission, "权限申请失败");
                }
            }

            if (start == length){
                start();
            }
        }
    }

}





【Base封装】
清单文件权限的申请,参考上面
布局代码,参考上面

import android.content.pm.PackageManager;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;

public class BasePermissionActivity extends AppCompatActivity {
    public int requestCode = 101;

    public void showToast(String toast) {
        Toast.makeText(this, toast, Toast.LENGTH_LONG).show();
    }


    /**
     * 权限检查
     *
     * @param neededPermissions 需要的权限
     * @return 是否全部被允许
     */
    public boolean checkPermissions(String[] neededPermissions) {
        if (neededPermissions == null) {
            return true;
        }
        boolean allGranted = true;
        for (String permission : neededPermissions) {
            boolean p = ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED;
            allGranted &= p;
        }
        return allGranted;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (this.requestCode == requestCode) {
            boolean isAllGranted = true;
            for (int grantResult : grantResults) {
                isAllGranted &= (grantResult == PackageManager.PERMISSION_GRANTED);
            }

            if (isAllGranted) {
                permissionsResult();
            } else {
                showToast("权限被拒绝");
            }
        }
    }

    public void permissionsResult() {

    }
}
import android.Manifest;
import android.os.Bundle;
import com.technology.myapplication.utils.LogUtils;


public class PermissionItemActivity extends BasePermissionActivity {
    private final String TAG = "PermissionItemActivity";

    private final String[] mStrings = {
            Manifest.permission.CAMERA,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.RECORD_AUDIO,
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.CALL_PHONE,
            Manifest.permission.READ_CALL_LOG,
            Manifest.permission.WRITE_CALL_LOG,
            Manifest.permission.USE_SIP,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.BODY_SENSORS,
            Manifest.permission.CHANGE_WIFI_STATE
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        boolean p = checkPermissions(mStrings);
        if (p) {
            start();
        } else {
            requestPermissions(mStrings, requestCode);
        }
    }

    @Override
    public void permissionsResult() {
        start();
    }

    private void start() {
        LogUtils.e(TAG, "--申请权限完成,调整界面--");
    }
}



【Kotlin】
清单文件权限的申请,参考上面
布局代码,参考上面

import android.annotation.SuppressLint
import android.content.pm.PackageManager
import android.widget.Toast
import androidx.annotation.Nullable
import androidx.core.content.ContextCompat
import androidx.fragment.app.FragmentActivity

@SuppressLint("Registered")
abstract class BasePermissionActivity : FragmentActivity() {
    protected val requestCode: Int = 101

    fun showToast(@Nullable resId: Int) {
        showToast(getString(resId))
    }

    fun showToast(toast: String) {
        Toast.makeText(this, toast, Toast.LENGTH_LONG).show()
    }

    /**
     * 权限检查
     *
     * @param neededPermissions 需要的权限
     * @return 是否全部被允许
     */
    fun checkPermissions(neededPermissions: Array<String>): Boolean {
        if (neededPermissions.isEmpty()) {
            return true
        }
        var allGranted = true
        for (neededPermission in neededPermissions) {
            val n = ContextCompat.checkSelfPermission(
                this,
                neededPermission
            ) == PackageManager.PERMISSION_GRANTED
            allGranted = allGranted and n
        }
        return allGranted
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        var isAllGranted = true
        for (grantResult in grantResults) {
            isAllGranted = isAllGranted and (grantResult == PackageManager.PERMISSION_GRANTED)
        }
        if (this.requestCode == requestCode) {
            if (isAllGranted) {
                permissionsResult()
            } else {
                showToast("权限被拒绝")
            }
        }
    }

    open fun permissionsResult() {
    }

    companion object {
        private const val TAG = "BasePermissionActivity"
    }
}
上一篇 下一篇

猜你喜欢

热点阅读