该项目实现的功能如下:
获取手机相册,点击每个相册之后进入该相册的图片列表界面,在图片列表界面可以实现图片多选,然后进入所选择的图片界面,在该界面内可以实现所选图片的上传等功能。
该项目最大特色:
1、获取相册列表,目前网络上面介绍获取相册的项目很少,本文专门讲述相册的获取。
2、使用Android-Universal-Image-Loader集成框架-第三方jar包加载本地图片,熟悉这个jar的开发者肯定不陌生,该jar包十分强大,除了可以获取网络图片,本地图片也是可以的。同时,通过引用第三方jar可以有效解决OOM异常问题。
继续讲述相册内图片列表界面的实现,首先给出相册列表界面Acitivity类代码:
public class AlbumItemActivity extends Activity {
private GridView gridView;
private PhotoUpImageBucket photoUpImageBucket;
//相册对象,相册内部保存了该相册内部的图片列表
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.album_item);
init();//初始化
setListener();//设置监听器
}
private void init(){
gridView = (GridView) findViewById(R.id.album_item_gridv);
Intent intent = getIntent();
photoUpImageBucket = (PhotoUpImageBucket) intent.getSerializableExtra(imagelist);
AlbumItemAdapter adapter = new AlbumItemAdapter(photoUpImageBucket.getImageList(), AlbumItemActivity.this);
gridView.setAdapter(adapter);
}
private void setListener(){
gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<!--?--> parent, View view,
int position, long id) {
Toast.makeText(AlbumItemActivity.this, 选中了+position, Toast.LENGTH_SHORT).show();
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
下面给出适配器代码:
public class AlbumItemAdapter extends BaseAdapter {
private List<photoupimageitem> list;
private LayoutInflater layoutInflater;
private ImageLoader imageLoader;//图片加载器
private DisplayImageOptions options;
public AlbumItemAdapter(List<photoupimageitem> list,Context context){
this.list = list;
layoutInflater = LayoutInflater.from(context);
imageLoader = ImageLoader.getInstance();
// 使用DisplayImageOption.Builder()创建DisplayImageOptions
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.default_loading_pic)
// 设置图片下载期间显示的图片
.showImageForEmptyUri(R.drawable.default_loading_pic) // 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.default_loading_pic)
// 设置图片加载或解码过程中发生错误显示的图片
.cacheInMemory(true)
// 设置下载的图片是否缓存在内存中
.cacheOnDisc(true)
// 设置下载的图片是否缓存在SD卡中
// .displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片
.bitmapConfig(Config.ARGB_8888)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.build();
// 创建配置过的DisplayImageOption对象
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.album_item_image_view, parent, false);
holder = new Holder();
holder.imageView = (ImageView) convertView.findViewById(R.id.image_item);
convertView.setTag(holder);
}else {
holder = (Holder) convertView.getTag();
}
//图片加载器的使用代码,就这一句代码即可实现图片的加载。请注意
//这里的uri地址,因为我们现在实现的是获取本地图片,所以使
//用file://+图片的存储地址。如果要获取网络图片,
//这里的uri就是图片的网络地址。
imageLoader.displayImage(file://+list.get(position).getImagePath(), holder.imageView, options);
return convertView;
}
class Holder{
ImageView imageView;
}
}
图片列表界面的适配器比较简单,获取数据之后进行加载即可。这里面用到了相册对象类PhotoUpImageBucket,该类代码如下:
/**
* 一个目录下的相册对象
*/
public class PhotoUpImageBucket implements Serializable{
public int count = 0;
public String bucketName;
public List<photoupimageitem> imageList;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getBucketName() {
return bucketName;
}
public void setBucketName(String bucketName) {
this.bucketName = bucketName;
}
public List<photoupimageitem> getImageList() {
return imageList;
}
public void setImageList(List<photoupimageitem> imageList) {
this.imageList = imageList;
}
}
同时代码中也是用到了图片对象类PhotoUpImageItem,该类代码如下:
public class PhotoUpImageItem implements Serializable {
//图片ID
private String imageId;
//原图路径
private String imagePath;
//是否被选择
private boolean isSelected = false;
public String getImageId() {
return imageId;
}
public void setImageId(String imageId) {
this.imageId = imageId;
}
public String getImagePath() {
return imagePath;
}
public void setImagePath(String imagePath) {
this.imagePath = imagePath;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
}
}