Android 手機相冊圖片選擇

轉載請註明本文出自Jiaxu的專欄(http://blog.csdn.net/u011510784/article/details/48550037),謝謝!

項目開發中經常遇到選擇照片或者拍照並上傳到服務器上的情況,本文主要介紹手機中圖片的選擇及顯示,廢話不多,有圖有真相:

    

    

 爲提高可移植性,在主函數中的代碼很簡單,只需要初始化GridView即可,MainActivity中:

package com.example.tackphoto;

import android.content.Context;
import android.os.Bundle;

import com.example.showphoto.GridViewForListView;
import com.example.showphoto.WriteActivity;

public class MainActivity extends WriteActivity {
	private Context context;
	private GridViewForListView mGridView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		context = this;
		mGridView = (GridViewForListView) findViewById(R.id.gridView1);
		setGridViewForListView(context, mGridView);
	}
}


接下來看一下WriteActivity中的setGridViewForListView方法.這裏面主要處理圖片在GridView上的顯示以及GridView的點擊事件

public void setGridViewForListView(Context context,
			GridViewForListView mGridView) {
		this.mGridView = mGridView;
		this.context = context;
		dataForGV = new ArrayList<Bitmap>();
		listfile = new ArrayList<String>();
		getImageBitmap();
	}
可以看到,進來後會執行getImageBitmap()方法,在這個方法中會初始化一張添加圖片,點擊此圖片可以進行添加圖片操作,在這裏面也初始化了GridView的適配器以及點擊事件:

		if (adapter == null && dataForGV != null) {
			adapter = new AddPhotoGrideViewAdapter(context, listfile);
			mGridView.setAdapter(adapter);
			addPhotoGrideViewOnItemClickListener = new AddPhotoGrideViewOnItemClickListener(
					context, this, adapter, listfile, SELECTPHOTO, TAKE_PICTURE);
			mGridView
					.setOnItemClickListener(addPhotoGrideViewOnItemClickListener);
		}

先看一下點擊監聽事件AddPhotoGrideViewOnItemClickListener.class

@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		if (adapter != null) {
			if ((adapter.getCount() - 1) == position) {
				if (listfile.size() >= 6) {
					Toast.makeText(context, "最多隻能添加六張照片!", Toast.LENGTH_LONG)
							.show();
				} else {
					showmySelectDialog("拍照", "從相冊選擇");
				}
			} else {
				dialog(position);
			}
		}
	}

如果點的是最後一張,即加號圖片,如果添加的圖片沒有到六張,那麼彈出添加圖片的dialog;若點擊的不是最後一張,那麼彈出刪除此圖片的dialog.

繼續看一下選擇圖片:

	@Override
	public void onClick(View v) {
		Intent intent = null;
		switch (v.getId()) {
		case R.id.tv_one:
			outputFileUri = getOutputFileUri();
			intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
			intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
			activity.startActivityForResult(intent, takePhotoRequest);
			break;
		case R.id.tv_three:
			intent = new Intent();
			intent.setClass(context, ImgFileListActivity.class);
			// intent.putExtra("isSingled", false);
			activity.startActivityForResult(intent, addPhotoRequest);
			break;
		case R.id.tv_cancel:
			dismissSelectDialog();
			break;
		}
	}

tv_one表示點擊的是拍照,調用系統照相機拍照,tv_three表示選擇手機中的圖片,跳入ImgFileListActivity.在這個Activity中用listview的方式顯示手機中所有的存放圖片文件夾,這段代碼在Util類中:

/**
	 * 獲取全部圖片地址
	 * 
	 * @return
	 */
	public ArrayList<String> listAlldir() {
		Intent intent = new Intent(Intent.ACTION_PICK,
				android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
		Uri uri = intent.getData();
		ArrayList<String> list = new ArrayList<String>();
		String[] proj = { MediaStore.Images.Media.DATA };
		Cursor cursor = context.getContentResolver().query(uri, proj, null,
				null, null);// managedQuery(uri, proj, null, null, null);
		while (cursor.moveToNext()) {
			String path = cursor.getString(0);
			list.add(new File(path).getAbsolutePath());
		}
		return list;
	}

點擊listview進入ImgsActivity,查看相應文件裏的圖片,這裏使用GridView顯示圖片,點擊GridView記錄選擇的圖片,點擊保存按鈕,通過setResult()方法將選擇的圖片的路徑返回到上級Activity,並最終返回到WriteActivity裏,在Mainactivity中可以通過以下代碼獲取選擇的圖片的路徑:

	private List<String> getSelectedImgPath() {
		List<String> imgsPath = getImgPath();
		return imgsPath;
	}
   

   項目源碼>>>







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章