相机概述:
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");