Android相机Camera基础知识
发布时间 - 2026-01-10 22:45:39 点击率:次一、概述
本章节主要讲述的Android相机Camera的相关知识点,主要包含三个方面,Android启动系统相机生成缩略图、Android启动系统相机生成原图以及Android自定义相机等。

二、Android启动系统相机
核心代码:
package com.czhappy.camerademo.activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import com.czhappy.camerademo.R;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private static int REQ_1 = 1;
private static int REQ_2 = 2;
private ImageView image_iv;
private String mFilePath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image_iv = (ImageView) findViewById(R.id.image_iv);
mFilePath = Environment.getExternalStorageDirectory().getPath();
mFilePath = mFilePath +"/" + System.currentTimeMillis()+".jpg";
}
public void startCamera1(View view){
//隐式Intent调用
Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(it, REQ_1);
}
public void startCamera2(View view){
//隐式Intent调用
Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri photoUri = Uri.fromFile(new File(mFilePath));
it.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(it, REQ_2);
}
public void customCamera(View view){
Intent it = new Intent(MainActivity.this, CustomCameraActivity.class);
startActivity(it);
}
/**
*
* @param requestCode
* @param resultCode
* @param data //缩略图
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
if(requestCode == REQ_1){//缩略图
Bundle bundle = data.getExtras();
Bitmap bmp = (Bitmap) bundle.get("data");
image_iv.setImageBitmap(bmp);
}else if(requestCode == REQ_2){//原图
FileInputStream fis = null;
try {
fis = new FileInputStream(mFilePath);
Bitmap bitmap = BitmapFactory.decodeStream(fis);
image_iv.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
三、Android自定义相机
1.自定义相机步骤:
创建相机
创建SurfaceView
关联相机与SurfaceView
调整相机显示效果
自定义相机预览界面
2.核心代码:
自定义相机CustomCameraActivity.java
package com.czhappy.camerademo.activity;
import android.content.Intent;
import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import com.czhappy.camerademo.R;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* Description:
* User: chenzheng
* Date: 2016/12/27 0027
* Time: 13:43
*/
public class CustomCameraActivity extends AppCompatActivity implements SurfaceHolder.Callback{
private SurfaceView mPreview;
private Camera mCamera;
private SurfaceHolder mHolder;
private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
File tempFile = new File("/sdcard/temp.png");
try {
FileOutputStream fos = new FileOutputStream(tempFile);
fos.write(data);
fos.close();
Intent it = new Intent(CustomCameraActivity.this, CaptureResultActivity.class);
it.putExtra("picPath", tempFile.getAbsolutePath());
startActivity(it);
finish();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom_camera);
mPreview = (SurfaceView) this.findViewById(R.id.preview);
mHolder = mPreview.getHolder();
mHolder.addCallback(this);
//点击自动对焦
mPreview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCamera.autoFocus(null);;
}
});
}
/**
* 拍照
* @param view
*/
public void capture(View view){
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPictureFormat(ImageFormat.JPEG);
parameters.setPictureSize(800,400);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);//自动对焦
mCamera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
//对焦准确拍摄照片
if(success){
mCamera.takePicture(null, null, mPictureCallback);
}
}
});
}
/**
* 获取相机对象
* @return
*/
private Camera getCamera(){
mCamera = Camera.open();
return mCamera;
}
/**
* 开始预览相机内容
*/
private void setStartPreview(Camera camera, SurfaceHolder holder){
try {
camera.setPreviewDisplay(holder);
camera.setDisplayOrientation(90);//设置相机预览为竖屏90度
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 释放相机资源
*/
private void releaseCamera(){
if(mCamera!=null){
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
@Override
protected void onResume() {
super.onResume();
if (mCamera==null){
mCamera = getCamera();
if(mHolder!=null){
setStartPreview(mCamera, mHolder);
}
}
}
@Override
protected void onPause() {
super.onPause();
releaseCamera();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
setStartPreview(mCamera, mHolder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
mCamera.stopPreview();
setStartPreview(mCamera, mHolder);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();
}
}
生成图片结果页面CaptureResultActivity.java
package com.czhappy.camerademo.activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import com.czhappy.camerademo.R;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* Description:
* User: chenzheng
* Date: 2016/12/30 0030
* Time: 13:27
*/
public class CaptureResultActivity extends AppCompatActivity {
private String picPath;
private ImageView result_iv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_capture_result);
picPath = getIntent().getStringExtra("picPath");
result_iv = (ImageView) findViewById(R.id.result_iv);
try {
FileInputStream fis = new FileInputStream(picPath);
Bitmap bitmap = BitmapFactory.decodeStream(fis);
Matrix matrix = new Matrix();
matrix.setRotate(90);//旋转90度矩阵
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
result_iv.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
四、项目源代码下载
http://xiazai./201701/yuanma/AndroidCamera().rar
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# 相机
# Camera
# Android自定义组件获取本地图片和相机拍照图片
# Android CameraX结合LibYUV和GPUImage自定义相机滤镜
# Android自定义相机Camera实现手动对焦的方法示例
# Android 用 camera2 API 自定义相机
# Android camera2 判断相机功能是否可控的实例
# Android自定义照相机Camera出现黑屏的解决方法
# Android Camera开发实现可复用的相机组件
# 自定义
# 自动对焦
# 隐式
# 对焦
# 三个方面
# 大家多多
# 显示效果
# 源代码下载
# strong
# ACTION_IMAGE_CAPTURE
# System
# currentTimeMillis
# jpg
# fromFile
# putExtra
# EXTRA_OUTPUT
# startActivityForResult
# photoUri
# super
# setContentView
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
Laravel如何自定义错误页面(404, 500)?(代码示例)
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
如何挑选最适合建站的高性能VPS主机?
如何快速搭建高效WAP手机网站吸引移动用户?
b2c电商网站制作流程,b2c水平综合的电商平台?
如何用AWS免费套餐快速搭建高效网站?
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
如何快速搭建FTP站点实现文件共享?
如何在建站之星绑定自定义域名?
高端建站三要素:定制模板、企业官网与响应式设计优化
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
如何在阿里云服务器自主搭建网站?
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
利用JavaScript实现拖拽改变元素大小
java获取注册ip实例
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
高防服务器如何保障网站安全无虞?
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
Laravel Session怎么存储_Laravel Session驱动配置详解
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
Laravel Fortify是什么,和Jetstream有什么关系
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
如何快速上传建站程序避免常见错误?
如何实现建站之星域名转发设置?
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
实现点击下箭头变上箭头来回切换的两种方法【推荐】
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
Laravel如何使用Gate和Policy进行授权?(权限控制)
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
文字头像制作网站推荐软件,醒图能自动配文字吗?
iOS发送验证码倒计时应用
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
西安专业网站制作公司有哪些,陕西省建行官方网站?
JavaScript模板引擎Template.js使用详解
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
专业商城网站制作公司有哪些,pi商城官网是哪个?
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
零基础网站服务器架设实战:轻量应用与域名解析配置指南
Laravel如何与Pusher实现实时通信?(WebSocket示例)

