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();}}
- Android Camera实践(一)
- Android Camera(一)
- 一 Android Camera框架
- Android Camera(一)
- Android 自定义Camera(一)
- Android 自定义Camera(一)
- android之Camera(一)
- android camera(一):camera模组CMM介绍
- android camera(一):camera模组CMM介绍
- android camera(一):camera模组CMM介绍
- android camera(一):camera模组CMM介绍
- android camera(一):camera模组CMM介绍
- android camera(一):camera模组CMM介绍
- android camera(一):camera模组CMM介绍
- android camera(一):camera模组CMM介绍
- android camera(一):camera模组CMM介绍
- android camera(一):camera模组CMM介绍
- android camera(一):camera模组CMM介绍
- Ztree部分实例
- 黑马程序员-数组
- C#接口-简单示例
- 单片机数码管0000-9999显示问题
- CXF配置Webservice接口
- Android Camera实践(一)
- Android EditText
- 百度地图之精度和纬度的相互转换
- window API一天一练之操作文件和目录
- Hadoop实验学习笔记(参考)
- 黑马程序员-冒泡排序、直接排序、二分法
- file_get_contents使用
- DSP算法系列教程定点算数运算
- 生活琐事(一)丢魂了