android获取手机摄像头
经过两天的努力终于找到了使用android获取摄像头的方法:
下面就详细介绍一下,获取摄像头的流程: 点击获取源代码
1.第一步,先获取摄像头的权限;
代码如下:(注:如果使用的是android studio的话把代码放到 <manifest>之后<application>之前,不然,会报错,因为获取不到权限)
<uses-permission android:name="android.permission.CAMERA" /><uses-feature android:name="android.hardware.camera" /><uses-feature android:name="android.hardware.camera.autofocus" />
2.创建布局文件:(注:最主要的是创建Surfaceview控件,因为他是用来接收由Camera传回来的数据的)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.xiao.cameratesttwo.MainActivity"><SurfaceViewandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:id="@+id/surfaceview"/><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:orientation="vertical" ><Buttonandroid:id="@+id/btn_qiehua"android:text="切换摄像头"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"/><Buttonandroid:id="@+id/btn_click"android:text="启动摄像头"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="400dp"android:layout_marginLeft="20dp"android:layout_marginRight="20dp"/></LinearLayout></RelativeLayout>
3.编写java代码:(注:要把camera类的open方法放到 try{}catch(){}里面的话需要使用Exception不能使用IOException,会报错)
代码如下:
import android.graphics.ImageFormat;import android.hardware.Camera;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;import android.view.SurfaceHolder;
import android.view.SurfaceView;import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import java.util.Iterator;
import java.util.List;public class MainActivity extends AppCompatActivity implements Camera.PreviewCallback {/*** 定义前后摄像头,0为后摄像头,1为前摄像头*/public int Camerafb =0;/*** 创建Camera对象* 用来获取摄像头*/public Camera camera;/*** 创建surfaceview对象* 这个对象是用来显示从Camera返回的图像的*/private SurfaceView surfaceview;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Window window = getWindow();//得到窗口requestWindowFeature(Window.FEATURE_NO_TITLE);//设置没有标题window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//设置高亮setContentView(R.layout.activity_main);surfaceview = (SurfaceView) findViewById(R.id.surfaceview);//实例化surfaceview对象findViewById(R.id.btn_click).setOnClickListener(new View.OnClickListener() {//创建启动摄像头事件@Overridepublic void onClick(View view) {initcamera();//初始化摄像头,并且把摄像头的图像返回给surfaceview控件}});findViewById(R.id.btn_qiehua).setOnClickListener(new View.OnClickListener() {//创建切换摄像头事件@Overridepublic void onClick(View v) {//如果Camerafb的值为0的话,说明使用的是后置摄像头if(Camerafb ==0){Camerafb=1;//把Camerafb的值改为1,则使用的是前置摄像头initcamera();//初始化摄像头,并且把摄像头的图像返回给surfaceview控件return;//如果Camerafb的值为1的话,说明使用的是前置摄像头}else if(Camerafb ==1) {Camerafb = 0;//把Camerafb的值改为0,则使用的是后置摄像头initcamera();//初始化摄像头,并且把摄像头的图像返回给surfaceview控件return;}else{return;}}});}/*** 初始化摄像头*/public void initcamera(){try {//如果camera中有值的,则清空camera中的数据if(camera !=null){camera.stopPreview();camera.release();camera = null;}camera = Camera.open(Camerafb);//开启摄像头,open中需要赋值,0为后置摄像头,1为前置摄像头Camera.Parameters parameters= camera.getParameters();//从摄像头返回的数据parameters.setPreviewFormat(ImageFormat.NV21);//设置摄像头的预览帧格式camera.setDisplayOrientation(90);//调整相机拍到的图像旋转,不然竖着拿手机,图像是横着的parameters.setRotation(90);//调整的图像旋转,不然竖着拿手机,图像是横着的//获取尺寸的大小List<Camera.Size> sizeList = parameters.getSupportedPictureSizes();if(sizeList.size()>1){Iterator<Camera.Size> itor = sizeList.iterator();while (itor.hasNext()){Camera.Size cur =itor.next();Log.i("jw","val"+cur);}}//设置图像预览的尺寸parameters.setPreviewSize(640, 480);parameters.setPictureSize(640, 480);camera.setParameters(parameters);//设置摄像头需要的数据camera.setPreviewDisplay(surfaceview.getHolder());//使用getHolder方法把数据返回给surfaceviewcamera.setPreviewCallback(this);//摄像头的回调camera.startPreview();//开始预览取景} catch (Exception e) {e.printStackTrace();}}//释放摄像头资源public void destroyCamera(){if(camera==null){return ;}camera.setPreviewCallback(null);camera.stopPreview();camera.release();camera =null;}@Overridepublic void onPreviewFrame(byte[] data, Camera camera) {}@Overrideprotected void onStop() {super.onStop();destroyCamera();}
}
4.效果图如下:
如果有什么不懂的可以来问我。(由于android5.0的ipa上面将来不让使用android.hardware.Camera类,所以我会尽快的分享使用android.hardware.Camera2拍照和录像)
下一篇分享实现用摄像头去拍照录视频。
转载于:https://my.oschina.net/xiaoaimiao/blog/1574143
android获取手机摄像头相关推荐
- Qt for Android获取手机序列号/手机型号/手机制造商
前言 Qt for Android 获取手机型号/手机制造商/手机序列号,这些是要通过 Android 原生接口才能获取到的, 那么在 Qt 项目中通过 jni 接口调用 Android 原生接口来获 ...
- android 获取手机运行的进程
今天,简单讲讲如何获取系统运行的进程. ActivityManager.RunningAppProcessInfo类与获取正在运行的应用程序 每一个应用程序都会运行在它独立的进程里,但是为了节省资源或 ...
- android 获取已安装 错误代码,android获取手机已经安装的app信息
Android获取手机已安装APP(系统/非系统) 效果图 主体代码 private ListView mlistview; private ListpackageInfoList; private ...
- 获取android型号代码,Android应用开发之Android获取手机品牌、手机型号、手机唯一序列号的代码教程...
本文将带你了解Android应用开发Android获取手机品牌.手机型号.手机唯一序列号的代码教程,希望本文对大家学Android有所帮助. Android获取手机品牌.手机型号.手机唯一序列号的代码 ...
- Android获取手机序列号
Android获取手机序列号 String androidId = null; androidId = Secure.getString(getContentResolver(), Secure.AN ...
- Android获取手机的卡槽数量和sim卡数量
Android获取手机的卡槽数量和sim卡数量 获取手机卡槽数量,即手机是单卡槽还是双卡槽的方法: TelephonyManager tm = (TelephonyManager) getSystem ...
- android获取手机sim卡信息,Android获取手机SIM卡运营商信息的方法
本文实例讲述了Android获取手机SIM卡运营商信息的方法,对于Android程序设计有非常实用的价值.分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: /** * 获取SIM卡运营商 ...
- android 通过手机号码查询联系人,android获取手机通讯录联系人
android获取手机通讯录联系人信息 private void getPhoneContacts() { ContentResolver resolver = this.getContentReso ...
- HTML5获取手机摄像头拍照
HTML5获取摄像头进行拍照,存储 徐涛 2017-1-3 <!DOCTYPE html> <html> <head><meta charset=" ...
最新文章
- 移动Sql Server数据库的脚本
- wpf使用入式mysql_使用 WPF 和 MySQL 搭建小型人资管理系统——主要页面
- Vue单页面在ios10系统上出现白屏的bug
- LODOP使用问题解决汇总
- Kibana4简单使用
- css3的新属性 新增的颜色--- 透明度---两种渐变---定义多张背景图--background-size...
- STM32-GPIO的配置和使用
- 商鼎云PC端正式亮相—开启内测通告
- CPLEX运行出错-OPL标记问题
- 处理行标签与行标签中间的空隙
- 云呐|固定资产管理的目的,固定资产管理办法的目的
- 苹果 Apple Beta 版软件计划 相关软件地址
- git diff与linux diff的输出格式之unified format
- PPT导入视频裁剪后,如何裁剪后的视频另存为保存下来?
- centos测试主机网络极限速度
- 【STM32】PWM 输出 (标准库)
- 不同label样本画图——颜色分配plt.cm.Spectral
- 应届生毕业之后先就业还是先择业?
- 想知道什么换发型软件好用吗?
- 汽车零部件行业MES解决方案
热门文章
- tensorflow安装之 nvidia官网下载cuda速度太慢!!!!! 还有 TensorFlow下载速度太慢
- CUDA unknown error - this may be due to an incorrectly set up environment 问题解决
- 北京燕化附中2021年高考成绩查询,2021年北京最好的高中排名,北京重点高中排名榜公布...
- 对三相电桥电路的理解
- 浏览器大战中的搜狗浏览器
- 福利 | CarBlock 开启「区块链+车联网」数据应用新时代
- Sora —— 高性能可编程无线电系统
- 重启IIS某个站点脚本
- 接口中成员变量和成员函数介绍
- Vue实现二选一、菜单更多功能: