怎么用Android Camera实现预览框显示
发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章主要介绍了怎么用Android Camera实现预览框显示的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Android Camera实现预览框显示文章都会有
千家信息网最后更新 2025年02月23日怎么用Android Camera实现预览框显示
这篇文章主要介绍了怎么用Android Camera实现预览框显示的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Android Camera实现预览框显示文章都会有所收获,下面我们一起来看看吧。
Android要预览Camer界面其实非常简单,只需要几句话就行。
1、首先要再AndroidManifest.xml中添加权限
2、创建一个xml包含控件TextureView
比如activity_main.xml:
3、在Activity创建使用Camera
(1)使用Camera.open(0)获取Camera对象
(2)Camera进行参数设置,最后执行camera.startPreview
(3)关闭预览框的时候释放一下对象就行
比如下面的MainActivity.java代码:
package com.lwz.camera;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import androidx.core.app.ActivityCompat;import android.Manifest;import android.content.Context;import android.content.pm.PackageManager;import android.graphics.SurfaceTexture;import android.hardware.Camera;import android.os.Bundle;import android.util.Log;import android.view.Display;import android.view.TextureView;import android.view.View;import android.view.WindowManager;import android.widget.Toast;public class MainActivity extends AppCompatActivity { private static final String TAG = "Camera2Test"; private TextureView mTextureView; //预览框对象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e(TAG, "onCreate!"); setContentView(R.layout.activity_main); intiView(); initEvent(); } private void intiView() { mTextureView = (TextureView) findViewById(R.id.textureView); } private void initEvent() { //预览按钮点击监听 findViewById(R.id.btnStart).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i(TAG, "btnStart!"); startPreview(); } }); //停止预览按钮点击监听 findViewById(R.id.btnStop).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i(TAG, "btnStop!"); stopPreview(); } }); //预览框状态监听 mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surface, int width, int height) { Log.i(TAG, "onSurfaceTextureAvailable width = " + width + ",height = " + height); //当SurefaceTexture可用的时候,可以设置相机参数并打开相机 handleRequestCamera(surface); //handleRequestCamera(mTextureView.getSurfaceTexture()); //如果和mTextureView是同一个类内,效果和上面是一样的 } @Override public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surface, int width, int height) { Log.i(TAG, "onSurfaceTextureSizeChanged width = " + width + ",height = " + height); } @Override public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surface) { Log.i(TAG, "onSurfaceTextureDestroyed!"); return false; } @Override public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surface) { //正常预览的时候,会一直打印 //Log.i(TAG, "onSurfaceTextureUpdated!"); } }); } Camera mCameram; //可以用来对打开的摄像头进行关闭,释放 int mCameraId = 0; private void handleRequestCamera(SurfaceTexture texture) { Log.i(TAG, "handleRequestCamera"); //简单的判断权限 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{"android.permission.CAMERA"}, 100); Log.e(TAG, "openCamera no Permission!"); Toast.makeText(this, "无摄像头权限", Toast.LENGTH_LONG).show(); return; } try { //0/1/2 mCameram = Camera.open(mCameraId);//手机上可以用来切换前后摄像头,不同的设备要看底层支持情况 Log.i(TAG, "handleRequestCamera mCameraId = " + mCameraId); Camera.Parameters parameters = mCameram.getParameters(); parameters.setPreviewSize(720, 1280);// parameters.setPreviewSize(1280, 720);//不同的设备屏幕尺寸不同,有的设备设置错误的尺寸会崩溃 mCameram.setParameters(parameters); mCameram.setPreviewTexture(texture); mCameram.startPreview(); } catch (Exception error) { Log.e(TAG, "handleRequestCamera error = " + error.getMessage()); } } /** * 开始预览 */ private void startPreview() { Log.i(TAG, "startPreview"); SurfaceTexture mSurfaceTexture = mTextureView.getSurfaceTexture(); handleRequestCamera(mSurfaceTexture); } /** * 停止预览 * 根据情况选择是否释放, * 可以stopPreview,停止预览界面,后面用startPreview可以恢复预览界面 */ private void stopPreview() { if (mCameram != null) { mCameram.stopPreview(); mCameram.release(); mCameram = null; } } @Override protected void onDestroy() { super.onDestroy(); stopPreview();//界面退出要释放对象 }}
需要注意的是,调用Camera.open之前,要确保预览框已经准备好了,
即onSurfaceTextureAvailable方法已经回调,正常界面显示的时候,都是没有问题的,
但是如果在代码中,View或者Activity创建的时候调用Camera.open,这时候是无法预览界面的,
如果需要代码多处,调用Camera.open,正常做法可以设置一个全局变量,判断SurfaceTexture是否可用。
关于"怎么用Android Camera实现预览框显示"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"怎么用Android Camera实现预览框显示"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。
界面
时候
对象
不同
代码
摄像头
权限
知识
设备
摄像
监听
内容
参数
尺寸
情况
按钮
相机
篇文章
价值
做法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
2018网络安全宣传周论坛
数据库商业关系导图
出口技术复杂度 国研网数据库
第三届 网络安全
北京环保软件开发
德州苹果软件开发哪家靠谱
连接舌尖安全网的服务器Ip
镇江网络营销软件开发管理方法
南京真诚软件开发
世界风互联网科技有限公司
内存多维数据库
北大互联网彭波数字科技
圣安地列斯服务器怎么说话
TCGA数据库挖掘神器
数据库营销网站哪个好
淮南市华能网络技术有限公司
温江哪里有软件开发的
树叶科技软件开发
互联网软件开发试运行报告
http方法服务器端安全
上海网络技术分类设计
网络安全授权什么意思
无线路由dhcp服务器关闭
深圳pc软件开发公司
企业成功软件开发案例
工业软件开发行业风险
手机ftp服务器搭建
穿越火线选择服务器人数
巴南区网络安全支队
智能化软件开发哪家好