安卓 11 文件储存

一. 安卓 10 储存特性

Android 10 所带来的关于存储上的变更遵循了以下三个基本原则

  • 更好的从属性: 系统知道哪些文件属于哪些应用,这可以让用户更方便地管理他们的文件。当应用被卸载后,除非用户需要,否则应用之前所创建的文件也不应该保留在设备上;
  • 保护应用数据: 当一个应用将它所属的文件写入外部存储时,这些文件是不应该被其他应用所访问的;
  • 保护用户数据: 当用户下载了一些文件,比如带有敏感信息的邮件附件,这些文件应该对其他应用不可见

二.强制执行分区储存

在 Android 11 上运行但以 Android 10(API 级别 29)为目标平台的应用仍可请求 requestLegacyExternalStorage 属性。应用可以利用此标记暂时停用与分区存储相关的变更,例如授予对不同目录和不同类型的媒体文件的访问权限。当您将应用更新为以 Android 11 为目标平台后,系统会忽略 requestLegacyExternalStorage 标记。

以下是我保存文件的方法:

//保存文件
private fun saveImageToExternalStorage(bytes: ByteArray) {
    val root =
        Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
            .toString()
    val myDir = File("$root/saved_images")
    myDir.mkdirs()
    val generator = Random()
    var n = 10000
    n = generator.nextInt(n)
    val fname = "个人报告.pdf"
    val file = File(myDir, fname)
    if (file.exists()) file.delete()
    try {
        val out = FileOutputStream(file) //指定写到哪个路径中
        val fileChannel: FileChannel = out.channel
        fileChannel.write(ByteBuffer.wrap(bytes)) //将字节流写入文件中
        fileChannel.force(true) //强制刷新
        fileChannel.close()
    } catch (e: Exception) {
        e.printStackTrace()
    }

    // Tell the media scanner about the new file so that it is

    // immediately available to the user.
    MediaScannerConnection.scanFile(
        this, arrayOf(file.toString()), null
    ) { path, uri ->
        Log.i("ExternalStorage", "Scanned $path")
        Log.i("ExternalStorage", "-> uri=$uri")
        shareSingleImage(uri)
    }
}

//分享文件 
private fun shareSingleImage(imageUri: Uri) {
    val shareIntent = Intent()
    shareIntent.action = Intent.ACTION_SEND
    shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri)
    shareIntent.type = ("*/*")
    startActivity(Intent.createChooser(shareIntent, "分享到:"))
}

你可能感兴趣的:(android,java,apache)