Android Camera实践(一)

来源:互联网 发布:飞时达土方软件 编辑:程序博客网 时间:2024/05/16 10:02

想用快速在程序中获取照片或者视频,最快且最省的方式就是调用系统提供的Camera。采用Intent开启系统Camera APP。

       1、 MediaStore.ACTION_IMAGE_CAPTURE 获取图片

       2、MediaStore.ACTION_VIDEO_CAPTURE 获取视频

如果设置了图片或者视频的文件putExtra(MediaStore.EXTRA_OUTPUT, fileUri);那么就会在本地自定义的路径存储由拍摄的图片或者视频,否则系统采用默认的路径存储,而且一旦自定义,就不能在返回来的intent中读取视频或者图片数据。
注:使用系统APP可能会是调用系统Camera的横竖屏发生变化。这样就会导致activity重绘,刚才的数据就会被刷新。所以需要在AndroidManifest中定义activity的属性为:android:configChanges="orientation|screenSize"。这样在横竖屏切换的时候,activity不会重绘。

package com.example.mycamera;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;import android.widget.MediaController;import android.widget.Toast;import android.widget.VideoView;public class MainActivity extends Activity implements OnClickListener {private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;private Uri fileUri; //设置图片保存的位置,否则使用camer app默认的路径 private Button imageCapture;private Button videoCapture;private ImageView imageView;private VideoView videoView;private final int MEDIA_TYPE_IMAGE = 1;private final int MEDIA_TYPE_VIDEO = 2;private final String mydir = "/myDownload/";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}public void init(){imageCapture = (Button) findViewById(R.id.imageCapture);imageCapture.setOnClickListener(this);videoCapture = (Button) findViewById(R.id.videoCapture);videoCapture.setOnClickListener(this);imageView = (ImageView)findViewById(R.id.image_view);videoView = (VideoView)findViewById(R.id.video_view);}@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.imageCapture:imageCaptureIntent();break;case R.id.videoCapture:videoCpatureIntent();break;default:break;}}public void imageCaptureIntent(){videoView.setVisibility(View.GONE);// create Intent to take a picture and return control to the calling applicationIntent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//create a file to save the imagefileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);//set the image file nameintent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);//start the image capture IntentstartActivityForResult(intent,CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);}public void videoCpatureIntent(){imageView.setVisibility(View.GONE);//create new IntentIntent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO);//设置视频文件intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);//设置视频质量intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1);//start the video Capture IntentstartActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);}public Uri getOutputMediaFileUri(int type){long time = System.currentTimeMillis();String path = Environment.getExternalStorageDirectory().toString() + mydir;Uri uri = null;String dest = null;switch(type){case MEDIA_TYPE_IMAGE:dest = path + time + ".jpg";break;case MEDIA_TYPE_VIDEO:dest = path + time + ".mp4";default:break;}if(dest != null){File f = new File(dest);uri = Uri.fromFile(f);}return uri;}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);//这里获得视频和音频文件,由于是采用保存至SD卡的模式,可能不能直接读取intent中得到的图片if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE){if(resultCode == RESULT_OK){showImage();}else if(requestCode == RESULT_CANCELED){//用户取消了拍照display("您取消了拍照");}else{//图片获取失败,建议用户display("您获取图片失败");}}else if(requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE){if(requestCode == RESULT_OK){showVideo();}else if(requestCode == RESULT_CANCELED){//用户取消视频display("您取消了视频");}else{//视频获取失败,建议用户display("您获取失败失败");}}}/*在activity中显示图片,一般手机获取的图片都很大,我用samsung S3拍照一般都有1.7-2.0MB,所以需要缩小 * 否则就会虚拟机溢出,一般读取图片的程序中,都是先获取图片的大小,然后判断大小后在进行适当的缩放等设置,获取合适大小的图片,再展示*/public void showImage(){try {InputStream is = new FileInputStream(fileUri.getPath());BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = false;options.inSampleSize = 4;Bitmap bitmap = BitmapFactory.decodeStream(is,null,options);imageView.setImageBitmap(bitmap);imageView.setVisibility(View.VISIBLE);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*在activity中播放视频,使用videoView 和 MediaController是最简单的, * videoView 播放视频,MediaController控制视频播放*/public void showVideo(){MediaController mc = new MediaController(this);//设置视频播放路径videoView.setVideoURI(fileUri);videoView.setVisibility(View.VISIBLE);//绑定一个MediaControllervideoView.setMediaController(mc);//播放视频videoView.start();}public void display(String msg){Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();}}




原创粉丝点击