Loading media/tests/CameraBrowser/AndroidManifest.xml +2 −0 Original line number Original line Diff line number Diff line <manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.camerabrowser"> package="com.android.camerabrowser"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:label="@string/app_label"> <application android:label="@string/app_label"> <activity android:name="CameraBrowser" android:label="Camera Browser"> <activity android:name="CameraBrowser" android:label="Camera Browser"> <intent-filter> <intent-filter> Loading media/tests/CameraBrowser/res/menu/object_menu.xml +2 −0 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,8 @@ <menu xmlns:android="http://schemas.android.com/apk/res/android"> <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" <item android:id="@+id/delete" android:title="@string/delete_item" /> android:title="@string/delete_item" /> </menu> </menu> media/tests/CameraBrowser/res/values/strings.xml +3 −0 Original line number Original line Diff line number Diff line Loading @@ -32,9 +32,12 @@ <string name="keywords_label">Keywords: </string> <string name="keywords_label">Keywords: </string> <!-- menu items --> <!-- menu items --> <string name="save_item">Save</string> <string name="delete_item">Delete</string> <string name="delete_item">Delete</string> <!-- toasts --> <!-- 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="object_deleted_message">Object deleted</string> <string name="delete_failed_message">Could not delete object</string> <string name="delete_failed_message">Could not delete object</string> Loading media/tests/CameraBrowser/src/com/android/camerabrowser/ObjectBrowser.java +0 −45 Original line number Original line Diff line number Diff line Loading @@ -26,16 +26,12 @@ import android.net.Uri; import android.os.Bundle; import android.os.Bundle; import android.provider.Mtp; import android.provider.Mtp; import android.util.Log; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ImageView; import android.widget.ListView; import android.widget.ListView; import android.widget.ResourceCursorAdapter; import android.widget.ResourceCursorAdapter; import android.widget.TextView; import android.widget.TextView; import android.widget.Toast; /** /** * A list view displaying all objects within a container (folder or storage unit). * A list view displaying all objects within a container (folder or storage unit). Loading Loading @@ -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 { private class ObjectCursorAdapter extends ResourceCursorAdapter { public ObjectCursorAdapter(Context context, Cursor c) { public ObjectCursorAdapter(Context context, Cursor c) { Loading media/tests/CameraBrowser/src/com/android/camerabrowser/ObjectViewer.java +136 −6 Original line number Original line Diff line number Diff line Loading @@ -22,12 +22,25 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory; import android.net.Uri; import android.net.Uri; import android.os.Bundle; 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.provider.Mtp; import android.util.Log; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View; import android.widget.ImageView; import android.widget.ImageView; import android.widget.TextView; 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; import java.util.Date; /** /** Loading Loading @@ -106,18 +119,135 @@ public class ObjectViewer extends Activity { view.setText(c.getString(12)); view.setText(c.getString(12)); byte[] thumbnail = c.getBlob(13); byte[] thumbnail = c.getBlob(13); if (thumbnail != null) { 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); ImageView thumbView = (ImageView)findViewById(R.id.thumbnail); Bitmap bitmap = BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length); Bitmap bitmap = BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length); Log.d(TAG, "bitmap: " + bitmap); if (bitmap != null) { if (bitmap != null) { thumbView.setImageBitmap(bitmap); 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(); } } } } Loading
media/tests/CameraBrowser/AndroidManifest.xml +2 −0 Original line number Original line Diff line number Diff line <manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.camerabrowser"> package="com.android.camerabrowser"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:label="@string/app_label"> <application android:label="@string/app_label"> <activity android:name="CameraBrowser" android:label="Camera Browser"> <activity android:name="CameraBrowser" android:label="Camera Browser"> <intent-filter> <intent-filter> Loading
media/tests/CameraBrowser/res/menu/object_menu.xml +2 −0 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,8 @@ <menu xmlns:android="http://schemas.android.com/apk/res/android"> <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" <item android:id="@+id/delete" android:title="@string/delete_item" /> android:title="@string/delete_item" /> </menu> </menu>
media/tests/CameraBrowser/res/values/strings.xml +3 −0 Original line number Original line Diff line number Diff line Loading @@ -32,9 +32,12 @@ <string name="keywords_label">Keywords: </string> <string name="keywords_label">Keywords: </string> <!-- menu items --> <!-- menu items --> <string name="save_item">Save</string> <string name="delete_item">Delete</string> <string name="delete_item">Delete</string> <!-- toasts --> <!-- 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="object_deleted_message">Object deleted</string> <string name="delete_failed_message">Could not delete object</string> <string name="delete_failed_message">Could not delete object</string> Loading
media/tests/CameraBrowser/src/com/android/camerabrowser/ObjectBrowser.java +0 −45 Original line number Original line Diff line number Diff line Loading @@ -26,16 +26,12 @@ import android.net.Uri; import android.os.Bundle; import android.os.Bundle; import android.provider.Mtp; import android.provider.Mtp; import android.util.Log; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ImageView; import android.widget.ListView; import android.widget.ListView; import android.widget.ResourceCursorAdapter; import android.widget.ResourceCursorAdapter; import android.widget.TextView; import android.widget.TextView; import android.widget.Toast; /** /** * A list view displaying all objects within a container (folder or storage unit). * A list view displaying all objects within a container (folder or storage unit). Loading Loading @@ -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 { private class ObjectCursorAdapter extends ResourceCursorAdapter { public ObjectCursorAdapter(Context context, Cursor c) { public ObjectCursorAdapter(Context context, Cursor c) { Loading
media/tests/CameraBrowser/src/com/android/camerabrowser/ObjectViewer.java +136 −6 Original line number Original line Diff line number Diff line Loading @@ -22,12 +22,25 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory; import android.net.Uri; import android.net.Uri; import android.os.Bundle; 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.provider.Mtp; import android.util.Log; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View; import android.widget.ImageView; import android.widget.ImageView; import android.widget.TextView; 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; import java.util.Date; /** /** Loading Loading @@ -106,18 +119,135 @@ public class ObjectViewer extends Activity { view.setText(c.getString(12)); view.setText(c.getString(12)); byte[] thumbnail = c.getBlob(13); byte[] thumbnail = c.getBlob(13); if (thumbnail != null) { 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); ImageView thumbView = (ImageView)findViewById(R.id.thumbnail); Bitmap bitmap = BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length); Bitmap bitmap = BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length); Log.d(TAG, "bitmap: " + bitmap); if (bitmap != null) { if (bitmap != null) { thumbView.setImageBitmap(bitmap); 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(); } } } }