在多媒体应用中,Image是最基础的功能模块,接下来我们将看看在Android中是如何获取和存储Image的。Android内嵌的Image获取和存储功能,可以让我们对于整个媒体框架有个比较全面的了解,同时为audio和video的学习打下基础。
一、Image的获取可以通过调Android自带的Camera应用来完成。该应用含有一个Intent-Filter。通过使用
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent)就可以启动Camera应用了。
二、Image存储,Android系统中含有一个多媒体库,其中包括所有Image、Video、Audio的数据。通过MediaStore对象可以访问相关数据。
闲话少说,直接看例子,这是一本英文书上的,觉得写的很好,自己翻译了一下,并加入了很多注释。以备查询。
package demo.camera;
import java.io.File;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
private static final int RESULT_CODE = 1;
private Button btnCamera;
private ImageView imageView;
private Uri imageFilePath;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageView = (ImageView)this.findViewById(R.id.imageView);
btnCamera = (Button)this.findViewById(R.id.camera);
btnCamera.setonClickListener(new View.onClickListener() {
@Override
public void onClick(View v) {
//在这里启动Camera。
//Camera中定义了一个Intent-Filter,其中Action是android.media.action.IMAGE_CAPTURE
//我们使用的时候,最好不要直接使用这个,而是用MediaStore中的常量ACTION_IMAGE_CAPTURE.
//这个常量就是对应的上面的action
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//这里我们插入一条数据,ContentValues是我们希望这条记录被创建时包含的数据信息
//这些数据的名称已经作为常量在MediaStore.Images.Media中,有的存储在MediaStore.MediaColumn中了
//ContentValues values = new ContentValues();
ContentValues values = new ContentValues(3);
values.put(MediaStore.Images.Media.DISPLAY_NAME, "testing");
values.put(MediaStore.Images.Media.DEscriptION, "this is description");
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
imageFilePath = MainActivity.this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageFilePath); //这样就将文件的存储方式和uri指定到了Camera应用中
//由于我们需要调用完Camera后,可以返回Camera获取到的图片,
//所以,我们使用startActivityForResult来启动Camera
startActivityForResult(intent, RESULT_CODE);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_CODE){
//说明是由Camera返回的数据
//由Camera应用返回的图片数据是一个Camera对象,存储在一个名为data的extra域
//然后将获取到的图片存储显示在ImageView中
try {
Bundle extra = data.getExtras();
//首先取得屏幕对象
Display display = this.getWindowManager().getDefaultDisplay();
//获取屏幕的宽和高
int dw = display.getWidth();
int dh = display.getHeight();
BitmapFactory.Options op = new BitmapFactory.Options();
//op.inSampleSize = 8;
op.inJustDecodeBounds = true;
//Bitmap pic = BitmapFactory.decodeFile(imageFilePath, op);//调用这个方法以后,op中的outWidth和outHeight就有值了
//由于使用了MediaStore存储,这里根据URI获取输入流的形式
Bitmap pic = BitmapFactory.decodeStream(this
.getContentResolver().openInputStream(imageFilePath),
null, op);
int wRatio = (int) Math.ceil(op.outWidth / (float) dw); //计算宽度比例
int hRatio = (int) Math.ceil(op.outHeight / (float) dh); //计算高度比例
Log.v("Width Ratio:", wRatio + "");
Log.v("Height Ratio:", hRatio + "");
if (wRatio > 1 && hRatio > 1) {
if (wRatio > hRatio) {
op.inSampleSize = wRatio;
} else {
op.inSampleSize = hRatio;
}
}
op.inJustDecodeBounds = false; //注意这里,一定要设置为false,因为上面我们将其设置为true来获取图片尺寸了
pic = BitmapFactory.decodeStream(this.getContentResolver()
.openInputStream(imageFilePath), null, op);
imageView.setImageBitmap(pic);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。



