Android 照相机的实例应用
时间:2022-07-28
本文章向大家介绍Android 照相机的实例应用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Android 照相机的实例应用
关键技术:
SurfaceHolder.Callback
public class MyCameraDemo extends Activity {
private SurfaceView surface = null ;
private Button but = null ;
private SurfaceHolder holder = null ;
private Camera cam = null ;
private boolean previewRunning = true ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.but = (Button) super.findViewById(R.id.but) ;
this.surface = (SurfaceView) super.findViewById(R.id.surface) ;
this.holder = this.surface.getHolder() ;
this.holder.addCallback(new MySurfaceViewCallback()) ;
//设置缓冲类型
this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) ;
//设置分辨率
this.holder.setFixedSize(600, 350);
this.but.setOnClickListener(new OnClickListenerImpl()) ;
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
if(MyCameraDemo.this.cam != null) {
//自动对焦
MyCameraDemo.this.cam.autoFocus(new AutoFocusCallbackImpl()) ;
}
}
}
private class MySurfaceViewCallback implements SurfaceHolder.Callback {
//当预览界面格式大小改变时,调用
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
//初次实例化界面调用
public void surfaceCreated(SurfaceHolder holder) {
MyCameraDemo.this.cam = Camera.open(0) ; // 取得第一个摄像头
//窗口服务
WindowManager manager = (WindowManager) MyCameraDemo.this
.getSystemService(Context.WINDOW_SERVICE);
//取得display显示对象
Display display = manager.getDefaultDisplay() ;
//照相机参数
Parameters param = MyCameraDemo.this.cam.getParameters() ;
//将照相机预览大小设置为display大小
param.setPreviewSize(display.getWidth(), display.getHeight()) ;
param.setPreviewFrameRate(5) ; // 一秒5帧
param.setPictureFormat(PixelFormat.JPEG) ; // 图片形式
param.set("jpen-quality", 80) ;//图片质量,最高100
MyCameraDemo.this.cam.setParameters(param) ;
try {
MyCameraDemo.this.cam.setPreviewDisplay(MyCameraDemo.this.holder) ;
} catch (IOException e) {
}
MyCameraDemo.this.cam.startPreview() ; // 进行预览
MyCameraDemo.this.previewRunning = true ; // 已经开始预览
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(MyCameraDemo.this.cam != null) {
if(MyCameraDemo.this.previewRunning) {
MyCameraDemo.this.cam.stopPreview() ; // 停止预览
MyCameraDemo.this.previewRunning = false ;
}
MyCameraDemo.this.cam.release() ;
}
}
}
private class AutoFocusCallbackImpl implements AutoFocusCallback {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if(success) { // 成功
MyCameraDemo.this.cam.takePicture(sc, pc, jpgcall) ;
}
}
}
private PictureCallback jpgcall = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) { // 保存图片的操作
Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
String fileName = Environment.getExternalStorageDirectory()
.toString()
+ File.separator
+ "mldnphoto"
+ File.separator
+ "MLDN_" + System.currentTimeMillis() + ".jpg";
File file = new File(fileName) ;
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs() ; // 创建文件夹
}
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)) ;
bmp.compress(Bitmap.CompressFormat.JPEG, 80, bos) ; // 向缓冲区之中压缩图片
bos.flush() ;
bos.close() ;
Toast.makeText(MyCameraDemo.this,
"拍照成功,照片已保存在" + fileName + "文件之中!", Toast.LENGTH_SHORT)
.show();
} catch (Exception e) {
Toast.makeText(MyCameraDemo.this,
"拍照失败!", Toast.LENGTH_SHORT)
.show();
}
MyCameraDemo.this.cam.stopPreview() ;
MyCameraDemo.this.cam.startPreview() ;
}
} ;
private ShutterCallback sc = new ShutterCallback(){
@Override
public void onShutter() {
// 按下快门之后进行的操作
}
} ;
private PictureCallback pc = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
}
} ;
}
主布局函数
<?xml version="1.0" encoding="utf-8"?
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
<Button
android:id="@+id/but"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="照相" /
<SurfaceView
android:id="@+id/surface"
android:layout_width="fill_parent"
android:layout_height="fill_parent" /
</LinearLayout
以上就是Android 相机的使用方法,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
- Numpy 修炼之道 (8)—— 常用函数
- Numpy 修炼之道 (7)—— 形状操作
- 洛谷P3391 【模板】文艺平衡树(Splay)(FHQ Treap)
- 12.python进程协程异步IO
- POJ3622 Gourmet Grazers(FHQ Treap)
- 洛谷P3201 [HNOI2009]梦幻布丁
- 洛谷P3374 【模板】树状数组 1(CDQ分治)
- 自然语言处理基础知识1. 分词(Word Cut)2. 词性标注(POS Tag)3.自动标注4.文本分类5.评估6.从文本提取信息7.分析句子结构《python自然语言处理》各章总结:
- 洛谷P3384 【模板】树链剖分
- 洛谷P2147 [SDOI2008]Cave 洞穴勘测
- linux基础
- 洛谷P3178 [HAOI2015]树上操作
- Numpy 修炼之道 (6)—— 复制和视图
- 事务日志已满,原因为“ACTIVE_TRANSACTION”
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Android 多线程的实现方法总结
- Android编程之SQLite数据库操作方法详解
- 浅谈android组件化之ARouter简单使用
- Android ScrollView实现下拉弹回动画效果
- Android实现用文字生成图片的示例代码
- Android bindservice失败解决方法
- Android 悬浮窗权限各机型各系统适配大全(总结)
- Android中Fragment相互切换间不被回收的实现方法
- Android手机管理工具类详解
- 通过代码学Sutton强化学习第四章动态规划
- android通过okhttpClient下载网页内容的实例代码
- Android自定义键盘的实现(数字键盘和字母键盘)
- Android iconify 使用详解
- XRecyclerView实现下拉刷新、滚动到底部加载更多等功能
- 浅析Android 快速实现图片压缩与上传功能