转自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);