我有一个在片段中调用的函数,该函数打开一个 AlertDialog 并要求拍照或从手机拍照 。 在调用两个单独的函数presentFiles() 或presentCamera() 之前,我使用requestPermissions 检查权限。
一切正常,但我将 sdk 版本升级到 34,除了 requestPermissions 已过时(但之前也是如此),询问用户拍照或从手机访问文件的权限的窗口不再打开。
你能帮我解决这个问题吗
下面我将粘贴我的整个函数。
谢谢你
fun displayPicker() {
val builder = AlertDialog.Builder(this.activity)
builder.setTitle(getString(R.string.label_add_file))
builder.setTitle("")
.setItems(
arrayOf("Choisir un fichier", "Prendre une photo")
) { _, which ->
if (which == 0) {
if (requireContext().checkSelfPermission(READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(
arrayOf(READ_EXTERNAL_STORAGE),
REQUEST_PERMISSION_FILES
)
} else {
presentFiles()
}
} else if (which == 1) {
if (requireContext().checkSelfPermission(WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(
arrayOf(WRITE_EXTERNAL_STORAGE),
REQUEST_PERMISSION_CAMERA
)
} else {
presentCamera()
}
}
}
builder.setNegativeButton(R.string.btn_cancel) { _, _ ->
}
builder.show()
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
if (requestCode == REQUEST_PERMISSION_CAMERA && permissions.contains(WRITE_EXTERNAL_STORAGE) && grantResults.first() == PackageManager.PERMISSION_GRANTED) {
presentCamera()
} else if (requestCode == REQUEST_PERMISSION_FILES && permissions.contains(
READ_EXTERNAL_STORAGE
) && grantResults.first() == PackageManager.PERMISSION_GRANTED
) {
presentFiles()
}
}
Android 13 之后不再使用 WRITE_EXTERNAL_STORAGE 和 READ_EXTERNAL_STORAGE,请使用新权限 READ_MEDIA_IMAGES 更新您的权限数组,并在清单中添加相同的内容。
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
@RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
String[] permissionNew = new String[]{ Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.CAMERA};
private boolean checkPermissions() {
int result;
List<String> listPermissionsNeeded = new ArrayList<>();
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
for (String p : permissionNew) {
result = ContextCompat.checkSelfPermission(requireActivity(), p);
if (result != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(p);
}
}
}
if (!listPermissionsNeeded.isEmpty()) {
requestPermissions(listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), 200);
return false;
}
return true;
}
如果您必须写入文件,请确保您使用的是应用程序的文件目录。