近期有开发者在使用 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 );