Android权限管理类开发:调用权限检查时应用崩溃求助
Android统一权限管理类崩溃排查与修复方案
常见崩溃原因
- 传递的Activity/Context实例为null,触发空指针异常
- 误用Application Context调用
requestPermissions(该方法仅支持Activity实例) - 未在Manifest中声明目标权限
- 权限检查API使用错误(比如直接调用过时的
checkPermission而非ContextCompat.checkSelfPermission)
正确的Permissions类实现
import android.app.Activity; import android.content.pm.PackageManager; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import android.Manifest; public class Permissions { // 检查通讯录读取权限是否已授予 public static boolean hasReadContactsPermission(Activity activity) { if (activity == null) { throw new IllegalArgumentException("Activity实例不能为空"); } return ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED; } // 请求通讯录读取权限 public static void requestReadContactsPermission(Activity activity, int requestCode) { if (activity == null) { throw new IllegalArgumentException("Activity实例不能为空"); } ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_CONTACTS}, requestCode); } }
MainActivity正确调用方式
import android.os.Bundle; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private static final int REQUEST_CODE_READ_CONTACTS = 1001; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 权限检查与请求流程 if (!Permissions.hasReadContactsPermission(this)) { Permissions.requestReadContactsPermission(this, REQUEST_CODE_READ_CONTACTS); } else { // 权限已授予,执行通讯录操作 handleContactsAccess(); } } // 处理权限请求结果 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CODE_READ_CONTACTS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { handleContactsAccess(); } else { Toast.makeText(this, "缺少通讯录权限,无法继续操作", Toast.LENGTH_SHORT).show(); } } } // 模拟通讯录操作 private void handleContactsAccess() { // 此处编写读取通讯录的业务逻辑 } }
必做配置与注意事项
- 在
AndroidManifest.xml中声明权限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
- 确保调用权限方法时,Activity实例处于有效状态(避免在
onDestroy之后调用) - 动态权限仅针对Android 6.0(API 23)及以上版本,低版本系统无需动态申请
- 禁止使用Application Context调用
requestPermissions,该方法依赖Activity的生命周期回调
内容的提问来源于stack exchange,提问作者N MZ
相关产品推荐
相关产品推荐

