如何将图像保存在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画廊的缩略图预览

如何将图像保存到图库 Android 应用程序

如何将图像保存在 android Q 的子目录中,同时保持向后兼容

将图像从 Android 上的可绘制资源保存到 sdcard

如何修复 Android 上的图像下载/保存错误

如何在android画廊上显示特定文件夹中的图像