8

Is there a good way to add new image resources(from SD card) to a gallery widget at runtime?

eyecreate
  • 1,017
  • 3
  • 14
  • 26

2 Answers2

28

"new image resources"?

Image resources are a part of /res/drawable folder inside your .apk application package. You can not add "new" image resources during runtime.

Is there some other use case you had in mind?

Edited after posters explanation:

You have to add media files to Media Store in order to be seen by gallery widget. Use MediaScanner. I use this convenient wrapper in my code:

public class MediaScannerWrapper implements  
MediaScannerConnection.MediaScannerConnectionClient {
    private MediaScannerConnection mConnection;
    private String mPath;
    private String mMimeType;

    // filePath - where to scan; 
    // mime type of media to scan i.e. "image/jpeg". 
    // use "*/*" for any media
    public MediaScannerWrapper(Context ctx, String filePath, String mime){
        mPath = filePath;
        mMimeType = mime;
        mConnection = new MediaScannerConnection(ctx, this);
    }

    // do the scanning
    public void scan() {
        mConnection.connect();
    }

    // start the scan when scanner is ready
    public void onMediaScannerConnected() {
        mConnection.scanFile(mPath, mMimeType);
        Log.w("MediaScannerWrapper", "media file scanned: " + mPath);
    }

    public void onScanCompleted(String path, Uri uri) {
        // when scan is completes, update media file tags
    }
}

Then instantiate MediaScannerWrapper and start it with scan(). You could tweak it to handle more than one file at the time. Hint: pass List of File paths, and then loop around mConnection.scanFile.

Peter Knego
  • 79,991
  • 11
  • 123
  • 154
  • yes, I'm talking about images stored on the external storage. – eyecreate Nov 11 '10 at 20:00
  • So, how does this connect to a gallery widget to display? – eyecreate Nov 12 '10 at 00:06
  • Gallery widget displays all files that are added to Media Store. – Peter Knego Nov 12 '10 at 07:58
  • 2
    Unfortunately that doesn't seem to update apps that use the info... For example, downloading a mp3 and running this code will scan it, but not add to the default media player. To do that, you need context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); as described here: http://stackoverflow.com/questions/3300137/how-can-i-refresh-mediastore-on-android – NoBugs Dec 20 '11 at 04:59
1

Send broadcast to MediaStore Content Provider when you add a file

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(imageAdded)));

Working for devices before KitKat

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
              Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

Also have a look at this

Working in Lolipop and should also solve kitkat issues.

ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA,"file path");
values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpeg");
mContext.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);

Add Permission.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Community
  • 1
  • 1
Zar E Ahmer
  • 33,936
  • 20
  • 234
  • 300