Merge "CameraBrowser: Add support for copying files from camera to internal storage."

This commit is contained in:
Mike Lockwood
2010-07-26 17:51:02 -07:00
committed by Android (Google) Code Review
5 changed files with 143 additions and 51 deletions

View File

@@ -1,6 +1,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.camerabrowser">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application android:label="@string/app_label">
<activity android:name="CameraBrowser" android:label="Camera Browser">
<intent-filter>

View File

@@ -16,6 +16,8 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/save"
android:title="@string/save_item" />
<item android:id="@+id/delete"
android:title="@string/delete_item" />
</menu>

View File

@@ -32,9 +32,12 @@
<string name="keywords_label">Keywords: </string>
<!-- menu items -->
<string name="save_item">Save</string>
<string name="delete_item">Delete</string>
<!-- toasts -->
<string name="object_saved_message">Object saved</string>
<string name="save_failed_message">Could not save object</string>
<string name="object_deleted_message">Object deleted</string>
<string name="delete_failed_message">Could not delete object</string>

View File

@@ -26,16 +26,12 @@ import android.net.Uri;
import android.os.Bundle;
import android.provider.Mtp;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ResourceCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
/**
* A list view displaying all objects within a container (folder or storage unit).
@@ -119,47 +115,6 @@ public class ObjectBrowser extends ListActivity {
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.object_menu, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
int position = mList.getSelectedItemPosition();
MenuItem item = menu.findItem(R.id.delete);
item.setEnabled(position != AdapterView.INVALID_POSITION);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.delete:
deleteSelected();
return true;
}
return false;
}
private void deleteSelected() {
int position = mList.getSelectedItemPosition();
int rowID = (int)mAdapter.getItemId(position);
Uri uri = Mtp.Object.getContentUri(mDeviceID, rowID);
Log.d(TAG, "deleting " + uri);
int result = getContentResolver().delete(uri, null, null);
if (result > 0) {
Toast.makeText(this, R.string.object_deleted_message, Toast.LENGTH_SHORT).show();
mCursor.requery();
} else {
Toast.makeText(this, R.string.delete_failed_message, Toast.LENGTH_SHORT).show();
}
}
private class ObjectCursorAdapter extends ResourceCursorAdapter {
public ObjectCursorAdapter(Context context, Cursor c) {

View File

@@ -22,12 +22,25 @@ import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.FileUtils;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.provider.Mtp;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Calendar;
import java.util.Date;
/**
@@ -106,18 +119,135 @@ public class ObjectViewer extends Activity {
view.setText(c.getString(12));
byte[] thumbnail = c.getBlob(13);
if (thumbnail != null) {
Log.d(TAG, "got thumbnail, length: " + thumbnail.length);
for (int i = 0; i < 50; i++) {
Log.d(TAG, " " + Integer.toHexString(thumbnail[i]));
}
ImageView thumbView = (ImageView)findViewById(R.id.thumbnail);
Bitmap bitmap = BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length);
Log.d(TAG, "bitmap: " + bitmap);
if (bitmap != null) {
thumbView.setImageBitmap(bitmap);
}
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.object_menu, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem item = menu.findItem(R.id.save);
item.setEnabled(true);
item = menu.findItem(R.id.delete);
item.setEnabled(true);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.save:
save();
return true;
case R.id.delete:
delete();
return true;
}
return false;
}
private static String getTimestamp() {
Calendar c = Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis());
return String.format("%tY-%tm-%td-%tH-%tM-%tS", c, c, c, c, c, c);
}
private void save() {
boolean success = false;
Uri uri = Mtp.Object.getContentUri(mDeviceID, mObjectID);
File destFile = null;
ParcelFileDescriptor pfd = null;
FileInputStream fis = null;
FileOutputStream fos = null;
try {
pfd = getContentResolver().openFileDescriptor(uri, "r");
Log.d(TAG, "save got pfd " + pfd);
if (pfd != null) {
fis = new FileInputStream(pfd.getFileDescriptor());
Log.d(TAG, "save got fis " + fis);
File destDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM);
destDir.mkdirs();
destFile = new File(destDir, "CameraBrowser-" + getTimestamp() + ".jpeg");
Log.d(TAG, "save got destFile " + destFile);
if (destFile.exists()) {
destFile.delete();
}
fos = new FileOutputStream(destFile);
byte[] buffer = new byte[65536];
int bytesRead;
while ((bytesRead = fis.read(buffer)) >= 0) {
Log.d(TAG, "copying the bytes numbering " + bytesRead);
fos.write(buffer, 0, bytesRead);
}
// temporary workaround until we straighten out permissions in /data/media
// 1015 is AID_SDCARD_RW
FileUtils.setPermissions(destDir.getPath(), 0775, Process.myUid(), 1015);
FileUtils.setPermissions(destFile.getPath(), 0664, Process.myUid(), 1015);
success = true;
}
} catch (Exception e) {
Log.e(TAG, "Exception in ObjectView.save", e);
} finally {
if (fis != null) {
try {
fis.close();
} catch (Exception e) {
}
}
if (fos != null) {
try {
fos.close();
} catch (Exception e) {
}
}
if (pfd != null) {
try {
pfd.close();
} catch (Exception e) {
}
}
}
if (success) {
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(destFile));
sendBroadcast(intent);
Toast.makeText(this, R.string.object_saved_message, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, R.string.save_failed_message, Toast.LENGTH_SHORT).show();
}
}
private void delete() {
Uri uri = Mtp.Object.getContentUri(mDeviceID, mObjectID);
Log.d(TAG, "deleting " + uri);
int result = getContentResolver().delete(uri, null, null);
if (result > 0) {
Toast.makeText(this, R.string.object_deleted_message, Toast.LENGTH_SHORT).show();
finish();
} else {
Toast.makeText(this, R.string.delete_failed_message, Toast.LENGTH_SHORT).show();
}
}
}