You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将权限请求代码封装为Permissions类并在Activity中调用?

权限封装实现方案

1. 封装独立的Permissions类

这个类负责权限检查、请求逻辑,通过回调接口通知调用方权限处理结果:

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;

import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class Permissions {
    private static final int REQUEST_CODE_FINE_LOCATION = 1234;
    private final Activity mActivity;
    private final PermissionCallback mCallback;

    // 权限回调接口,定义三种权限状态的回调方法
    public interface PermissionCallback {
        void onPermissionGranted();
        void onPermissionDenied();
        void onPermissionPermanentlyDenied();
    }

    public Permissions(Activity activity, PermissionCallback callback) {
        this.mActivity = activity;
        this.mCallback = callback;
    }

    // 检查定位权限是否已授予
    public boolean isFineLocationGranted() {
        return ContextCompat.checkSelfPermission(mActivity, android.Manifest.permission.ACCESS_FINE_LOCATION)
                == android.content.pm.PackageManager.PERMISSION_GRANTED;
    }

    // 发起定位权限请求
    public void requestFineLocationPermission() {
        if (!isFineLocationGranted()) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(mActivity, android.Manifest.permission.ACCESS_FINE_LOCATION)) {
                showPermissionRationaleDialog();
            } else {
                ActivityCompat.requestPermissions(mActivity,
                        new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                        REQUEST_CODE_FINE_LOCATION);
            }
        } else {
            mCallback.onPermissionGranted();
        }
    }

    // 处理权限请求结果,由Activity调用转发
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == REQUEST_CODE_FINE_LOCATION) {
            if (grantResults.length > 0 && grantResults[0] == android.content.pm.PackageManager.PERMISSION_GRANTED) {
                mCallback.onPermissionGranted();
            } else {
                if (!ActivityCompat.shouldShowRequestPermissionRationale(mActivity, android.Manifest.permission.ACCESS_FINE_LOCATION)) {
                    mCallback.onPermissionPermanentlyDenied();
                } else {
                    mCallback.onPermissionDenied();
                }
            }
        }
    }

    // 显示权限说明弹窗
    private void showPermissionRationaleDialog() {
        new AlertDialog.Builder(mActivity)
                .setMessage("我们需要定位权限来提供相关功能")
                .setCancelable(false)
                .setPositiveButton("确定", (dialog, which) ->
                        ActivityCompat.requestPermissions(mActivity,
                                new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                                REQUEST_CODE_FINE_LOCATION))
                .show();
    }

    // 跳转到应用设置页面
    public void gotoApplicationSettings() {
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", mActivity.getPackageName(), null);
        intent.setData(uri);
        mActivity.startActivity(intent);
    }
}

2. 修改MainActivity调用封装类

将原有的权限逻辑替换为调用Permissions类,同时在onRequestPermissionsResult中把结果转发给封装类处理:

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity implements Permissions.PermissionCallback {

    TextView textView;
    Button button;
    private Permissions mPermissions;

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

        textView = findViewById(R.id.textView);
        button = findViewById(R.id.button);

        // 初始化Permissions类,传入当前Activity和回调实现
        mPermissions = new Permissions(this, this);

        // 初始化时检查权限状态并更新UI
        updatePermissionStatus();
    }

    // 按钮点击触发权限请求
    public void requestPermission(View view) {
        mPermissions.requestFineLocationPermission();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // 将权限请求结果转发给Permissions类处理
        mPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    // 更新UI显示当前权限状态
    private void updatePermissionStatus() {
        if (mPermissions.isFineLocationGranted()) {
            textView.setText("权限已授予");
        } else {
            textView.setText("权限未授予");
        }
    }

    // 权限回调方法实现,处理不同状态的UI更新
    @Override
    public void onPermissionGranted() {
        textView.setText("权限已授予");
    }

    @Override
    public void onPermissionDenied() {
        textView.setText("权限未授予");
    }

    @Override
    public void onPermissionPermanentlyDenied() {
        new AlertDialog.Builder(this)
                .setMessage("您已永久拒绝该权限,请前往设置开启")
                .setPositiveButton("去设置", (dialog, which) -> mPermissions.gotoApplicationSettings())
                .setNegativeButton("取消", null)
                .setCancelable(false)
                .show();
    }
}

核心说明

  • onRequestPermissionsResult是Activity的生命周期方法,无法在独立类中重写,必须在Activity/Fragment中实现后,将结果转发给封装类处理。
  • 通过定义PermissionCallback接口,实现封装类与Activity的解耦,Activity只需专注于UI更新,权限逻辑全部交由Permissions类处理。

内容的提问来源于stack exchange,提问作者java296642

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 02:03:12