如何将图像保存在android画廊中
Posted
技术标签:
【中文标题】如何将图像保存在android画廊中【英文标题】:How to save image in android gallery 【发布时间】:2014-01-18 12:31:26 【问题描述】:我尝试将图像保存到 WathsappIMG,但是当我转到图像库 android 时,我看不到图像,并且可以从 ES 文件资源管理器中看到目录中的图像
OutputStream output;
// Find the SD Card path
File filepath = Environment.getExternalStorageDirectory();
// Create a new folder in SD Card
File dir = new File(filepath.getAbsolutePath()
+ "/WhatSappIMG/");
dir.mkdirs();
// Retrieve the image from the res folder
BitmapDrawable drawable = (BitmapDrawable) principal.getDrawable();
Bitmap bitmap1 = drawable.getBitmap();
// Create a name for the saved image
File file = new File(dir, "Wallpaper.jpg" );
try
output = new FileOutputStream(file);
// Compress into png format image from 0% - 100%
bitmap1.compress(Bitmap.CompressFormat.JPEG, 100, output);
output.flush();
output.close();
catch (Exception e)
// TODO Auto-generated catch block
e.printStackTrace();
【问题讨论】:
文件夹是否有一个名为“.nomedia”的文件?检查 ES File Explorer,你可能需要检查隐藏文件,从 ES File Explorer 幻灯片菜单中启用。 没有人没有.nomedia 【参考方案1】:图库不显示(必然)来自外部存储的文件。
这是一个常见的错误。
画廊显示存储在media store provider上的图像
您可以使用此方法将图像文件存储在媒体存储提供商上:
public static void addImageToGallery(final String filePath, final Context context)
ContentValues values = new ContentValues();
values.put(Images.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.MediaColumns.DATA, filePath);
context.getContentResolver().insert(Images.Media.EXTERNAL_CONTENT_URI, values);
【讨论】:
我是 android 新手,如何在我的代码中实现您的代码:/ 我需要将图像保存在文件 /WhatSappIMG/ 中:/ 将此方法添加到您的代码中,并在“output.close();”之后添加此行:addImageToGallery(file.getAbsolutePath(), YourActivity.this); 你提供的代码是在Activity类中实现的?如果是这样,那么 YourActivity 就是您的活动名称 如果你问过这个问题 - 那么你可能不仅是 android 新手,而且是 java 新手 我可以在 Skype 上与您聊天或其他聊天吗? xD【参考方案2】:当您将图片保存到图库中时,您应该输入以下内容
MediaStore.Images.Media.insertImage(getContentResolver(), yourBitmap, yourTitle , yourDescription);
该代码会将图片添加到图库末尾。所以请检查你的画廊图片,以确保
【讨论】:
我可以确定专辑名称吗? @DanielReyhanian 路径是:sdcard=>图片【参考方案3】:尝试添加这个:
MediaStore.Images.Media.insertImage(getContentResolver(), yourBitmap, yourTitle , yourDescription);
为 yourBitmap、yourTitle 和 yourDescription 填写您的详细信息,或者将其保留为 ""
。
【讨论】:
这项工作但将图像保存在相机的图像中我需要将图像保存在我的目录中:/【参考方案4】:您需要在将图像保存到图库的函数中添加一个 MediaScannerConnection 类。此类在与您的应用程序连接的图库中扫描新文件和文件夹。添加以下类,将新保存的图片文件或新添加的图片目录扫描到图库或download Source Code
MediaScannerConnection.scanFile(this, new String[]file.toString(), null,
new MediaScannerConnection.OnScanCompletedListener()
public void onScanCompleted(String path, Uri uri)
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
);
Read more
【讨论】:
【参考方案5】:对于 Xamarin 研究员:
public static void SaveToTheGalley(this string filePath, Context context)
var values = new ContentValues();
values.Put(MediaStore.Images.Media.InterfaceConsts.DateTaken, Java.Lang.JavaSystem.CurrentTimeMillis());
values.Put(MediaStore.Images.Media.InterfaceConsts.MimeType, "image/jpeg");
values.Put(MediaStore.MediaColumns.Data, filePath);
context.ContentResolver.Insert(MediaStore.Images.Media.ExternalContentUri, values);
不要忘记android.permission.WRITE_EXTERNAL_STORAGE
权限。
【讨论】:
我觉得你的回答没有得到足够的赞赏。非常感谢,您为我节省了大量时间,而且我的代码运行良好。此外,很高兴看到人们也确实关心使用 Xamarin 的人。【参考方案6】:作为
MediaStore.MediaColumns.Data
和
MediaStore.Images.Media.insertImage
现已弃用, 这是我使用位图的方法
fun addImageToGallery(
fileName: String,
context: Context,
bitmap: Bitmap
)
val values = ContentValues()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis())
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
values.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, fileName)
values.put(MediaStore.Images.ImageColumns.TITLE, fileName)
val uri: Uri? = context.contentResolver.insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
values
)
uri?.let
context.contentResolver.openOutputStream(uri)?.let stream ->
val oStream =
BufferedOutputStream(stream)
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, oStream)
oStream.close()
【讨论】:
【参考方案7】:请参考此代码为我工作:
public static boolean saveImageToGallery(Context context, Bitmap bmp)
// First save the picture
String storePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "dearxy";
File appDir = new File(storePath);
if (!appDir.exists())
appDir.mkdir();
String fileName = System.currentTimeMillis() + ".jpg";
File file = new File(appDir, fileName);
try
FileOutputStream fos = new FileOutputStream(file);
//Compress and save pictures by io stream
boolean isSuccess = bmp.compress(Bitmap.CompressFormat.JPEG, 60, fos);
fos.flush();
fos.close();
//Insert files into the system Gallery
//MediaStore.Images.Media.insertImage(context.getContentResolver(), file.getAbsolutePath(), fileName, null);
//Update the database by sending broadcast notifications after saving pictures
Uri uri = Uri.fromFile(file);
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
if (isSuccess)
return true;
else
return false;
catch (IOException e)
e.printStackTrace();
return false;
【讨论】:
【参考方案8】:你应该改变这段代码-
try
output = new FileOutputStream(file);
// Compress into png format image from 0% - 100%
bitmap1.compress(Bitmap.CompressFormat.JPEG, 100, output);
output.flush();
output.close();
String url = Images.Media.insertImage(getContentResolver(), bitmap1,
"Wallpaper.jpg", null);
catch (Exception e)
// TODO Auto-generated catch block
e.printStackTrace();
【讨论】:
这会压缩图像,然后更改图像的大小。以上是关于如何将图像保存在android画廊中的主要内容,如果未能解决你的问题,请参考以下文章
如何将图像保存在 android Q 的子目录中,同时保持向后兼容