如题:
重点在于ContentPrivider的使用,和图片的显示上
首先在使用ContentPrivider查找图片前,先将sd卡整个扫描一遍,要不然的话你可能刚刚添加的图片是不会查找出来的。
// 必须在查找前进行全盘的扫描,否则新加入的图片是无法得到显示的(加入对sd卡操作的权限) public void allScan() { sendBroadcast(new Intent( Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); }
加入对sd卡访问的权限:
<uses-permission android:name="android.permission.RESTART_PACKAGES" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
下一步就可以使用ContentPrivider了:
/** * @FILE:ImageService.java * @AUTHOR:hui-ye * @DATE:2013-5-21 下午3:30:41 **/ package com.image.service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.provider.MediaStore; /******************************************* * * @CLASS:ImageService * @DESCRIPTION: * @AUTHOR:hui-ye * @VERSION:v1.0 * @DATE:2013-5-21 下午3:30:41 *******************************************/ public class ImageService { private Context context; public ImageService(Context context) { this.context = context; } /** * @description:通过contentprovider获得sd卡上的图片 * @author:hui-ye * @return:void */ public List<HashMap<String, String>> getImages() { // 指定要查询的uri资源 Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; // 获取ContentResolver ContentResolver contentResolver = context.getContentResolver(); // 查询的字段 String[] projection = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME, 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"; // 查询sd卡上的图片 Cursor cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder); List<HashMap<String, String>> imageList = new ArrayList<HashMap<String, String>>(); if (cursor != null) { HashMap<String, String> imageMap = null; cursor.moveToFirst(); while (cursor.moveToNext()) { imageMap = new HashMap<String, String>(); // 获得图片的id imageMap.put("imageID", cursor.getString(cursor .getColumnIndex(MediaStore.Images.Media._ID))); // 获得图片显示的名称 imageMap.put("imageName", cursor.getString(cursor .getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME))); // 获得图片的信息 imageMap.put( "imageInfo", "" + cursor.getLong(cursor .getColumnIndex(MediaStore.Images.Media.SIZE) / 1024) + "kb"); // 获得图片所在的路径(可以使用路径构建URI) imageMap.put("data", cursor.getString(cursor .getColumnIndex(MediaStore.Images.Media.DATA))); imageList.add(imageMap); } // 关闭cursor cursor.close(); } return imageList; } }
我们将图片信息全部放入到一个List<Map>中。
再下一步:
在activity中调用service获得List<Map>,并用自定义的适配器显示在listview中
package com.image.imageview; import java.util.HashMap; import java.util.List; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.image.service.ImageService; public class MainActivity extends Activity { private ImageService imageService; private List<HashMap<String, String>> images; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageService = new ImageService(this); allScan(); // 获得所有的图片 images = imageService.getImages(); if (images.size() > 0) { // 将所有的图片显示在listview中 ListView listview = (ListView) this.findViewById(R.id.listview); Myadapter adapter = new Myadapter(this); listview.setAdapter(adapter); } else { Toast.makeText(this, R.string.no_image, 1).show(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } // 必须在查找前进行全盘的扫描,否则新加入的图片是无法得到显示的(加入对sd卡操作的权限) public void allScan() { sendBroadcast(new Intent( Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); } /** * @CLASS:Myadapter * @DESCRIPTION:一个自定义的适配器 * @AUTHOR:hui-ye * @VERSION:v1.0 * @DATE:2013-5-27 上午9:08:43 */ class Myadapter extends BaseAdapter { private LayoutInflater inflater; public Myadapter(Context context) { this.inflater = LayoutInflater.from(context); } @Override public int getCount() { return images.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View view, ViewGroup parent) { ViewHolder holder = null; if (view == null) { holder = new ViewHolder(); // 获取行布局,对行布局中的控件进行设置赋值 view = inflater.inflate(R.layout.item, null); holder.imageName = (TextView) view.findViewById(R.id.name); holder.imageInfo = (TextView) view.findViewById(R.id.size); holder.image = (ImageView) view.findViewById(R.id.image); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } holder.imageName.setText(images.get(position).get("imageName")); holder.imageInfo.setText(images.get(position).get("imageInfo")); String path = images.get(position).get("data"); // 注意这里uri的使用,可以直接使用uri地址来构建一个image图片 Uri uri = Uri.parse(path); // 给imageview设置图片 holder.image.setImageURI(uri); return view; } } class ViewHolder { private TextView imageName; private TextView imageInfo; private ImageView image; } }
最后贴出主页面布局文件
<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" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/imagename" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/imageinfo" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/image" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> </LinearLayout>
listview的行布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="20dp" android:orientation="horizontal" > <TextView android:id="@+id/name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:maxLines="1" android:layout_weight="1" android:ellipsize="end"/> <TextView android:id="@+id/size" android:layout_width="fill_parent" android:layout_height="wrap_content" android:maxLines="1" android:layout_weight="1" /> <ImageView android:id="@+id/image" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" /> </LinearLayout>
至此完成。重点还是在ContentPrivider的使用,和listview的适配器的生成,图片的显示直接使用image.setImageURI(uri);上
注意一点:如果不对android的内存进行优化,当图片多的时候,可能会因为内存溢出应用down掉,所以还是在实现的过程对图片显示进行优化。