【android,19】android照相机、视频录制,开启系统照相机和视频录制
来源:互联网 发布:电信网络转换 编辑:程序博客网 时间:2024/03/29 05:07
照相机开发:
一、照相机界面的设计:
1、照相机界面要求:
①、照相机屏幕是横屏显示:在清单文件中activity元素的android:screenOrientation
属性指定显示状态,landscape为横屏显示,portrait为竖屏显示。不指定该属性时是横竖屏可以切换的。
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:screenOrientation="landscape"
android:name=".DemoActivity"
android:label="@string/app_name" >
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
②、照相机全屏显示:就是隐藏activity的状态栏和标题栏。
在activity的onCreate方法中使用requestWindowFeature()方法设置显示窗体的状态,为Window.FEATURE_NO_TITLE 无标题状态。
注意:一定要写到 setcontentview()方法之前。
public class DemoActivity extends Activity implementsOnClickListener {
public voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//不显示标题:
// 一定要写到 setcontentview之前
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
//设置窗体隐藏状态栏
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
}
2照相机的界面布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout //相对布局
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<SurfaceView //SurfaceView 空间
android:id="@+id/sv"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:orientation="horizontal" >
<Button
android:id="@+id/autofocus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="自动对焦" />
<Button
android:id="@+id/takepic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="拍照" />
</LinearLayout>
</RelativeLayout>
二、开发代码:
//获取各组件
SurfaceView sv = (SurfaceView) this.findViewById(R.id.sv);
//对焦的按钮
Button autofocus = (Button) this.findViewById(R.id.autofocus);
//拍照
Button takepic = (Button) this.findViewById(R.id.takepic);
//按钮注册点击事件:
autofocus.setOnClickListener(this);
takepic.setOnClickListener(this);
//获取SurfaceHolder对象
SurfaceHolder holder = sv.getHolder();
// 注意: 要写在holder创建之前:
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//设置SurfaceHolder回调函数
holder.addCallback(new Callback() {
//SurfaceHolder销毁的方法
public voidsurfaceDestroyed(SurfaceHolder holder) {
camera.release();//释放资源
camera = null;
}
//SurfaceHolder创建时调用的方法:
public voidsurfaceCreated(SurfaceHolder holder) {
//将创建的SurfaceHolder对象设置给成员变量。
DemoActivity.this.holder = holder;
//照相机对象
camera = Camera.open();
//获取照相机所有参数的键值对字符串.
// String parrten = camera.getParameters().flatten();
// TODO:设置照相机的参数
//获取照相机参数对象:
Camera.Parameters parms = camera.getParameters();
System.out.println(parms.flatten());
//为参数设置值:
parms.setPreviewFrameRate(5); //每秒显示的帧数
parms.setPictureSize(1280, 960);//设置宽高
parms.setPictureFormat(PixelFormat.JPEG);//设置照片的输出格式
parms.set("jpeg-quality", 100);//照片质量
//
// camera.setParameters(parms);
//设置预览界面,surfaceHolder作为参数:
camera.setPreviewDisplay(holder);
//通过SurfaceView显示取景画面
camera.startPreview();//开始预览
}
@Override
public voidsurfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
}
});
按钮的点击事件方法:
public void onClick(View v) {
switch (v.getId()) {
case R.id.autofocus://点击对焦的按钮
camera.autoFocus(null);//让手机对焦的方法:
break;
case R.id.takepic://点击照相按钮:
//takePicture方法参数1:按快门,拍照声音响起时的回调。
参数2:照片后未压缩图片的回调
参数3:照片后压缩成jpeg图片的回调
camera.takePicture(null, null, new PictureCallback() {
//方法参数1:照片的二进制字节数组
public voidonPictureTaken(byte[] data, Camera camera) {
//判断sd是否可用
if(Environment.MEDIA_MOUNTED.equals(
Environment.getExternalStorageState())){
//TODO:保存图片到sd卡
File file = new File(
Environment.getExternalStorageDirectory(),
System.currentTimeMillis()+".jpg");
FileOutputStream fos = new FileOutputStream(file);
// fos.write(data);
// fos.flush();
// fos.close();
//decodeByteArray()方法获取Bitmap对象
Bitmap bm =BitmapFactory.decodeByteArray(data, 0, data.length);
//压缩方法:
参数1:压缩的图片格式。
参数2:文件质量
参数3:文件的输出流
bm.compress(CompressFormat.JPEG,50, fos);
fos.flush();
fos.close();
Toast.makeText(
getApplicationContext(),"保存图片成功", 1).show();
camera.startPreview();//重新开始预览图片
}else{
Toast.makeText(getApplicationContext(), "sd卡不可用", 1).show();
}
}
});
break;
}
}
视频录制开发:mediaRecorder类
一、界面布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<SurfaceView
android:id="@+id/sv"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:orientation="horizontal" >
<Button
android:id="@+id/recoder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="录制" />
<Button
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
android:clickable="false"
android:text="停止" />
</LinearLayout>
</RelativeLayout>
二、业务代码:activity类 ,
public class DemoActivity extends Activity implementsOnClickListener {
private SurfaceView sv;
private Buttonstart,stop;
private SurfaceHolderholder;
private MediaRecorderrecorder;
@Override
public voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获取组件
sv = (SurfaceView)this.findViewById(R.id.sv);
//获取surfaceHolder
holder =sv.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
start = (Button)this.findViewById(R.id.recoder);
stop = (Button)this.findViewById(R.id.stop);
start.setOnClickListener(this);
stop.setOnClickListener(this);
//SurfaceHolder 的回调
holder.addCallback(new Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
DemoActivity.this.holder= holder;
//创建MediaRecorder对象
recorder = newMediaRecorder();
recorder.reset();
//从照相机采集视频
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//设置采集音频
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置输出格式
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//设置大小
recorder.setVideoSize(720,480); // TODO ?
recorder.setVideoFrameRate(3);//每秒3帧
//设置视频编码方式
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//判断sd是否可用 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//创建视频文件对象
File file = new File (
Environment.getExternalStorageDirectory(),
System.currentTimeMillis()+".3gp");
//视频输出的文件
recorder.setOutputFile(file.getAbsolutePath());
//设置显示
recorder.setPreviewDisplay(DemoActivity.this.holder.getSurface());
}else{
Toast.makeText(getApplicationContext(), "sd卡不可用", 1).show();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, intwidth,
int height) {
// TODO Auto-generatedmethod stub
}
});
}
//按钮的点击事件方法
public void onClick(Viewv) {
switch (v.getId()) {
case R.id.recoder://录制按钮
try {
recorder.prepare();//准备录制
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "录制准备失败", 0).show();
e.printStackTrace();
}//预期准备
recorder.start();
stop.setEnabled(true);
stop.setClickable(true);
start.setEnabled(false);
start.setClickable(false);
break;
case R.id.stop://停止按钮
recorder.stop();
recorder.release();
start.setEnabled(true);
start.setClickable(true);
stop.setEnabled(false);
stop.setClickable(false);
break;
}
}
}
开启系统照相机意图:
一、是激活系统照相机组件:
public class DemoActivity extends Activity {
/** Called when theactivity is first created. */
private ImageView iv;
@Override
public voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
iv = (ImageView)this.findViewById(R.id.iv);
}
//点击按钮的事件方法:
public void click(Viewview){
//隐式意图 获取系统照相机组件
Intent intent = new Intent();
intent.setAction("android.media.action.IMAGE_CAPTURE");
intent.addCategory("android.intent.category.DEFAULT");
startActivityForResult(intent, 0); //以获取返回值开启组件
}
//以带返回值形式开启组件 ,触发的方法:
protected voidonActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
// new Intent("inline-data").putExtra("data",bitmap);
System.out.println("获取到照片");
if(data!=null){
Uri uri = data.getData();
//iv.setImageURI(uri);
//System.out.println(uri.toString());
String str = data.getAction();
if(str!=null){
System.out.println(str);
}
//查看源代码 获取图片
Bitmap bitmap =data.getParcelableExtra("data");
//将图片设置在ImageView中显示:
iv.setImageBitmap(bitmap);
}
}
}
二、激活系统录制视频组件:
public class DemoActivity extends Activity {
/** Called when theactivity is first created. */
private ImageView iv;
@Override
public voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
iv = (ImageView)this.findViewById(R.id.iv);
}
//按钮的点击方法
public void click(Viewview){
//隐式意图激活系统录制视频组件
Intent intent = new Intent();
intent.setAction("android.media.action.VIDEO_CAPTURE");
intent.addCategory("android.intent.category.DEFAULT");
startActivityForResult(intent, 0);
}
@Override
protected voidonActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
// new Intent("inline-data").putExtra("data",bitmap);
System.out.println("获取到照片");
if(data!=null){
Uri uri = data.getData();
通过获取的uri 播放录制的视频
}
}
}
- 【android,19】android照相机、视频录制,开启系统照相机和视频录制
- Android:照相机(camera)与视频录制(Recorder)的实现
- android视频录制(调用系统视频录制)
- 照相机和录制
- android录制和播放视频
- 照相机(Camera)与视频录制(MediaRecorder)
- Android 视频录制
- android视频录制
- android 音视频录制
- android视频录制例子
- Android录制视频(五)
- Android录制视频(四)
- Android录制视频(三)
- Android录制视频(二)
- Android录制视频(一)
- Android视频录制
- VLC Android录制视频
- android-音视频录制
- 项目中jQuery使用最佳实践
- html+css+jquery实现折叠板(模仿搜索风云榜折叠板)
- mysql控制台乱码问题
- 利用JavaScript实现在浏览器状态栏显示停留时间
- Java内存机制
- 【android,19】android照相机、视频录制,开启系统照相机和视频录制
- 硬件设计
- IOS学习笔记 多线程基本理论基础(1)
- 据说,年薪百万的程序员,都是这么开悟的
- android-合并两张图片bitmap
- jquery append加入新元素后事件无效处理方法
- POJ 2635 The Embarrassed Cryptographer
- H264码流中SPS的获取
- 鸟哥私房菜2nd之Linux磁盘与文件系统管理 - 2/3