上一篇中執行個體講解了Android中的Camera的調用和圖片的儲存,這篇文章,我們將學習如何檢索並顯示媒體庫中的圖片。
這裡有個問題需要注意,如果你在模擬器已經啟動的情況下,push了幾張圖片到SDCard中,建議將模擬器關了,再重新啟動
一下,否則,剛剛添加的圖片,是沒有辦法擷取到的。這是因為Android是在系統啟動的時候來掃描模擬器上SDCard中多媒體檔案的。
閑話少說,看代碼:
package demo.camera;<br />import android.app.Activity;<br />import android.database.Cursor;<br />import android.graphics.Bitmap;<br />import android.graphics.BitmapFactory;<br />import android.os.Bundle;<br />import android.provider.MediaStore.Images.Media;<br />import android.util.Log;<br />import android.view.View;<br />import android.widget.ImageButton;<br />import android.widget.TextView;<br />/**<br /> * 該類完成圖片的檢索,顯示功能<br /> * @author Administrator<br /> *<br /> */<br />public class PhotoManager extends Activity {</p><p>public static final float DISPLAY_WIDTH = 200;<br />public static final float DISPLAY_HEIGHT = 200;</p><p>//這裡採用ImageButton的原因是有Button的作用<br />private ImageButton photoView;<br />private TextView nameView;</p><p>private Cursor cursor;</p><p>private String photoPath; //存放某張圖片對應的位置資訊<br />private Bitmap currPhoto;</p><p>//這三個變數主要用來儲存Media.DATA,Media.TITLE,Media.DISPLAY_NAME的索引號,來擷取每列的資料<br />private int photoIndex;<br />//private int titleIndex;<br />private int nameIndex;</p><p>public void onCreate(Bundle savedInstanceState){<br />super.onCreate(savedInstanceState);<br />setContentView(R.layout.photo_view);</p><p>photoView = (ImageButton)this.findViewById(R.id.image_view);<br />photoView.setOnClickListener(clickListener);<br />nameView = (TextView)this.findViewById(R.id.view_name);</p><p>//指定擷取的列<br />String columns[] = new String[]{<br />Media.DATA,Media._ID,Media.TITLE,Media.DISPLAY_NAME<br />};<br />//cursor = this.managedQuery(Media.EXTERNAL_CONTENT_URI, columns, null, null, null);<br />cursor = this.getContentResolver().query(Media.EXTERNAL_CONTENT_URI, columns, null, null, null);<br />photoIndex = cursor.getColumnIndexOrThrow(Media.DATA);<br />//titleIndex = cursor.getColumnIndexOrThrow(Media.TITLE);<br />nameIndex = cursor.getColumnIndexOrThrow(Media.DISPLAY_NAME);</p><p>Log.v("HERE First:", "First Debug");<br />//顯示第一張圖片,但是首先要判斷一下,Cursor是否有值<br />if(cursor.moveToFirst()){<br />showImage();<br />}<br />}</p><p>private View.OnClickListener clickListener = new View.OnClickListener() {</p><p>@Override<br />public void onClick(View v) {</p><p>if(cursor.moveToNext()){<br />showImage();<br />}<br />}<br />};</p><p>/**<br /> * 顯示映像資訊<br /> */<br />private void showImage(){<br />photoPath = cursor.getString(photoIndex); //這裡擷取到的就是圖片儲存的位置資訊<br />//這裡怎樣擷取圖片呢?看decodeBitmap<br />Log.v("Photo Path:", photoPath);<br />currPhoto = decodeBitmap(photoPath);<br />photoView.setImageBitmap(currPhoto);<br />nameView.setText(cursor.getString(nameIndex));<br />}</p><p>/**<br /> * 從path中擷取圖片資訊<br /> * @param path<br /> * @return<br /> */<br />private Bitmap decodeBitmap(String path){<br />BitmapFactory.Options op = new BitmapFactory.Options();<br />op.inJustDecodeBounds = true;<br />Bitmap bmp = BitmapFactory.decodeFile(path, op); //擷取尺寸資訊<br />//擷取比例大小<br />int wRatio = (int)Math.ceil(op.outWidth/DISPLAY_WIDTH);<br />int hRatio = (int)Math.ceil(op.outHeight/DISPLAY_HEIGHT);<br />//如果超出指定大小,則縮小相應的比例<br />if(wRatio > 1 && hRatio > 1){<br />if(wRatio > hRatio){<br />op.inSampleSize = wRatio;<br />}else{<br />op.inSampleSize = hRatio;<br />}<br />}<br />op.inJustDecodeBounds = false;<br />bmp = BitmapFactory.decodeFile(path, op);<br />return bmp;<br />}</p><p>}<br />