如何将权限请求代码封装为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
相关产品推荐
相关产品推荐

