在多媒体应用中,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();
- }
- }
- }
- }
浙公网安备 33010602011771号