`

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

 

分享到:
评论

相关推荐

    Android开发应用实战详解源代码

    2.1.1 各种库和android运行环境 2.1.2 应用程序框架 2.1.3 操作系统层 2.1.4 应用程序 2.2 android应用程序组成 2.2.1 activity 2.2.2 intent和intent filter 2.2.3 service介绍 2.2.4 broadcastintentreceiver ...

    Android高级编程--源代码

    作为使用androidsdk构建这些应用程序的实用指南书籍,《android高级编程》从始至终穿插了一系列示例项目,每个项目都引入android的新功能和新技术,以助您达到最圆满的学习效果。书中介绍android的所有基本功能,并...

    android开发秘籍

    android开发秘籍完整版清晰版 第1 章 android 概述 1 1.1 android 演化史 1 1.2 android 的两面性 2 1.3 运行android 的设备 2 1.3.1 htc 系列机型 4 1.3.2 摩托罗拉系列机型 4 1.3.3 三星系列机型 4 1.3.4 ...

    《Android高级编程》

    1.9.3 Dalvik虚拟机 1.9.4 Android应用程序架构 1.9.5 Android库 1.9.6 高级Android库 1.10 小结 第2章 开始入手 2.1 Android开发 2.1.1 开始前的准备工作 2.1.2 创建第一个Android活动 2.1.3 Android应用程序的类型...

    多媒体发布系统.zip

    (多媒体信息发布系统)是一款操作简便的通用多媒体信息发布程序,它能帮助您轻松的编辑各类媒体信息并发布到各类显示设备上。它能将多种不同类型的设备以统一的界面进行管理,帮助用户更方便的进行媒体信息的编辑与...

    Android高级编程.pdf

    1.9.6 高级Android库 1.10 小结 第2章 开始入手 2.1 Android开发 2.1.1 开始前的准备工作 2.1.2 创建第一个Android活动 2.1.3 Android应用程序的类型 2.2 面向移动设备的开发 2.2.1 关于硬件设计的考虑事项 2.2.2 ...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    鉴于市场上用户的手机型号、种类、屏幕分辨率等参差不齐,传统方式根据主流系统分别开发相应的系统耗时又耗力,为了高效开发并节约开发项目成本,本文采用Android+HTML5相结合的方式进行移动端Web系统的设计研发工作...

    基于Android的移动端的校园自媒体平台的实现.zip

    平台可能支持富文本编辑,允许添加图片、视频和其他多媒体元素。分类标签:为了方便信息的检索和浏览,帖子可以按类别进行标记,如学术讲座、体育赛事、社团活动等。互动交流:读者可以直接在帖子下方留言评论,实现...

    基于opencv-python的sift、kmeans、bow图像检索.zip

    OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉库,专门为图像和视频处理任务设计,广泛应用于学术研究、工业应用以及个人项目中。以下是关于OpenCV的详细介绍: 历史与发展 起源:OpenCV...

    安卓数据恢复 v1.6.6.8 安装版-安卓手机数据恢复利器-供大家学习研究参考

    5、thundersoft Free Data Recovery正式版可以正确检索任何文件,无任何损失。 6、一个易于使用的向导,不需要先前的恢复技能。 软件优势 1、用户友好的界面 Gihosoft Android文件恢复免费是易于使用,你可以从...

    爱可视 Archos Video v8.1.1

    - 网络索引:进口远程共享文件夹(SMB)在多媒体库; - 视频瀏览文件夹或库的基础导航; - 无处不在的电视节目排序的系列/季/插曲层次的视图; - 多设备网络视频简歷; - TV友好:键盘/遥控器兼容。

    Cache生成并检索缩略图图像功能

    Cache生成并检索缩略图图像功能,Android-Image-Cache是一个能够自动判断从内存还是网络获取图片、缓存可以自动回收、自动判断如何有效地生成并检索各种尺寸缩略图的图像download-and-cacher,喜欢的朋友可以研究...

    微信公众平台应用开发:方法、技巧与案例.(机械工业.柳峰)

    他还是一位资深的Java软件开发工程师和Android/iOS移动应用开发工程师,活跃于CocoaChina、开源中国、CSDN等社区,CSDN博客专家,在CSDN博客撰写了系列微信公众平台二次开发的教程,深受欢迎并被广泛传播,也因此...

    JAVA上百实例源码以及开源项目源代码

    而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu  Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写...

    JAVA上百实例源码以及开源项目

    而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu  Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写...

    嵌入式系统/ARM技术中的联发科推出全球首款内建3个SWP接口NFC芯片MT6605

    全球无线通讯及数字多媒体IC设计领导厂商联发科技股份有限公司(MediaTek, Inc.)日前发布全球首款专为主流移动平台所设计,支持双SIM卡加一张micro SD卡的NFC (Near Field Communication;近场无线通信)解决方案MT...

    联发科推出首款内建3个SWP接口NFC芯片MT6605

    无线通讯及数字多媒体IC设计领导厂商联发科技股份有限公司(MediaTek, Inc.)日前发布首款专为主流移动平台所设计,支持双SIM卡加一张micro SD卡的NFC (Near Field Communication;近场无线通信)解决方案MT6605.MT...

Global site tag (gtag.js) - Google Analytics