summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/MediaSaveService.java
diff options
context:
space:
mode:
authorAngus Kong <shkong@google.com>2013-04-17 15:37:07 -0700
committerAngus Kong <shkong@google.com>2013-04-19 12:46:08 -0700
commit83a99ae51a11af28553dfb77ef0ec91148671c9b (patch)
tree6a954b37ccd589bd1f419acaedbd1c0c25a1b713 /src/com/android/camera/MediaSaveService.java
parentb0e82433a948ab7625d5c0343a4207ea9a45bbf7 (diff)
downloadandroid_packages_apps_Snap-83a99ae51a11af28553dfb77ef0ec91148671c9b.tar.gz
android_packages_apps_Snap-83a99ae51a11af28553dfb77ef0ec91148671c9b.tar.bz2
android_packages_apps_Snap-83a99ae51a11af28553dfb77ef0ec91148671c9b.zip
Save video using MediaSaveService.
bug:8511719 Change-Id: I3fc5054bf7661953181b27e66cc70ba95082d36c
Diffstat (limited to 'src/com/android/camera/MediaSaveService.java')
-rw-r--r--src/com/android/camera/MediaSaveService.java81
1 files changed, 75 insertions, 6 deletions
diff --git a/src/com/android/camera/MediaSaveService.java b/src/com/android/camera/MediaSaveService.java
index b1f47df77..e37b45cf2 100644
--- a/src/com/android/camera/MediaSaveService.java
+++ b/src/com/android/camera/MediaSaveService.java
@@ -18,16 +18,20 @@ package com.android.camera;
import android.app.Service;
import android.content.ContentResolver;
+import android.content.ContentValues;
import android.content.Intent;
import android.location.Location;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.IBinder;
+import android.provider.MediaStore.Video;
import android.util.Log;
import com.android.gallery3d.exif.ExifInterface;
+import java.io.File;
+
/*
* Service for saving images in the background thread.
*/
@@ -85,7 +89,8 @@ public class MediaSaveService extends Service {
Log.e(TAG, "Cannot add image when the queue is full");
return;
}
- SaveTask t = new SaveTask(data, title, date, (loc == null) ? null : new Location(loc),
+ ImageSaveTask t = new ImageSaveTask(data, title, date,
+ (loc == null) ? null : new Location(loc),
width, height, orientation, exif, resolver, l);
mTaskNumber++;
@@ -95,6 +100,13 @@ public class MediaSaveService extends Service {
t.execute();
}
+ public void addVideo(String path, long duration, ContentValues values,
+ OnMediaSavedListener l, ContentResolver resolver) {
+ // We don't set a queue limit for video saving because the file
+ // is already in the storage. Only updating the database.
+ new VideoSaveTask(path, duration, values, l, resolver).execute();
+ }
+
public void setListener(Listener l) {
mListener = l;
if (l == null) return;
@@ -109,7 +121,7 @@ public class MediaSaveService extends Service {
if (mListener != null) mListener.onQueueStatus(false);
}
- private class SaveTask extends AsyncTask <Void, Void, Uri> {
+ private class ImageSaveTask extends AsyncTask <Void, Void, Uri> {
private byte[] data;
private String title;
private long date;
@@ -120,9 +132,9 @@ public class MediaSaveService extends Service {
private ContentResolver resolver;
private OnMediaSavedListener listener;
- public SaveTask(byte[] data, String title, long date, Location loc,
- int width, int height, int orientation, ExifInterface exif,
- ContentResolver resolver, OnMediaSavedListener listener) {
+ public ImageSaveTask(byte[] data, String title, long date, Location loc,
+ int width, int height, int orientation, ExifInterface exif,
+ ContentResolver resolver, OnMediaSavedListener listener) {
this.data = data;
this.title = title;
this.date = date;
@@ -148,9 +160,66 @@ public class MediaSaveService extends Service {
@Override
protected void onPostExecute(Uri uri) {
- listener.onMediaSaved(uri);
+ if (listener != null) listener.onMediaSaved(uri);
mTaskNumber--;
if (mTaskNumber == SAVE_TASK_LIMIT - 1) onQueueAvailable();
}
}
+
+ private class VideoSaveTask extends AsyncTask <Void, Void, Uri> {
+ private String path;
+ private long duration;
+ private ContentValues values;
+ private OnMediaSavedListener listener;
+ private ContentResolver resolver;
+
+ public VideoSaveTask(String path, long duration, ContentValues values,
+ OnMediaSavedListener l, ContentResolver r) {
+ this.path = path;
+ this.duration = duration;
+ this.values = new ContentValues(values);
+ this.listener = l;
+ this.resolver = r;
+ }
+
+ @Override
+ protected void onPreExecute() {
+ // do nothing.
+ }
+
+ @Override
+ protected Uri doInBackground(Void... v) {
+ values.put(Video.Media.SIZE, new File(path).length());
+ values.put(Video.Media.DURATION, duration);
+ Uri uri = null;
+ try {
+ Uri videoTable = Uri.parse("content://media/external/video/media");
+ uri = resolver.insert(videoTable, values);
+
+ // Rename the video file to the final name. This avoids other
+ // apps reading incomplete data. We need to do it after we are
+ // certain that the previous insert to MediaProvider is completed.
+ String finalName = values.getAsString(
+ Video.Media.DATA);
+ if (new File(path).renameTo(new File(finalName))) {
+ path = finalName;
+ }
+
+ resolver.update(uri, values, null, null);
+ } catch (Exception e) {
+ // We failed to insert into the database. This can happen if
+ // the SD card is unmounted.
+ Log.e(TAG, "failed to add video to media store", e);
+ uri = null;
+ } finally {
+ Log.v(TAG, "Current video URI: " + uri);
+ }
+ return uri;
+ }
+
+ @Override
+ protected void onPostExecute(Uri uri) {
+ if (listener != null) listener.onMediaSaved(uri);
+ }
+ }
}