近期有开发者在使用 Android 12(API level 31)及以上版本时,使用 Android Paho MQTT 客户端时出现了奔溃现象。导致奔溃的原因是 Android 12 强制使用了 FLAG_IMMUTABLE 和 FLAG_MUTABLE 标记,以确保应用程序无法修改只读文件。解决方法是在使用时明确设置 FLAG_IMMUTABLE 或 FLAG_MUTABLE 标记。可以参考下面的代码示例:
Kotlin 示例:
// 使用 FLAG_IMMUTABLE 标记
val fileUri = ... // 获得文件 Uri
val intent = Intent(Intent.ACTION_VIEW).apply {
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_ACTIVITY_FLAG_IMMUTABLE)
setDataAndType(fileUri, "application/pdf")
}
// 使用 FLAG_MUTABLE 标记
val contentUri = ... // 获得内容 Uri
context.contentResolver.takePersistableUriPermission(
contentUri,
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
Java 示例:
// 使用 FLAG_IMMUTABLE 标记
Uri fileUri = ...; // 获得文件 Uri
Intent intent = new Intent(Intent.ACTION_VIEW)
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_FLAG_IMMUTABLE)
.setDataAndType(fileUri, "application/pdf");
// 使用 FLAG_MUTABLE 标记
Uri contentUri = ...; // 获得内容 Uri
context.getContentResolver().takePersistableUriPermission(
contentUri,
Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
);