用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)));
}
}