将图像保存到Gallery从图像视图



我正试图从图像视图中将图像保存到Gallery,但收到未找到文件异常错误

我尝试过的代码出现"找不到文件"异常。

对不起,如果你不懂我的英语。

save.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
BitmapDrawable draw = (BitmapDrawable) mainImage.getDrawable();
Bitmap bitmap = draw.getBitmap();
try{
FileOutputStream outStream = null;
File sdCard = Environment.getExternalStorageDirectory();
File dir = new File(sdCard.getAbsolutePath() + "/MyFolder");
dir.mkdirs();
String fileName = String.format("%d.jpg", System.currentTimeMillis());
File outFile = new File(dir, fileName);
outStream = new FileOutputStream(outFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
outStream.flush();
outStream.close();
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(outFile));
sendBroadcast(intent);
}
catch (Exception e){
e.printStackTrace();
Toast.makeText(MainActivity.this,e.toString(),Toast.LENGTH_SHORT).show();
}

}
});

我是个初学者,所以我不知道如何解决这个问题。请帮帮我

所以让我们从头开始

步骤1:在清单中添加读写权限

步骤2:制作ImageView中的图像位图

步骤3:现在有一种不同的机制可以在以下和以上的Android版本Q 中保存文件

在以下Q中:

private File saveBitmapBelowQ(Bitmap bitmap, String name) {
File imageRoot = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM), appDirectoryName);
if (!imageRoot.exists()) {
imageRoot.mkdirs();
}
File image = new File(imageRoot, name + ".png");
try {
if (image.createNewFile()) {
try (FileOutputStream fos = new FileOutputStream(image)) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG,
100, bos);
byte[] bitmapdata = bos.toByteArray();
fos.write(bitmapdata);
fos.flush();
imagePath = image.getPath();
}
return image;
}
} catch (Exception e) {
e.printStackTrace();
}
return  null;
}

其中,AppDirectory是所需目录的名称,该名称是首选使用实时日期和时间的映像的名称。在这种方法中,

  1. 首先,在外部存储中创建目录
  2. 然后创建图像文件(尽量使其唯一(
  3. 最后一步是将位图转换为字节数组并写入在中创建的文件上(第2点(

在Android Q及以上版本中:

@RequiresApi(api = Build.VERSION_CODES.Q)
public File saveBitmapAboveQ(Bitmap bitmap, Context context, String directoryName, String name) {
OutputStream fos;
ContentResolver resolver = context.getContentResolver();
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name);
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png");
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/" + directoryName);
Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
try {
fos = resolver.openOutputStream(imageUri);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
imagePath = new File(getPath(imageUri)).getAbsolutePath();
return new File(getPath(imageUri));
} catch (Exception e) {
return null;
}
}

创建一个内容解析程序并设置内容值,如文件名、类型和位置,然后将内容值传递给内容解析程序,并将内容解析程序传递给FileOutputStream/OutputStream现在在输出流上写入位图

快乐编码

Kotlin方式:您可以使用此扩展功能将文件保存在存储中

fun Bitmap.saveAsFile(isPng: Boolean = false): File? {
val root = Environment.getExternalStorageDirectory()
val myDir = File("${root}/pic")
myDir.mkdirs()
if (myDir.exists()) {
val random = (Math.random() * (1024 - 1)).toLong()
val prefix = "IMG${random}_${System.currentTimeMillis()}"
val fileName = if (isPng) "$prefix.png" else "$prefix.jpg"
val file = File(myDir, fileName)
if (file.exists()) file.delete()
return try {
val out = FileOutputStream(file)
if (isPng) {
this.setHasAlpha(true)
this.compress(Bitmap.CompressFormat.PNG, 100, out)
} else {
this.compress(Bitmap.CompressFormat.JPEG, 100, out)
}
out.flush()
out.close()
file
} catch (e: Exception) {
e.printStackTrace()
null
}
}
return null
}

示例用法:

val imageFile = view.drawToBitmap().saveAsFile()

Java方式:

public static File saveAsFile(Bitmap bitmap) {
File root = Environment.getExternalStorageDirectory();
File myDir = new File(root + "/pic");
if (myDir.mkdir()) {
long random = (long) (Math.random() * (1024 - 1));
String prefix = ("IMG" + random + "_" + System.currentTimeMillis());
String fileName = prefix + ".jpg";
File file = new File(myDir, fileName);
if (file.exists()) file.delete();
try {
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
return file;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
return null;
}
public static Bitmap drawToBitmap(View view) {
if (!ViewCompat.isLaidOut(view)) {
throw new IllegalStateException("View needs to be laid out before calling drawToBitmap()");
}
Bitmap bit = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bit);
canvas.translate(-view.getScrollX(), -view.getScrollY());
view.draw(canvas);
return bit;
}

示例用法:

Bitmap bitmap = drawToBitmap(yourView);
File savedFile = saveAsFile(bitmap);

最新更新