2012年9月17日 星期一

Android 開發筆記 - 匯入圖片至模擬器中

gallery_apps


雖然 Android 開發是用實機才是王道,但有時就是想偷懶看模擬器跑的如何,這時就仍需要模擬器的環境。如果要處理照片、影片的應用時,就需要匯入一些圖片影片來測試。一開始若直接用 adb shell 或 DDMS push 資料至模擬器時,會顯示 failed to copy: Read-only file system:


$ adb push test.png /sdcard/
failed to copy 'test.png' to '/sdcard//test.png': Read-only file system


這時因為 / 目錄為 Read-Only file system,需要稍微處理一下:


$ adb shell mount -o remount rw /sdcard


接著就可以 DDMS 或 adb shell 匯入資料:


$ adb push images/ /sdcard/
push: images/1.png -> /mnt/sdcard/1.png
push: images/2.png -> /mnt/sdcard/2.png
push: images/3.png -> /mnt/sdcard/3.png
push: images/4.png -> /mnt/sdcard/4.png
push: images/5.png -> /mnt/sdcard/5.png


然而,匯入後仍無法被系統偵測,無論是寫程式還是開 Gallery app 也都一樣,但只需跑一下模擬器內建軟體 Dev Tools > Media Scanner 後,即可解決。


簡易的取出系統內所有 image 方式:


Cursor imgcursor = managedQuery(
       MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
       { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID }, // columns
       null,
       null,
       MediaStore.Images.Media._ID // order by
);
if( imgcursor != null ) {
       int count = imgcursor.getCount();
       int media_data_index = imgcursor.getColumnIndex(MediaStore.Images.Media.DATA);
       int media_id_index = imgcursor.getColumnIndex(MediaStore.Images.Media._ID);
       for( int i=0 ; i<count ; ++i ) {
              imgcursor.moveToPosition(i);
              String path = imgcursor.getString(media_data_index);
              Bitmap thumbnail = MediaStore.Images.Thumbnails.getThumbnail( getApplicationContext().getContentResolver(), media_id_index, MediaStore.Images.Thumbnails.MICRO_KIND, null);
              System.out.println("path :"+path);
       }
}


用 Intent  開啟單張圖片:


Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Pictures"), 1);


依檔案型態開啟對應程式:


Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" + path), "image/*");
startActivity(intent);


沒有留言:

張貼留言