Android自定义照相机实现(拍照、保存到SD卡,音视频开发工程师需要具备的知识
@author wwj
@date 2013/4/29
*/
public class MainActivity extends Activity {
private View layout;
private Camera camera;
private Camera.Parameters parameters = null;
Bundle bundle = null; // 声明一个Bundle对象,用来存储数据
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 显示界面
setContentView(R.layout.activity_main);
layout = this.findViewById(R.id.buttonLayout);
SurfaceView surfaceView = (SurfaceView) this
.findViewById(R.id.surfaceView);
surfaceView.getHolder()
.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView.getHolder().setFixedSize(176, 144); //设置Surface分辨率
surfaceView.getHolder().setKeepScreenOn(true);// 屏幕常亮
surfaceView.getHolder().addCallback(new SurfaceCallback());//为SurfaceView的句柄添加一个回调函数
}
/**
按钮被点击触发的事件
@param v
*/
public void btnOnclick(View v) {
if (camera != null) {
switch (v.getId()) {
case R.id.takepicture:
// 拍照
camera.takePicture(null, null, new MyPictureCallback());
break;
}
}
}
/**
图片被点击触发的时间
@param v
*/
public void imageClick(View v) {
if (v.getId() == R.id.scalePic) {
if (bundle == null) {
Toast.makeText(getApplicationContext(), R.string.takephoto,
Toast.LENGTH_SHORT).show();
} else {
Intent intent = new Intent(this, ShowPicActivity.class);
intent.putExtras(bundle);
startActivity(intent);
}
}
}
private final class MyPictureCallback implements PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
bundle = new Bundle();
bundle.putByteArray(“bytes”, data); //将图片字节数据保存在bundle当中,实现数据交换
saveToSDCard(data); // 保存图片到sd卡中
Toast.makeText(getApplicationContext(), R.string.success,
Toast.LENGTH_SHORT).show();
camera.startPreview(); // 拍完照后,重新开始预览
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
将拍下来的照片存放在SD卡中
@param data
@throws IOException
*/
public static void saveToSDCard(byte[] data) throws IOException {
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat(“yyyyMMddHHmmss”); // 格式化时间
String filename = format.format(date) + “.jpg”;
File fileFolder = new File(Environment.getExternalStorageDirectory()
- “/finger/”);
if (!fileFolder.exists()) { // 如果目录不存在,则创建一个名为"finger"的目录
fileFolder.mkdir();
}
File jpgFile = new File(fileFolder, filename);
FileOutputStream outputStream = new FileOutputStream(jpgFile); // 文件输出流
outputStream.write(data); // 写入sd卡中
outputStream.close(); // 关闭输出流
}
private final class SurfaceCallback implements Callback {
// 拍照状态变化时调用该方法
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
parameters = camera.getParameters(); // 获取各项参数
parameters.setPictureFormat(PixelFormat.JPEG); // 设置图片格式
parameters.setPreviewSize(width, height); // 设置预览大小
parameters.setPreviewFrameRate(5); //设置每秒显示4帧
parameters.setPictureSize(width, height); // 设置保存的图片尺寸
parameters.setJpegQuality(80); // 设置照片质量
}
// 开始拍照时调用该方法
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open(); // 打开摄像头
camera.setPreviewDisplay(holder); // 设置用于显示拍照影像的SurfaceHolder对象
camera.setDisplayOrientation(getPreviewDegree(MainActivity.this));
camera.startPreview(); // 开始预览
} catch (Exception e) {
e.printStackTrace();
}
}
// 停止拍照时调用该方法
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
camera.release(); // 释放照相机
camera = null;
}
}
}
/**
- 点击手机屏幕是,显示两个按钮
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
layout.setVisibility(ViewGroup.VISIBLE); // 设置视图可见
break;
}
return true;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_CAMERA: // 按下拍照按钮
if (camera != null && event.getRepeatCount() == 0) {
// 拍照
//注:调用takePicture()方法进行拍照是传入了一个PictureCallback对象——当程序获取了拍照所得的图片数据之后
//,PictureCallback对象将会被回调,该对象可以负责对相片进行保存或传入网络
camera.takePicture(null, null, new MyPictureCallback());
}
}
return super.onKeyDown(keyCode, event);
}
// 提供一个静态方法,用于根据手机方向获得相机预览画面旋转的角度
public static int getPreviewDegree(Activity activity) {
// 获得手机的方向
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degree = 0;
// 根据手机的方向计算相机预览画面应该选择的角度
switch (rotation) {
case Surface.ROTATION_0:
degree = 90;
break;
case Surface.ROTATION_90:
degree = 0;
break;
case Surface.ROTATION_180:
degree = 270;
break;
case Surface.ROTATION_270:
degree = 180;
break;
}
return degree;
}
}
用来显示图片的Activity:
package com.wwj.finger;
import android.app.Activity;
如何成为Android高级架构师!
架构师必须具备抽象思维和分析的能力,这是你进行系统分析和系统分解的基本素质。只有具备这样的能力,架构师才能看清系统的整体,掌控全局,这也是架构师大局观的形成基础。 你如何具备这种能力呢?一是来自于经验,二是来自于学习。
架构师不仅要具备在问题领域上的经验,也需要具备在软件工程领域内的经验。也就是说,架构师必须能够准确得理解需求,然后用软件工程的思想,把需求转化和分解成可用计算机语言实现的程度。经验的积累是需要一个时间过程的,这个过程谁也帮不了你,是需要你去经历的。
但是,如果你有意识地去培养,不断吸取前人的经验的话,还是可以缩短这个周期的。这也是我整理架构师进阶此系列的始动力之一。
成为Android架构师必备知识技能
对应导图的学习笔记(由阿里P8大牛手写,我负责整理成PDF笔记)
部分内容展示
《设计思想解读开源框架》
- 目录
- 热修复设计
- 插件化框架设计
《360°全方面性能优化》
- 设计思想与代码质量优化
- 程序性能优化
[外链图片转存中…(img-4vdEMQlt-1645100468746)]
部分内容展示
《设计思想解读开源框架》
- 目录
[外链图片转存中…(img-778NQWqR-1645100468746)] - 热修复设计
[外链图片转存中…(img-e8qj3ySm-1645100468747)] - 插件化框架设计
[外链图片转存中…(img-wjGPx8mz-1645100468747)]
《360°全方面性能优化》
[外链图片转存中…(img-w3tBO5Bi-1645100468748)] - 设计思想与代码质量优化
[外链图片转存中…(img-y1OPQO2P-1645100468748)] - 程序性能优化
[外链图片转存中…(img-NyBd3EPj-1645100468750)]
本文在开源项目:【GitHub 】中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
Android自定义照相机实现(拍照、保存到SD卡,音视频开发工程师需要具备的知识相关推荐
- Android实现下载图片并保存到SD卡中
1.java代码,下载图片的主程序 先实现显示图片,然后点击下载图片按钮,执行下载功能. 从网络上取得的图片,生成Bitmap时有两种方法,一种是先转换为byte[],再生成bitmap:一种是直接用 ...
- Android根据URL下载文件保存到SD卡
//下载具体操作 private void download() { try { URL url = new URL(downloadUrl); //打开连接 URLConnection conn = ...
- Android—将Bitmap图片保存到SD卡目录下或者指定目录
直接上代码就不废话啦 一:保存到SD卡下 [java] view plain copy File file = new File(Environment.getExternalStorageDirec ...
- android把音乐存到sd卡上,如何将音乐文件从原始文件夹保存到SD卡中android
嗨,我需要将音乐文件保存到SD卡我试过使用下面的代码只有文件夹在SD卡中创建的文件夹没有音乐文件保存任何一个建议我在哪里我做了错误...如何将音乐文件从原始文件夹保存到SD卡中android Fill ...
- Android相机、相册获取图片显示并保存到SD卡
如题,这个需求本不是一个很复杂的过程,但是却存在一些隐患,我也是最近在项目中碰到这个问题,将Android通过相机或相册获取图片并最终显示在界面上做了一个小研究,现将一些结果和附上的一个Demo叙述如 ...
- Linux笔记(开机自动将kerne log保存到SD卡中)
有时候为了测试机器的稳定性,需要煲机测试几天的情况,这个时候机器已经封装好,不能再接串口线出来. 为了追溯问题,就需要将log信息保存下来. 于是就需要这样一个功能:系统启动后,自动将kernel的l ...
- Android图片上倒计时,Android自定义照相机倒计时拍照
自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: 两个TextView是用来显示提示信息和倒计时的秒数的 xmlns:tools="http://schemas ...
- Android自定义照相机实现(拍照、保存到SD卡,androidstudio播放音频
界面效果(无法把预览给截屏下来滴): 权限设置少不了: <manifest xmlns:android="http://schemas.android.com/apk/res/andr ...
- Android自定义照相机实现 拍照 录像
文档中的Camera 要使用Camera,首先我们先看一下文档(http://androiddoc.qiniudn.com/reference/android/hardware/Camera.html ...
最新文章
- NSIS 刷新ICO缓存
- 用turtle库画童年的记忆哆啦A梦
- 格式化输出字符串变量
- 乔恩与加菲猫引发的思考
- Python机器学习库sklearn的安装
- tomcat整合apache
- 【js】知乎chrome控制台字符画招聘信息实现
- html表格中插入单行文本框,el-table复选框选中单行或多行点击按钮禁用el-table里面的input输入框该怎么判断?...
- Kotlin学习笔记 第二章 类与对象 第一节类与继承(补)
- anki 新的卡片类型_用 Anki 建立高效复习错题体系
- linux系统装好后优化,CentOS 5.6 Linux安装系统后的基本优化
- Unity零基础到入门 ☀️| 学会这些Unity常用组件,Unity中必备组件技能学习!
- 【读书笔记】你离考研成功就差这本书
- iOS开发之千呼万唤始出来iOS10更新内容以及iOS 10的闪退问题解决
- SQL server和MySQL编号自动生成
- 笔记10.9:硬盘、计算机启动过程、缓冲缓存
- 大疆Onboard SDK 3.2玫瑰线例程浅析
- 上海oracle办公地址_【哪里有学oracle OCP】【上海】
- 小程序公告php实现,小程序两种滚动公告栏的实现方法
- 如何使测试和开发沟通更有效
热门文章
- 一个女孩子做这个不太好,做不长久,特别年龄大了更不好做....
- 在线表单信息收集+word模板展示信息(excel收集信息word打印)Excel一行或者多行信息导入word打印
- html背景图固定,网页背景图片固定在一个位置不重复代码
- Linq to SQL八大子句
- 学习ChatGPT必看 | CSDN精选教程助你轻松掌握神秘黑科技
- STM32 待机模式与看门狗和谐相处
- 融入STEAM教育的劳动技能课程
- Iphone使用mac的无线网热点直接使用(可以用来借用vpn)
- c++ localtime
- Linux考试试卷评讲