仅供参考(版本不同而有差异)
1.权限-相机

1-1 Manifest 必须声明
<uses-permission android:name="android.permission.CAMERA" />
没声明就直接申请,系统会立即拒绝,连弹框都不会弹。
2.2 应用
private void myPermissions_Camera(){
//摄像头权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
Log.e("TEST","相机权限:已授权");
} else {
Log.e("TEST","相机权限:没有授权");
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA}, 1); //跳出对话框询问
}
}
2.权限-外部存储

2-1Manifest 声明(推荐写法)
<!-- Android 9 及以下需要 WRITE -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
<!-- Android 12 及以下读公共文件需要 READ -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<!-- Android 13+ 读媒体(按需声明) -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
maxSdkVersion让旧权限只在需要的版本生效,避免新系统上多申请。
java
public void myPermission_ExternalStorage(){
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
Log.e("TAG", "myRequestPermission: 申请权限中。。。。。");
}
else{Log.e("TAG", "myRequestPermission: 您已经申请了权限"); }
}
3.权限-同时多个(外部存储 摄像头)

调用处: myPermissions_CameraAndStorage();
把你原来的两个方法合并成一个 ,一次 requestPermissions 同时申请相机 + 存储,系统只弹一个框
java
private static final int REQ_CAMERA_STORAGE = 100;
private void myPermissions_CameraAndStorage() {
// 1. 收集所有未授权的权限
List<String> need = new ArrayList<>();
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
need.add(Manifest.permission.CAMERA);
}
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
need.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
// 2. 都已授权 → 直接干活
if (need.isEmpty()) {
Log.e("TEST", "相机 + 存储 权限都已授权");
doWork();
return;
}
// 3. 一次申请所有未授权的权限
Log.e("TEST", "申请权限中:" + need);
ActivityCompat.requestPermissions(this,
need.toArray(new String[0]),
REQ_CAMERA_STORAGE);
}
2-2必须配套的回调
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQ_CAMERA_STORAGE) {
boolean allGranted = grantResults.length > 0;
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
Log.e("TEST", "已授权:" + permissions[i]);
} else {
allGranted = false;
Log.e("TEST", "被拒绝:" + permissions[i]);
}
}
if (allGranted) {
Log.e("TEST", "全部授权,执行操作");
doWork();
} else {
Log.e("TEST", "部分权限被拒绝");
Toast.makeText(this, "需要相机和存储权限", Toast.LENGTH_SHORT).show();
}
}
}
持续更新