如何将相册图片保存到 Android 应用的 SD 卡中

在 Android 开发中,有时需要将相册中的图片保存到应用的内存(如 SD 卡)中。对于初学者来说,这个过程可能显得复杂,但只要按照以下步骤进行,就能成功实现。本文将详细讲解整个流程和每一步需要的代码。

整体流程

为了简化理解,下面是整个操作的流程:

步骤 说明
1 请求存储权限
2 选择相册中的图片
3 保存选中的图片到应用的 SD 卡中

流程图

使用 mermaid 语法,我们可以将上述步骤可视化为流程图:

flowchart TD
    A[请求存储权限] --> B[选择相册中的图片]
    B --> C[保存选中的图片到应用的 SD 卡中]

每一步的详细说明

第一步:请求存储权限

Android 6.0 及以上版本需要动态请求权限。在 AndroidManifest.xml 中声明所需权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

然后在代码中请求权限,下面是 Kotlin 示例:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
    != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this,
        arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 
        REQUEST_CODE)
}
  • 这段代码检查应用是否有写入外部存储的权限,如果没有,则请求权限。

第二步:选择相册中的图片

为了选择图片,我们可以使用 Intent 打开相册。代码示例如下:

val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
startActivityForResult(intent, PICK_IMAGE_REQUEST)
  • 上述代码会启动一个选择图片的界面,PICK_IMAGE_REQUEST 可以是你定义的常量,用于识别该操作。

接下来,我们需要重写 onActivityResult 方法来获取用户选择的图片:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == PICK_IMAGE_REQUEST && resultCode == Activity.RESULT_OK && data != null) {
        val selectedImageUri: Uri? = data.data
        saveImageToSdCard(selectedImageUri)
    }
}

第三步:保存选中的图片到应用的 SD 卡中

最后一步是将选择的图片保存到 SD 卡。你可以使用如下代码:

fun saveImageToSdCard(imageUri: Uri?) {
    val inputStream = contentResolver.openInputStream(imageUri!!)
    val bitmap = BitmapFactory.decodeStream(inputStream)
    
    val sdCard = Environment.getExternalStorageDirectory()
    val dir = File(sdCard.absolutePath + "/YourAppFolder")
    if (!dir.exists()) {
        dir.mkdirs()  // 创建目录
    }
    
    val file = File(dir, "image_${System.currentTimeMillis()}.png")
    val outputStream = FileOutputStream(file)
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
    outputStream.flush()
    outputStream.close()
}
  • contentResolver.openInputStream(imageUri) 用于获取图片的输入流。
  • 然后我们解码输入流为 Bitmap 对象。
  • 最后,创建目录并保存图片。

结尾

通过上述步骤,你已经学习了如何将相册中的图片保存到 Android 应用的 SD 卡中。这个过程涉及到请求权限、选择图片和文件操作等方面的知识。希望你在实际开发中能够灵活运用这些技能,逐步提升自己的 Android 开发能力。如果你有任何疑问或需要进一步的帮助,请随时寻找资源或与其他开发者交流。祝你编程愉快!