Android開發之多媒體——顯示手機存儲的圖片

        在Android中多媒體文件(音樂/視頻/圖片)是通過MediaStore來統一管理的,本文所演示的例子是通過MediaStore獲取手機存儲中的圖片,然後在Gallery中顯示出來。例子最後的效果:

下面先貼出本文需要添加和修改的文件:main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <Gallery android:id="@+id/gallery" android:layout_width="match_parent" android:layout_height="match_parent"/>
  
</LinearLayout>
上面的xml主要做的工作就是新建了一個Gallery,下面會用來存放圖片。
MainActivity.java

public class MainActivity extends Activity {
	
	private Gallery mGallery;
	private ArrayList<Bitmap> mImageArr = new ArrayList<Bitmap>();
	public static final String LOG_TAG = "MainActivity";
	private static final int LOAD_END = 1;
	private static final String mUriImage = MediaStore.Images.Media.DATA;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.activity_main);	
		mGallery = (Gallery)findViewById(R.id.gallery);
		loadPicHandle.post(new LocadImage());//使用Handler在後臺線程獲取圖片,獲取完成之後發通知,UI線程更新顯示
	}
	
	private  Handler loadPicHandle = new Handler(){	
		@Override
		public void handleMessage(android.os.Message msg) {
			switch(msg.what)
			{
				case LOAD_END:
					mGallery.setAdapter(new ImageAdapter(MainActivity.this,mImageArr));
					break;
				default :
					break;
			}
		};
	};
	
	public class LocadImage implements Runnable{
		@Override
		public void run() {
			Context ctx = MainActivity.this;
			ContentResolver contentR = ctx.getContentResolver();
			Cursor cursor = null;
			String[] projection = { MediaStore.Images.Media._ID,
					 	MediaStore.Images.Media.MIME_TYPE,  
		                MediaStore.Images.Media.DATA, MediaStore.Images.Media.SIZE };  
		    String selection = MediaStore.Images.Media.MIME_TYPE + "=?";  
		    String[] selectionArgs = { "image/jpeg" };  
		    String sortOrder = MediaStore.Images.Media.DATE_MODIFIED + " desc";  

			try{
				cursor = contentR.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, selection,  
		                selectionArgs, sortOrder);
				if( null == cursor)
				{
					Log.d(LOG_TAG,"cursor is null");
				}
				int iCount = cursor.getCount();
				cursor.moveToFirst();//如果圖片過多內存不足會Crash,超過10張只加載10張
				if( iCount > 10 )
				{
					iCount = 10;
				}
				for( int i = 0; i < iCount; i++ )
				{
					int index = cursor.getColumnIndex(mUriImage);
					String src = cursor.getString(index);
					
					Log.d(LOG_TAG,"src:"+src);
                                        //通過圖片的路徑加載圖片
					Bitmap bitmap = BitmapFactory.decodeFile( src, null );

					mImageArr.add(bitmap);
					cursor.moveToNext();
				}
				
				if( !mImageArr.isEmpty() )
				{
					Message msg = Message.obtain();
					msg.what = LOAD_END;
					loadPicHandle.sendMessage(msg);
				}
			}catch(Exception e){
				Log.e(LOG_TAG, e.getMessage());
			}
			finally{
				cursor.close();
			}
		}
		
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	private class ImageAdapter extends BaseAdapter{
		private Context mContext;
		ArrayList<Bitmap> mImageArr;
		
		public ImageAdapter(Context mContext,ArrayList<Bitmap> mImageArr) {
			this.mContext = mContext;
			this.mImageArr = mImageArr;
		}
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return mImageArr.size();
		}

		@Override
		public Object getItem(int arg0) {
			// TODO Auto-generated method stub
			return mImageArr.get(arg0);
		}

		@Override
		public long getItemId(int arg0) {
			// TODO Auto-generated method stub
			return arg0;
		}

		@Override
		public View getView(int position, View arg1, ViewGroup arg2) {
			Tools.log("getView position:"+position);
			ImageView image = new ImageView(mContext);
			image.setImageBitmap(mImageArr.get(position));
			image.setLayoutParams(new Gallery.LayoutParams(640, 640));
			return image;
		}
		
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章