Android 9.0 保存图片到相册

在Android 9.0及以上版本中,保存图片到相册是一项常见的需求。本篇文章将介绍如何使用Android 9.0的API来实现保存图片到相册的功能,并提供代码示例。

保存图片到相册的步骤

保存图片到相册的主要步骤如下:

  1. 检查权限:在Android 9.0及以上版本中,保存图片到相册需要WRITE_EXTERNAL_STORAGE权限。
  2. 创建保存路径:在保存图片之前,需要先创建保存路径。
  3. 保存图片:使用FileOutputStream将图片保存到指定路径。
  4. 刷新相册:为了让相册能够及时地显示新保存的图片,需要发送广播通知相册刷新。

下面我们来逐步实现这些步骤。

检查权限

在AndroidManifest.xml文件中添加以下权限声明:

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

然后在代码中检查权限:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    // 权限未被授予,需要请求权限
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
            REQUEST_CODE_WRITE_EXTERNAL_STORAGE);
} else {
    // 权限已被授予,可以进行保存操作
    saveImageToGallery();
}

当权限未被授予时,我们需要请求权限。在请求权限的回调方法中,我们可以根据用户的选择来进行保存操作。

创建保存路径

在保存图片之前,我们需要先创建保存路径。这里我们将保存路径设置为"sdcard/DCIM/Camera"目录下的一个新文件。

File storageDir = new File(Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_DCIM), "Camera");

// 创建保存路径
if (!storageDir.exists()) {
    storageDir.mkdir();
}

// 创建新的文件
File imageFile = new File(storageDir, "image.jpg");

保存图片

使用FileOutputStream将图片保存到指定路径:

try {
    FileOutputStream outputStream = new FileOutputStream(imageFile);
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
    outputStream.flush();
    outputStream.close();
    Toast.makeText(this, "图片保存成功", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
    e.printStackTrace();
    Toast.makeText(this, "图片保存失败", Toast.LENGTH_SHORT).show();
}

刷新相册

为了让相册能够及时地显示新保存的图片,需要发送广播通知相册刷新。

MediaScannerConnection.scanFile(this,
        new String[]{imageFile.getAbsolutePath()},
        new String[]{"image/jpeg"},
        new MediaScannerConnection.OnScanCompletedListener() {
    @Override
    public void onScanCompleted(String path, Uri uri) {
        // 相册刷新完成后的回调
    }
});

完整代码示例

下面是一个完整的代码示例:

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_CODE_WRITE_EXTERNAL_STORAGE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 检查权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            // 权限未被授予,需要请求权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    REQUEST_CODE_WRITE_EXTERNAL_STORAGE);
        } else {
            // 权限已被授予,可以进行保存操作
            saveImageToGallery();
        }
    }

    private void saveImageToGallery() {
        Bitmap bitmap = /* 从某个地方获取Bitmap */;

        File storageDir = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DCIM), "Camera");

        // 创建保存路径
        if (!storageDir.exists()) {
            storageDir.mkdir();
        }

        // 创建新的文件
        File imageFile = new File(storageDir, "image.jpg");

        try {
            FileOutputStream outputStream = new FileOutputStream(imageFile);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
            outputStream.flush();
            outputStream.close();
            Toast.makeText(this, "图片保存成功", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(this, "图片保存失败", Toast.LENGTH_SHORT).show();
        }

        // 刷新相册
        MediaScannerConnection.scanFile(this,
                new String[]{imageFile.getAbsolutePath()},
                new String[]{"image/jpeg"},
                new MediaScannerConnection.OnScanCompletedListener() {
            @Override
            public void onScanCompleted(String path, Uri