在多媒体应用中,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对象可以访问相关数据。
闲话少说,直接看例子,这是一本英文书上的,觉得写的很好,自己翻译了一下,并加入了很多注释。以备查询。
一、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(); -
} -
} -
} - }