轉載請註明本文出自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;
}