经过两天的努力终于找到了使用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获取手机摄像头相关推荐

  1. Qt for Android获取手机序列号/手机型号/手机制造商

    前言 Qt for Android 获取手机型号/手机制造商/手机序列号,这些是要通过 Android 原生接口才能获取到的, 那么在 Qt 项目中通过 jni 接口调用 Android 原生接口来获 ...

  2. android 获取手机运行的进程

    今天,简单讲讲如何获取系统运行的进程. ActivityManager.RunningAppProcessInfo类与获取正在运行的应用程序 每一个应用程序都会运行在它独立的进程里,但是为了节省资源或 ...

  3. android 获取已安装 错误代码,android获取手机已经安装的app信息

    Android获取手机已安装APP(系统/非系统) 效果图 主体代码 private ListView mlistview; private ListpackageInfoList; private ...

  4. 获取android型号代码,Android应用开发之Android获取手机品牌、手机型号、手机唯一序列号的代码教程...

    本文将带你了解Android应用开发Android获取手机品牌.手机型号.手机唯一序列号的代码教程,希望本文对大家学Android有所帮助. Android获取手机品牌.手机型号.手机唯一序列号的代码 ...

  5. Android获取手机序列号

    Android获取手机序列号 String androidId = null; androidId = Secure.getString(getContentResolver(), Secure.AN ...

  6. Android获取手机的卡槽数量和sim卡数量

    Android获取手机的卡槽数量和sim卡数量 获取手机卡槽数量,即手机是单卡槽还是双卡槽的方法: TelephonyManager tm = (TelephonyManager) getSystem ...

  7. android获取手机sim卡信息,Android获取手机SIM卡运营商信息的方法

    本文实例讲述了Android获取手机SIM卡运营商信息的方法,对于Android程序设计有非常实用的价值.分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: /** * 获取SIM卡运营商 ...

  8. android 通过手机号码查询联系人,android获取手机通讯录联系人

    android获取手机通讯录联系人信息 private void getPhoneContacts() { ContentResolver resolver = this.getContentReso ...

  9. HTML5获取手机摄像头拍照

    HTML5获取摄像头进行拍照,存储 徐涛 2017-1-3 <!DOCTYPE html> <html> <head><meta charset=" ...

最新文章

  1. 移动Sql Server数据库的脚本
  2. wpf使用入式mysql_使用 WPF 和 MySQL 搭建小型人资管理系统——主要页面
  3. Vue单页面在ios10系统上出现白屏的bug
  4. LODOP使用问题解决汇总
  5. Kibana4简单使用
  6. css3的新属性 新增的颜色--- 透明度---两种渐变---定义多张背景图--background-size...
  7. STM32-GPIO的配置和使用
  8. 商鼎云PC端正式亮相—开启内测通告
  9. CPLEX运行出错-OPL标记问题
  10. 处理行标签与行标签中间的空隙
  11. 云呐|固定资产管理的目的,固定资产管理办法的目的
  12. 苹果 Apple Beta 版软件计划 相关软件地址
  13. git diff与linux diff的输出格式之unified format
  14. PPT导入视频裁剪后,如何裁剪后的视频另存为保存下来?
  15. centos测试主机网络极限速度
  16. 【STM32】PWM 输出 (标准库)
  17. 不同label样本画图——颜色分配plt.cm.Spectral
  18. 应届生毕业之后先就业还是先择业?
  19. 想知道什么换发型软件好用吗?
  20. 汽车零部件行业MES解决方案

热门文章

  1. tensorflow安装之 nvidia官网下载cuda速度太慢!!!!! 还有 TensorFlow下载速度太慢
  2. CUDA unknown error - this may be due to an incorrectly set up environment 问题解决
  3. 北京燕化附中2021年高考成绩查询,2021年北京最好的高中排名,北京重点高中排名榜公布...
  4. 对三相电桥电路的理解
  5. 浏览器大战中的搜狗浏览器
  6. 福利 | CarBlock 开启「区块链+车联网」数据应用新时代
  7. Sora —— 高性能可编程无线电系统
  8. 重启IIS某个站点脚本
  9. 接口中成员变量和成员函数介绍
  10. Vue实现二选一、菜单更多功能: