You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by fi...@apache.org on 2012/06/20 02:13:05 UTC
android commit: Added MediaScanner abilities to camera launcher
plugin. Now images saved to SD card should show up in the android gallery app
right away
Updated Branches:
refs/heads/mediascanner [created] de9640be3
Added MediaScanner abilities to camera launcher plugin. Now images saved to SD card should show up in the android gallery app right away
Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/commit/de9640be
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/tree/de9640be
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/diff/de9640be
Branch: refs/heads/mediascanner
Commit: de9640be399a01c69300f4d26ad46a28b779425f
Parents: d60806b
Author: Fil Maj <ma...@gmail.com>
Authored: Tue Jun 19 17:14:05 2012 -0700
Committer: Fil Maj <ma...@gmail.com>
Committed: Tue Jun 19 17:14:05 2012 -0700
----------------------------------------------------------------------
.../src/org/apache/cordova/CameraLauncher.java | 44 ++++++++++++--
1 files changed, 37 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cordova-android/blob/de9640be/framework/src/org/apache/cordova/CameraLauncher.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/CameraLauncher.java b/framework/src/org/apache/cordova/CameraLauncher.java
index 1afaf8d..b2ab74f 100755
--- a/framework/src/org/apache/cordova/CameraLauncher.java
+++ b/framework/src/org/apache/cordova/CameraLauncher.java
@@ -41,6 +41,8 @@ import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.Bitmap.CompressFormat;
+import android.media.MediaScannerConnection;
+import android.media.MediaScannerConnection.MediaScannerConnectionClient;
import android.net.Uri;
import android.provider.MediaStore;
@@ -49,7 +51,7 @@ import android.provider.MediaStore;
* and returns the captured image. When the camera view is closed, the screen displayed before
* the camera view was shown is redisplayed.
*/
-public class CameraLauncher extends Plugin {
+public class CameraLauncher extends Plugin implements MediaScannerConnectionClient {
private static final int DATA_URL = 0; // Return base64 encoded string
private static final int FILE_URI = 1; // Return file uri (content://media/external/images/media/2 for Android)
@@ -79,6 +81,8 @@ public class CameraLauncher extends Plugin {
public String callbackId;
private int numPics;
+
+ private MediaScannerConnection conn; // Used to update gallery app with newly-written files
//This should never be null!
//private CordovaInterface cordova;
@@ -334,13 +338,13 @@ public class CameraLauncher extends Plugin {
// (Don't use insertImage() because it uses default compression setting of 50 - no way to change it)
ContentValues values = new ContentValues();
values.put(android.provider.MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
- Uri uri = null;
+
try {
- uri = this.cordova.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
+ this.imageUri = this.cordova.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
} catch (UnsupportedOperationException e) {
LOG.d(LOG_TAG, "Can't write to external media storage.");
try {
- uri = this.cordova.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
+ this.imageUri = this.cordova.getActivity().getContentResolver().insert(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
} catch (UnsupportedOperationException ex) {
LOG.d(LOG_TAG, "Can't write to internal media storage.");
this.failPicture("Error capturing image - no media storage found.");
@@ -349,24 +353,28 @@ public class CameraLauncher extends Plugin {
}
// Add compressed version of captured image to returned media store Uri
- OutputStream os = this.cordova.getActivity().getContentResolver().openOutputStream(uri);
+ OutputStream os = this.cordova.getActivity().getContentResolver().openOutputStream(this.imageUri);
bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os);
os.close();
// Restore exif data to file
if (this.encodingType == JPEG) {
- exif.createOutFile(FileUtils.getRealPathFromURI(uri, this.cordova));
+ exif.createOutFile(FileUtils.getRealPathFromURI(this.imageUri, this.cordova));
exif.writeExifData();
}
+ // Scan for the gallery to update pic refs in gallery
+ this.scanForGallery();
+
// Send Uri back to JavaScript for viewing image
- this.success(new PluginResult(PluginResult.Status.OK, uri.toString()), this.callbackId);
+ this.success(new PluginResult(PluginResult.Status.OK, this.imageUri.toString()), this.callbackId);
}
bitmap.recycle();
bitmap = null;
System.gc();
checkForDuplicateImage(FILE_URI);
+
} catch (IOException e) {
e.printStackTrace();
this.failPicture("Error capturing image.");
@@ -541,4 +549,26 @@ public class CameraLauncher extends Plugin {
public void failPicture(String err) {
this.error(new PluginResult(PluginResult.Status.ERROR, err), this.callbackId);
}
+
+ private void scanForGallery() {
+ if(this.conn!=null) this.conn.disconnect();
+ this.conn = new MediaScannerConnection(this.ctx.getActivity().getApplicationContext(), this);
+ conn.connect();
+ }
+
+ @Override
+ public void onMediaScannerConnected() {
+ try{
+ this.conn.scanFile(this.imageUri.toString(), "image/*");
+ } catch (java.lang.IllegalStateException e){
+ e.printStackTrace();
+ LOG.d(LOG_TAG, "Can;t scan file in MediaScanner aftering taking picture");
+ }
+
+ }
+
+ @Override
+ public void onScanCompleted(String path, Uri uri) {
+ this.conn.disconnect();
+ }
}