利用MediaStore检索图像+利用ExitInterface修改EXIF信息

利用MediaStore检索图像

由于ContentProvider(当前为MediaStore)在应用程序之间是共享的,且大多数应用程序默认使用MediaStore,因此可以利用它来建立自己的图像库应用程序。

MediaStore和所有的内容提供器都以一种类似数据库的方式运作。从它们中选择记录,获得一个Cursor对象,并通过它来遍历结果。

1.首先创建一个打算返回列的字符串数组。对于MediaStore中的图像,其标准列在MediaStore.Images.Media类表示。

String[] columns={Media.DATA,Media._ID,Media.TITLE,Media.DISPLAY_NAME};

2.使用activity的managedQuery方法执行查询,第一个参数是Uri,然后是列名称的数组,后跟WHERE子句和WHERE子句的任何参数,最后是ORDER BY子句。

long oneHourAgo=System.currentTimeMillis()/1000-(60*60);
String[] whereValues={""+oneHourAgo};
cursor=managedQuery(Media.EXTERNAL_CONTENT_URI,columns,Media.DATE_ADDED+" > ?",whereValues,Media.DATE_ADDED+" ASC");

3. 返回的游标会告诉我们当前选择的每个列的索引

displayColumn=cursor.getColumnIndexOrThrow(Media.DISPLAY_NAME);
示例代码:
public class MediaStoreGallery extends Activity
{
	public final static int DISPLAYWIDTH=200;
	public final static int DISPLAYHEIGHT=200;
	TextView titleTextView;
	ImageButton imageButton;
	Cursor cursor;
	Bitmap bmp;
	String imageFilePath;
	int fileColumn;
	int titleColumn;
	int displayColumn;
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		titleTextView=(TextView)this.findViewById(R.id.TitleTextView);
		imageButton=(ImageButton)this.findViewById(R.id.ImageButton);
		
		String[] columns={Media.DATA,Media._ID,Media.TITLE,Media.DISPLAY_NAME};
		cursor=managedQuery(Media.EXTERNAL_CONTENT_URI,columns,null,null,null);
		
//		long oneHourAgo=System.currentTimeMillis()/1000-(60*60);
//		String[] whereValues={""+oneHourAgo};
//		cursor=managedQuery(Media.EXTERNAL_CONTENT_URI,columns,
//				Media.DATE_ADDED+" > ?",whereValues,Media.DATE_ADDED+" ASC");
		
		fileColumn=cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
		titleColumn=cursor.getColumnIndexOrThrow(Media.TITLE);//可简写成
		displayColumn=cursor.getColumnIndexOrThrow(Media.DISPLAY_NAME);
		
		if(cursor.moveToFirst())
		{
			titleTextView.setText(cursor.getString(titleColumn));
			imageFilePath=cursor.getString(fileColumn);
			bmp=getBitmap(imageFilePath);
			imageButton.setImageBitmap(bmp);
		}
		
		imageButton.setOnClickListener(new OnClickListener()
		{

			@Override
			public void onClick(View v)
			{
				// TODO Auto-generated method stub
				if(cursor.moveToNext())
				{
					titleTextView.setText(cursor.getString(titleColumn));
					imageFilePath=cursor.getString(fileColumn);
					bmp=getBitmap(imageFilePath);
					imageButton.setImageBitmap(bmp);
				}
			}
			
		});
	}
	
	private Bitmap getBitmap(String imageFilePath)
	{
		
//		加载图像的尺寸而不是图像本身
			BitmapFactory.Options bmpFactoryOptions=new BitmapFactory.Options();
			bmpFactoryOptions.inJustDecodeBounds=true;
			Bitmap bmp=BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
			
			int heightRatio=(int)Math.ceil(bmpFactoryOptions.outHeight/(float)dh);
			int widthRatio=(int)Math.ceil(bmpFactoryOptions.outWidth/(float)dw);
			Log.v("HEIGHT RATIO",""+heightRatio);
			Log.v("WIDTH RATIO",""+widthRatio);
			
//		如果两个比率都大于1,那么图像的一条边将大于屏幕
			if(heightRatio>1&&widthRatio>1)
			{
				if(heightRatio>widthRatio)
				{
//				如果高度比率更大,则根据它缩放
					bmpFactoryOptions.inSampleSize=heightRatio;
				}
				else
				{
//				若宽度比率更大,则根据它缩放
					bmpFactoryOptions.inSampleSize=widthRatio;
				}
			}
//		对它进行真正的解码
			bmpFactoryOptions.inJustDecodeBounds=false;
			bmp=BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
			return bmp;		
	}
}

利用ExitInterface修改EXIF信息

1.EXIF 表示可交换的图像文件格式,它是在图像文件中保存元数据的一种标准方式。一般大多数标记与所捕获图像本身的数据相关,如ExposureTime和ShutterSpeedValue。

然而,有一些标记可以考虑填写或修改。

UserComment:由用户生成的备注

ImageDescription:标题

Artist:图像的创建者或接受者

Copyright:图像的版权持有人

Software:用于创建图像的软件

Android为我们提供了一种读写EXIF数据的方法,该方法的主要类是ExifInterface。

示例代码:

//如何使用ExifInterface从一个图像文件读取特定的EXIF数据
ExifInterface ei=new ExifInterface(imageFilePath);
String imageDescription=ei.getAttribute("ImageDescription");
if(imageDescription!=null)
{
	Log.v("EXIF",imageDescription);
}
//如何使用ExifInterface将EXIF数据保存到图像文件中
ei.setAttribute("ImageDescription","Something New");



1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShaderJoy

您的打赏是我继续写博客的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值