(转)Android多媒体学习二:检索Android的图片库,并显示

转自chenjie19891104的的博客(http://blog.csdn.net/chenjie19891104/article/category/756236),以便以后学习和查询! 

上一篇中实例讲解了Android中的Camera的调用和图片的存储,这篇文章,我们将学习如何检索并显示媒体库中的图片。

这里有个问题需要注意,如果你在模拟器已经启动的情况下,push了几张图片到SDCard中,建议将模拟器关了,再重新启动

一下,否则,刚刚添加的图片,是没有办法获取到的。这是因为Android是在系统启动的时候来扫描模拟器上SDCard中多媒体文件的。

闲话少说,看代码:

package demo.camera;
import android.app.Activity;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.provider.MediaStore.Images.Media;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
/**
 * 该类完成图片的检索,显示功能
 * @author Administrator
 *
 */
public class PhotoManager extends Activity {
	
	public static final float DISPLAY_WIDTH = 200;
	public static final float DISPLAY_HEIGHT = 200;
	
	//这里采用ImageButton的原因是有Button的作用
	private ImageButton photoView;
	private TextView nameView;
	
	private Cursor cursor;
	
	private String photoPath; //存放某张图片对应的位置信息
	private Bitmap currPhoto;
	
	//这三个变量主要用来保存Media.DATA,Media.TITLE,Media.DISPLAY_NAME的索引号,来获取每列的数据
	private int photoIndex;
	//private int titleIndex;
	private int nameIndex;
	
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.photo_view);
		
		photoView = (ImageButton)this.findViewById(R.id.image_view);
		photoView.setOnClickListener(clickListener);
		nameView = (TextView)this.findViewById(R.id.view_name);
		
		//指定获取的列
		String columns[] = new String[]{
				Media.DATA,Media._ID,Media.TITLE,Media.DISPLAY_NAME
		};
		//cursor = this.managedQuery(Media.EXTERNAL_CONTENT_URI, columns, null, null, null);
		cursor = this.getContentResolver().query(Media.EXTERNAL_CONTENT_URI, columns, null, null, null);
		photoIndex = cursor.getColumnIndexOrThrow(Media.DATA);
		//titleIndex = cursor.getColumnIndexOrThrow(Media.TITLE);
		nameIndex = cursor.getColumnIndexOrThrow(Media.DISPLAY_NAME);
		
		Log.v("HERE First:", "First Debug");
		//显示第一张图片,但是首先要判断一下,Cursor是否有值
		if(cursor.moveToFirst()){
			showImage();
		}
	}
	
	private View.OnClickListener clickListener = new View.OnClickListener() {
		
		@Override
		public void onClick(View v) {
			
			if(cursor.moveToNext()){
				showImage();
			}
		}
	};
	
	/**
	 * 显示图像信息
	 */
	private void showImage(){
		photoPath = cursor.getString(photoIndex); //这里获取到的就是图片存储的位置信息
		//这里怎样获取图片呢?看decodeBitmap
		Log.v("Photo Path:", photoPath);
		currPhoto = decodeBitmap(photoPath);
		photoView.setImageBitmap(currPhoto);
		nameView.setText(cursor.getString(nameIndex));		
	}
	
	/**
	 * 从path中获取图片信息
	 * @param path
	 * @return
	 */
	private Bitmap decodeBitmap(String path){
		BitmapFactory.Options op = new BitmapFactory.Options();
		op.inJustDecodeBounds = true;
		Bitmap bmp = BitmapFactory.decodeFile(path, op); //获取尺寸信息
		//获取比例大小
		int wRatio = (int)Math.ceil(op.outWidth/DISPLAY_WIDTH);
		int hRatio = (int)Math.ceil(op.outHeight/DISPLAY_HEIGHT);
		//如果超出指定大小,则缩小相应的比例
		if(wRatio > 1 && hRatio > 1){
			if(wRatio > hRatio){
				op.inSampleSize = wRatio;
			}else{
				op.inSampleSize = hRatio;
			}
		}
		op.inJustDecodeBounds = false;
		bmp = BitmapFactory.decodeFile(path, op);
		return bmp;
	}
	
}

 转自chenjie19891104的的博客(http://blog.csdn.net/chenjie19891104/article/category/756236),以

便以后学习和查询!


 

学习总结:


1、默认保存图片的sdcard的URI是:Media.EXTERNAL_CONTENT_URI

2、保存图片的URI中常用的columns有

  

   Media.DATA, //图片的路径
   Media._ID,//图片的ID
   Media.TITLE,//图片的标题
   Media.DISPLAY_NAME  //图片的描述

3、要按比例显示图片,需要知道原始图片的大小


 

   BitmapFactory.Options op = new BitmapFactory.Options();  
   op.inJustDecodeBounds = true;  //设置为调试图片范围(这个值必须设置)
   //把图片的信息付给了BitmapFactory.Options,同时包括宽和高
   Bitmap bmp = BitmapFactory.decodeFile(path, op);
  
4、设置缩放比例


       //获取比例大小  
        int wRatio = (int)Math.ceil(op.outWidth/DISPLAY_WIDTH);  
        int hRatio = (int)Math.ceil(op.outHeight/DISPLAY_HEIGHT);  
        //如果超出指定大小,则缩小相应的比例  
         if(wRatio > 1 && hRatio > 1){
           op.inSampleSize = Math.max(wRatio,hRatio);
        }  

5、实现图片对象获取


  //这个值与前面的 op.inJustDecodeBounds = true;对应
  //设置为不是调试图片范围
  op.inJustDecodeBounds = false;  
  //创建图片对象
  bmp = BitmapFactory.decodeFile(path, op); 

猜你喜欢

转载自longyi-java.iteye.com/blog/1678572