现在的位置: 首页 > 综合 > 正文

android通过ContentPrivider扫描sd卡所有图片,并显示

2014年02月03日 ⁄ 综合 ⁄ 共 7118字 ⁄ 字号 评论关闭

如题:

重点在于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掉,所以还是在实现的过程对图片显示进行优化。

抱歉!评论已关闭.