Android Studio存储Bitmap到系统相册中

用Android Studio做GS1-128条码识别器的时候需要开摄像头捕获条码进行识别,为了查看捕获到的图片,用了保存到手机系统相册的方法。在网上搜了一些方法,中间遇到了bug,总结一下:

首先,要在 AndroidManifest.xml文件中声明权限。

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

本来是采用以下方法获取系统相册目录,但是出了bug:java.io.FileNotFoundException: /storage/emulated/0/Boohee/1589899902154.jpg: open failed: ENOENT (No such file or directory)

File appDir = new File(Environment.getExternalStorageDirectory(), "BarcodeBitmap");

后来搜了这个bug,在一篇文章里发现了这样会出问题,得用以下方法

File appDir = new File(context.getExternalFilesDir(null).getPath()+ "BarcodeBitmap");

修改后果然问题解决了

实现存储Bitmap到系统相册中的函数如下:

public void saveImageToGallery(Context context, Bitmap bmp) {
    //检查有没有存储权限
    if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
        Toast.makeText(this, "请至权限中心打开应用权限", Toast.LENGTH_SHORT).show();
    } else {
        // 新建目录appDir,并把图片存到其下
        File appDir = new File(context.getExternalFilesDir(null).getPath()+ "BarcodeBitmap");
        if (!appDir.exists()) {
            appDir.mkdir();
        }
        String fileName = System.currentTimeMillis() + ".jpg";
        File file = new File(appDir, fileName);
        try {
            FileOutputStream fos = new FileOutputStream(file);
            bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.flush();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 把file里面的图片插入到系统相册中
        try {
            MediaStore.Images.Media.insertImage(context.getContentResolver(),
                    file.getAbsolutePath(), fileName, null);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        Toast.makeText(this, fileName, Toast.LENGTH_LONG);

        // 通知相册更新
        context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值