安卓:如何将图片添加到相册

3
有人能分享代码(或指向Android示例代码)来帮助我将图像添加到媒体库(相册)中吗?
在我的应用程序中,我从我们的服务器下载图像,并使用相机(通过Intent)拍摄新图像。
我想将这些图像组织到一个特定于应用程序的相册中,类似于Facebook(和其他应用程序)应用程序所做的,使相关图像都整齐有序地组织起来。
我之前研究过Media Store API文档,但并没有成功...所以需要一些帮助。
谢谢。
3个回答

6
这是一种将图片存储在公共图片文件夹中,并在其中使用自定义应用程序文件夹的方法。
public void saveImageToExternal(String imgName, Bitmap bm) throws IOException {
    //Create Path to save Image
    File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES+appFolder); //Creates app specific folder
    path.mkdirs();
    File imageFile = new File(path, imgName+".png"); // Imagename.png
    FileOutputStream out = new FileOutputStream(imageFile);
    try{
        bm.compress(Bitmap.CompressFormat.PNG, 100, out); // Compress Image
        out.flush();
        out.close();

        // Tell the media scanner about the new file so that it is
        // immediately available to the user.
        MediaScannerConnection.scanFile(context,new String[] { imageFile.getAbsolutePath() }, null,new MediaScannerConnection.OnScanCompletedListener() {
            public void onScanCompleted(String path, Uri uri) {
                Log.i("ExternalStorage", "Scanned " + path + ":");
                Log.i("ExternalStorage", "-> uri=" + uri);
            }
        });
    } catch(Exception e) {
        throw new IOException();
    }
}

注意,appFolder需要一个前导斜杠“/”才能存储在自定义图库中。 - jklp

3

您可以使用:

  MediaStore.Images.Media.insertImage(ContentResolver cr, Bitmap source, String title, String description);

我相信在http://developer.android.com/guide/的某些子菜单中,一定有一个命令要求MediaStore扫描指定文件夹,只是现在我找不到它了。

编辑: 找到了:

 MediaScannerConnection.scanFile(Context context, String[] path, null, null);

2
那么,要将图像添加到哪个相册中?我如何(之前)创建该相册? - Andrew Mackenzie
文件夹的名称就是相册的名称。 - Budius
1
如果它没有回答问题,为什么这是一个被接受的答案呢? - Jens Zalzala
1
@anakin78z 我显然是在回答问题。没看懂的是BoD。但是为了解释一下,Android图库中没有所谓的“相册”,只有包含图像的文件夹(或目录)。例如,“/sdcard/DCIM/Cars/image1.jpg”将会显示在一个名为“Cars”的“相册”中,而“/sdcard/DCIM/Flowers/image1.jpg”将会显示在一个名为“Flowers”的“相册”中,依此类推。 - Budius
1
你的第一段代码(MediaStore.Images.Media.insertImage(...))与问题无关。它不会将图片添加到相册中。第二部分也不是答案。一个可能的答案可以根据你刚才的评论:将图片保存到特定的文件夹,然后使用MediaScannerConnection将其添加到图库中。 - Jens Zalzala
路径必须是外部存储目录,如果路径是您的内部存储目录或context.getExternalFilesDir,则无法工作。 - Snow Albert

2

这是我最终使用的代码:

public static Uri addToTouchActiveAlbum( Context context, String title, String filePath ) {
    ContentValues values = new ContentValues(); 
    values.put( Media.TITLE, title ); 
    values.put( Images.Media.DATE_TAKEN, System.currentTimeMillis() );
    values.put( Images.Media.BUCKET_ID, filePath.hashCode() );
    values.put( Images.Media.BUCKET_DISPLAY_NAME, Constants.TA_PHOTO_ALBUM_NAME );

    values.put( Images.Media.MIME_TYPE, "image/jpeg" );
    values.put( Media.DESCRIPTION, context.getResources().getString( R.string.product_image_description ) ); 
    values.put( MediaStore.MediaColumns.DATA, filePath );
    Uri uri = context.getContentResolver().insert( Media.EXTERNAL_CONTENT_URI , values );

    return uri;
}

它适用于我在“getExternalStorage()”(/storage/sdcard0)中拥有的图像。

我还想添加我在不同文件夹中拥有的图像(我在Context.getExternalCacheDir()返回的文件夹下创建了一个cacheDir)。问题是:我不知道它们的mime类型(这重要吗?),该文件夹位于不同位置且具有不同名称 - 我无法弄清如何添加到“相册”本身.....因为相册名称似乎来自文件夹名称....

或者换句话说:

values.put( Images.Media.BUCKET_DISPLAY_NAME, Constants.TA_PHOTO_ALBUM_NAME );

看起来没有任何效果?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接