相机概述

257 阅读4分钟

###相机概述:

  • Android框架支持通过Camera API 或者Camera intent来抓取图像和视频

  • Camera 此类是控制设备相机的主要API,此类用于创建相机应用时获取图片和视频

  • SurfaceView 此类为用户提供camera的实时图像预览

  • MediaRecorder 此类用于从camera录制视频

  • Intent 一个MediaStore.ACTION_IMAGE_CAPTUREMediaStore.ACTION_VIDEO_CAPTURE的intent,可以使用它来抓取图像或者视频,而不能操作Camera对象

  • CameraPermission 你的应用必须请求使用设备相机的权限

<uses-permission android:name="android.permission.CAMERA"/>
			
  • CameraFeatures 你的应用必须也要声明要使用的相机特性
	<uses-feature android:name="android.hardware.camera" android:required="false"/>
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
	
	<!--在使用视频捕获设备来录制视频的时候,你的应用必须有一下的权限-->
	<uses-permission android:name="android.permission.RECORD_AUDIO"/>
  • 使用现有的相机应用 一个不用写代码来获取图片和视频的快速方法是使用intent来调用现有的android camera应用,一个camera intent调用现存的相机应用抓取图片 或者视频剪辑然后返回你的应用

  • 调用一个相机的intent 主要有一下的步奏

  • (1)组件一个相机intent 创建一个请求图片或者视频的intent 使用以下intent类型中的一个

MediaStore.ACTION_IMAGE_CAPTURE从已存在的相机应用中请求一个图片 MediaStore.ACTION_VIDEO_CAPTURE,从已存在的相机应用中请求一个视频

  • (2)启动这个相机的intent,使用startActivityForResult()方法来执行相机intent,在你启动intent后,相机应用的界面会出现在设备屏幕上,然后用户就可以yoga他来获取图片和视频

  • (3)接收intent结果,在你的应用中设置一个onActivityResult()方法来接收从相机intent来的回调和数据,当用户获取了一个图片或者视频之后(或者取消了操作)系统就会调用此方法。

  • 图像或者intent

private static final int MEDIA_TYPE_IMAGE = 1; private static final int MEDIA_TYPE_VIDEO = 2;

			 public static Uri getOutputMediaFileUri(int type) {
		return Uri.fromFile(getOutputMediaFile(type));
	}


	private static File getOutputMediaFile(int type) {
		File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyCameraApp");
		if (!mediaStorageDir.exists()) {
			if (!mediaStorageDir.mkdirs()) {
				return null;
			}
		}
		String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
		File medifFile = null;
		if (type == MEDIA_TYPE_IMAGE) {
			medifFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
		} else if (type == MEDIA_TYPE_VIDEO) {
			medifFile = new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".avi");
		} else {
			return null;
		}

		return medifFile;
	}
  • 当startActivityForResult()方法被执行,看到一个相机应用的界面 当用户获取了一个图像(或者取消了操作)用户界面返回到你的应用 你必须拦截onActivityResult()方法来接收intent的结果然后在继续执行你的应用

/** * 拍照的方法 */ private void imageCamera() { Intent intent = new Intent(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, getOutputMediaFileUri(MEDIA_TYPE_IMAGE)); startActivityForResult(intent, MEDIA_TYPE_IMAGE); }

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	super.onActivityResult(requestCode, resultCode, data);
	switch (resultCode) {
		case RESULT_OK:
			//图片
			if (MEDIA_TYPE_IMAGE == requestCode) {
				Log.d("CameryActivity", "mFile:" + mFile);
			} else if (MEDIA_TYPE_VIDEO == requestCode) {
				//视频
			}

			break;
	}
}
  • 视频获取inten 使用相机intent获取视频是使用最少代码使得你的应用获取视屏的捷径 一个视频获取intent可以包含以下额外的信息
  • (1)MediaStore.EXTRA_OUTPUT此设置需要一个保存视频的路径和文件名的Uri,此设置是可选的但强烈推荐,如果你不指定此值,相机应用就把请求到的图像以默认的文件名保存到默认的文件夹下,这些信息保存在返回的intent的Intent.getData()字段中
  • (2)MediaStore.EXTRA_VIDEO_QUALITY 此值在最低质量最小文件尺寸时是0,在最高质量最大文件尺寸时是1
  • (3)MediaStore.EXTRA_DURATION_LIMIT 此值设置获取视屏的长度,以秒为单位
  • (4)MediaStore.EXTRA_SIZE_LIMIT 此值设置获取视屏文件的大小,以字节为单位
 /**
		 * 录视频
		 */
		private void videoCamera() {
			Intent intent = new Intent();
			intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE);
			intent.putExtra(MediaStore.EXTRA_OUTPUT, getOutputMediaFileUri(MEDIA_TYPE_VIDEO));
			intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);  //设置视频质量
			startActivityForResult(intent, MEDIA_TYPE_VIDEO);
		}
		
		
  • 音频录制步奏:

    android为我们提供了android.media.MediaRecorder类用于音频的录制。
    
  • 1、创建android.media.MediaRecorder实例

  • 2、设置音源MediaRecorder.setAudioSource(),通过可以是MediaRecorder.AudioSource.MIC

  • 3、设置输出文件的格式 MediaRecorder.setOutputFormat()\

  • 4、设置输出文件 MediaRecorder.setOutputFile()

  • 5、设置音频编码 MediaRecorder.setAudioEncoder()

  • 6、设置MediaRecorder.prepare()

  • 7、调用MediaRecorder.start()开始录制

  • 8、调用MediaRecorder.stop()停止录制

  • 9、完成或者结束录制调用MediaRecorder.release()来释放资源

  • 录音代码:

public class RecodeActivity extends AppCompatActivity implements View.OnClickListener, MediaRecorder.OnErrorListener {

private Button startRecord;
private Button stopRecord;
private MediaRecorder mRecorder;
private boolean prepared = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_recode);
	mRecorder = new MediaRecorder();
	initialize();
}

private void initialize() {

	startRecord = (Button) findViewById(R.id.startRecord);
	startRecord.setOnClickListener(this);
	stopRecord = (Button) findViewById(R.id.stopRecord);
	stopRecord.setOnClickListener(this);
	initRecord();
}


@Override
public void onClick(View v) {
	switch (v.getId()) {
		case R.id.startRecord:
			startRecord();
			break;
		case R.id.stopRecord:
			stopRecord();
			break;
	}
}

/**
 * 初始化录音的准备工作
 */
private void initRecord() {
	mRecorder.reset();
	mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);  //设置音源
	mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //设置输出格式
	mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //设置音频的编码格式
	String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + File.separator + System.currentTimeMillis() + ".mp3";
	mRecorder.setOutputFile(path);  //设置输出文件夹
	try {
		mRecorder.prepare();
		prepared = true;
	} catch (IOException e) {
		e.printStackTrace();
	}

	stopRecord.setEnabled(false);

}

/**
 * 停止录音
 */
private void stopRecord() {
	if (prepared) {
		mRecorder.start();
		stopRecord.setEnabled(true);
		startRecord.setEnabled(false);
		prepared = false;
	}
}

/**
 * 开始录音
 */
private void startRecord() {
	mRecorder.stop();
	stopRecord.setEnabled(false);
	startRecord.setEnabled(true);
}


@Override
public void onError(MediaRecorder mr, int what, int extra) {
	mRecorder.reset();
}

@Override
protected void onDestroy() {
	super.onDestroy();
	if (mRecorder != null) {
		mRecorder.release();
	}
}

}

###WebView的参数设置:

  • 加载网页
  • 加载本地
  • post方式传递参数
String postData = "clientID = cid & usernaem = name";
webView.postUrl(String url,byte[]postData) //加载网页使用post方法,

//使用loadData()方法来加载html的数据
loadData()方法需要三个参数:HTML TAG,MIME类型(text/html,网页编码方式(utf-8)
wv.loadData(content,"text/html","utf-8");