Android使用多媒体(Media)拍照和录像

版权声明:有问题可联系博主QQ:15577969,大家一起相互交流和学习。 https://blog.csdn.net/qq15577969/article/details/80862921

1、清单文件AndroidManifest.xml需要添加SD卡的读取和写入权限


2、MainActivity.java

package com.t20.camera;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.VideoView;

public class MainActivity extends Activity {

	private static final int TAKE_PHOTO = 1;
	private static final int TAKE_VIDEO = 2;
	private String videoName;//视频名称
	
	private ImageView iv;
	private VideoView vv;
	
	private Uri photoUri;
	private Uri videoUri;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		iv=(ImageView) findViewById(R.id.imageView1);
		vv=(VideoView) findViewById(R.id.videoView1);
		
		//显示ImageView控件
		iv.setVisibility(View.VISIBLE);
		//隐藏VideoView控件
		vv.setVisibility(View.INVISIBLE);
		
		/*
			VISIBLE  (常量值:0) 	 可见的
			INVISIBLE(常量值:4) 	不可见的,但还占着原来的空间
			GONE     (常量值:8) 	隐藏,不占用原来的布局空间	 
		 */
	}
	/**
	 * 使用照像机进行拍照
	 * @param v
	 */
	public void photo(View v){	
		//显示ImageView控件
		iv.setVisibility(View.VISIBLE);
		//隐藏VideoView控件
		vv.setVisibility(View.INVISIBLE);
		
		 Date date=Calendar.getInstance().getTime();
		 SimpleDateFormat sdf= new SimpleDateFormat("yyyyMMddHHmmss");
		 String str=sdf.format(date);
		 File imgFile=new File(getExternalCacheDir(),str+".jpg");
		 //getExternalCacheDir()表示SD卡中的目录 
		 //getFilesDir()表示内存中的目录
		 try {
			 //存在同名文件就删除,再创建
			if(imgFile.exists()){
				imgFile.delete();
			}
			imgFile.createNewFile();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		 //创建Uri( 设置照片存储路径)
		 photoUri=Uri.fromFile(imgFile);
		 //准备意图
		 Intent intent=new Intent();
		 intent.setAction("android.media.action.IMAGE_CAPTURE");
		 intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
		 startActivityForResult(intent, TAKE_PHOTO);//往返			 
	}
	/**
	 * 使用照像机进行录像
	 * @param v
	 */
	public void video(View v){
		 //显示VideoView控件
		 vv.setVisibility(View.VISIBLE);
		//隐藏ImageView控件
		 iv.setVisibility(View.INVISIBLE);
		 
		 Date date=Calendar.getInstance().getTime();
		 SimpleDateFormat sdf= new SimpleDateFormat("yyyyMMddHHmmss");
		 String str=sdf.format(date);
		 videoName=str+".3gp";
		 File videoFile=new File(getExternalCacheDir(),videoName);
		 //getExternalCacheDir()表示SD卡中的目录 
		 //getFilesDir()表示内存中的目录
		 try {
			 //存在同名文件就删除,再创建
			if(videoFile.exists()){
				videoFile.delete();
			}
			videoFile.createNewFile();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		 //创建Uri( 设置录像存储路径)
		 videoUri=Uri.fromFile(videoFile);
		//准备意图
		 Intent intent=new Intent();
		 intent.setAction("android.media.action.VIDEO_CAPTURE");
		 intent.putExtra(MediaStore.EXTRA_OUTPUT, videoUri);
		 startActivityForResult(intent, TAKE_VIDEO);//往返	
	}
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		switch (requestCode) {
		case TAKE_PHOTO:
				if(resultCode==RESULT_OK){
					try {
						//将拍照的照片显示出来
						Bitmap bitmap=BitmapFactory.decodeStream(getContentResolver().openInputStream(photoUri));
						iv.setImageBitmap(bitmap);
					} catch (Exception e) {
						// TODO: handle exception
						e.printStackTrace();
					}
				}
			break;
		case TAKE_VIDEO:
			if(resultCode==RESULT_OK){
				//设置视频路径 
				vv.setVideoPath(getExternalCacheDir()+"/"+videoName);
				//开始播放(启动)
				vv.start();
				//为播放器添加控制面板(播放、暂停、进度控制)
				vv.setMediaController(new MediaController(MainActivity.this));
			}
		break;
		}
		super.onActivityResult(requestCode, resultCode, data);
	}
}

猜你喜欢

转载自blog.csdn.net/qq15577969/article/details/80862921