android中用Camera来调用摄像头,只能用takePicture来拍照吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android中用Camera来调用摄像头,只能用takePicture来拍照吗?相关的知识,希望对你有一定的参考价值。
参考技术Aandroid中用Camera来调用摄像头,只能用takePicture来拍照吗?
代码与范例:
首先需要在Manifest文件中添加以下内容:
以使程序获取摄像头使用以及自动对焦功能的使用权限。
CameraTestActivity.java
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
public class CameraTestActivity extends Activity
@Override
public void onCreate(Bundle bundle)
super.onCreate(bundle);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE); 设置横屏模式以及全屏模式
setContentView(new CameraView(this)); 设置View
CameraView.java
import java.io.FileOutputStream;
import android.content.Context;
import android.hardware.Camera;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class CameraView extends SurfaceView implements SurfaceHolder.Callback, Camera.PictureCallback
private SurfaceHolder holder;
private Camera camera;
private boolean af;
public CameraView(Context context) 构造函数
super(context);
holder = getHolder();生成Surface Holder
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);指定Push Buffer
public void surfaceCreated(SurfaceHolder holder) Surface生成事件的处理
try
camera = Camera.open();摄像头的初始化
camera.setPreviewDisplay(holder);
catch (Exception e)
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) Surface改变事件的处理
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(width, height);
camera.setParameters(parameters);设置参数
camera.startPreview();开始预览
public void surfaceDestroyed(SurfaceHolder holder) Surface销毁时的处理
camera.setPreviewCallback(null);
camera.sPreview();
camera.release();
camera =null;
@Override
public boolean onTouchEvent(MotionEvent event) 屏幕触摸事件
if (event.getAction() == MotionEvent.ACTION_DOWN) 按下时自动对焦
camera.autoFocus(null);
af =true;
if (event.getAction() == MotionEvent.ACTION_UP && af ==true) 放开后拍照
camera.takePicture(null, null, this);
af =false;
returntrue;
public void onPictureTaken(byte[] data, Camera camera) 拍摄完成后保存照片
try
String path = Environment.getExternalStorageDirectory() +"/test.jpg";
data2file(data, path);
catch (Exception e)
camera.startPreview();
private void data2file(byte[] w, String fileName) throws Exception 将二进制数据转换为文件的函数
FileOutputStream out =null;
try
out =new FileOutputStream(fileName);
out.write(w);
out.close();
catch (Exception e)
if (out !=null)
out.close();
throw e;
如何调用android 摄像头 拍照
在Android开发过程中,有时需要调用手机自身设备的功能,本文侧重摄像头拍照功能的调用。
:blog.csdn./mahoking/article/details/28225907
怎么调用android的摄像头拍照
我们要调用摄像头的拍照功能,显然
第一步必须加入调用摄像头硬件的权限,拍完照后我们要将图片保存在SD卡中,必须加入SD卡读写权限,所以第一步,我们应该在Android清单文件中加入以下代码
<uses-permission android:name="android.permission.CAMERA"/>摄像头权限
SD卡读写权限
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
第二步,要将摄像头捕获的图像实时地显示在手机上。
我们是用SurfaceView这个视图组件来实现的,因此在main.xml中加入下列代码
<SurfaceView
android:layout_
android:layout_
android:id="@+id/surfaceview"
/>
第三步,设置窗口的显示方式
首先获得当前窗口Windowwindow = 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.main);
第四步,设置SurficeView显示控件的属性
找到surficeView
surfaceView = (SurfaceView)findViewById(R.id.surfaceview);
设置它的像素为800x600
surfaceView.getHolder().setFixedSize(800,480);
下面设置surfaceView不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
第五步,就是为surficeView加入回调方法(callBack)
surfaceView.getHolder().addCallback(newSurfaceCallback());
上面的回调类是我们自己定义的,代码如下
private class SurfaceCallback implementsSurfaceHolder.Callback
@Override
public void surfaceCreated(SurfaceHolderholder)
try
camera = Camera.open();打开硬件摄像头,这里导包得时候一定要注意是android.hardware.Camera
WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);得到窗口管理器
Display display = wm.getDefaultDisplay();得到当前屏幕
Camera.Parameters parameters =camera.getParameters();得到摄像头的参数
parameters.setPreviewSize(display.getWidth(),display.getHeight());设置预览照片的大小
parameters.setPreviewFrameRate(3);设置每秒3帧
parameters.setPictureFormat(PixelFormat.JPEG);设置照片的格式
parameters.setJpegQuality(85);设置照片的质量
parameters.setPictureSize(display.getHeight(),display.getWidth());设置照片的大小,默认是和屏幕一样大
camera.setParameters(parameters);
camera.setPreviewDisplay(surfaceView.getHolder());通过SurfaceView显示取景画面
camera.startPreview();开始预览
isPreview = true;设置是否预览参数为真
catch (IOException e)
Log.e(TAG, e.toString());
@Override
public void surfaceChanged(SurfaceHolderholder, int format, int width,
int height)
TODO Auto-generated method stub
@Override
public void surfaceDestroyed(SurfaceHolderholder)
if(camera!=null)
if(isPreview)如果正在预览
camera.sPreview();
camera.release();
第六步,我们必须对按键事件进行监听,如是拍照还是聚焦,代码如下
public boolean onKeyDown(int keyCode,KeyEvent event) 处理按键事件
if(camera!=null&&event.getRepeatCount()==0)代表只按了一下
switch(keyCode)
case KeyEvent.KEYCODE_BACK:如果是搜索键
camera.autoFocus(null);自动对焦
break;
case KeyEvent.KEYCODE_DPAD_CENTER:如果是中间键
camera.takePicture(null, null, new TakePictureCallback());将拍到的照片给第三个对象中,这里的TakePictureCallback()是自己定义的,在下面的代码中
break;
return true;阻止事件往下传递,否则按搜索键会变成系统默认的
------------------------------------------------------------------------------------------
private final class TakePictureCallbackimplements PictureCallback
public void onPictureTaken(byte[] data,Camera camera)
try
Bitmap bitmap =BitmapFactory.decodeByteArray(data, 0, data.length);
File file = newFile(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
FileOutputStream outputStream = newFileOutputStream(file);
bitmap.press(CompressFormat.JPEG, 100,outputStream);
outputStream.close();
camera.sPreview();
camera.startPreview();处理完数据之后可以预览
catch (Exception e)
Log.e(TAG, e.toString());
注意,代码中有两个回调类,一个是SurfaceCallback(),另外一个是TakePictureCallback(),初学者可能一时难以理解,通俗地讲,前者是用来监视surficeView这个暂时存放图片数据的显示控件的,根据它的显示情况调用不同的方法,包括surfaceCreated(),surfaceChanged(),surfaceDestroyed(),也就不难理解为什么会有这三个回调方法了(注意,在surfaceDestroyed()方法中必须释放摄像头,详细代码参见上方)。TakePictureCallback()是为了监视是否拍照而设计的接口,期中也仅有一个方法,camera将拍照得到的数据传入方法,我们便可以对拍照得到的数据进行进一步处理
vivoxplay只能用前置摄像头,不能用主摄像头
您好!
不能使用主摄像头提示什么呢,请你具体描述一下,以便我们更好的为您解答。
如果有任何问题可以随时来咨询我们的。非常感谢您对我们vivo的支持,祝您生活愉快!
PC camera 摄像头只能用光盘驱动吗?
有的不带盘的摄像头是免驱的,只要XP_SP2就会自认,另外你可以搜搜PC-CAMERA的万能驱动,不行的话还是老实点用盘装
联想A798T拍照怎么只能用前置摄像头呢/如何双摄像头切换
刷机包有问题,你先下载个别的相机看看能不能切换摄像头,或是有没有相关的相机补丁,不行的话你再刷回来就好了。
尊贵的用户,您好:
很抱歉给您带来疑惑了。若您需要切换前后置摄像头,可进入主菜单--相机--点击“+”后面的小相机图标即可切换,请您尝试。
若如果您尝试,没有该切换图标,建议到系统设置--应用程序--拍照--清除数据后试试,同时您也可以下载第三方拍照软件进行尝试,若使用第三方软件也会出现该情况,建议您备份下资料,恢复出厂设置后进行尝试,若依然不行,可抽空带上保修卡或发票联系当地的维修站点检测处理。
官网授权维修站点查询::support1.lenovo../lenovo/wsi/station/servicestation。
感谢您对联想的支持,祝您生活愉快!
求助关于java调用摄像头拍照怎样禁止虚拟摄像头拍照
这个问题和java语言本身没啥关系。首先看你是用什么读取的摄像头来获得照片。
比如说你用flash来读取摄像头获得照片,那么有相关的api获得摄像头列表(此时的摄像头列表是全部的,包括虚拟摄像头的)
但是,你可以读取本地真实的摄像头(bs模式请用ocs控件读取,读取方式参照System.ManagementObject),然后比较真实的摄像头和现在正在拍照使用的摄像头即可。
真实实践过 望采纳。
win7上怎么调用摄像头拍照
打开“我的电脑”
下面应该有个“扫描仪和照相机”
打开你的照相机就可以拍照了
你好,我的手机拍照不知道怎么了,只能用前摄像头,后摄像头不能用,
你可以把手机重启一下试试。
或者你可以从应用宝里面下载个第三方拍照软件。然后拍照看看怎么样。
或者你恢复出厂设置。应该会好很多的。也有可能是你摄像损毁了。
Android应用开发提高篇-----Camera使用
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/06/2382679.html
一、概述
Camera是手机的一个很重要的设备,可以说现在的每一部手机上都有。回想当时在Linux搞摄像头编程真的要捏一把汗。有人会说在Linux下装个opencv就可以通过它的函数来使用摄像头啦,但我并没有这么做,我还是用最原始的方法(V4L2)实现了。之前研究过Android关于摄像头这部分的源码,毫无疑问,Android关于摄像头底层的实现用的也是V4L2。
二、实现
新建工程MyCamera,修改/res/layout/main.xml文件,使用RelativeLayout布局,并添加一个SurfaceView和一个Button,完整的main.xml如下:
1 <?xml version="1.0" encoding="utf-8"?>
2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical"
6 >
7
8 <SurfaceView
9 android:id="@+id/surfaceview"
10 android:layout_width="fill_parent"
11 android:layout_height="wrap_content"
12 android:layout_alignParentTop="true"
13 android:layout_above="@+id/button"
14 />
15
16 <Button
17 android:id="@+id/button"
18 android:layout_width="fill_parent"
19 android:layout_height="wrap_content"
20 android:layout_alignParentBottom="true"
21 android:text="拍照"
22 />
23
24 </RelativeLayout>
接着,修改MyCameraActivity.java文件,实现了SurfaceHolder.Callback接口,用于初始化、释放摄像头和Camera.PictureCallback接口,用于保存图片数据到文件里。完整的内容如下:
1 package com.nan.camera;
2
3 import java.io.File;
4 import java.io.FileNotFoundException;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
7
8 import android.app.Activity;
9 import android.graphics.Bitmap;
10 import android.graphics.BitmapFactory;
11 import android.graphics.PixelFormat;
12 import android.hardware.Camera;
13 import android.os.Bundle;
14 import android.os.Environment;
15 import android.view.SurfaceHolder;
16 import android.view.SurfaceView;
17 import android.view.View;
18 import android.widget.Button;
19 import android.widget.Toast;
20
21 public class MyCameraActivity extends Activity
22 {
23 private SurfaceView mSurfaceView = null;
24 private SurfaceHolder mSurfaceHolder = null;
25 private Button takePictureButton = null;
26 private Camera mCamera;
27 //记录保存的是第几张图片
28 private int whichPicture = 0;
29
30 /** Called when the activity is first created. */
31 @Override
32 public void onCreate(Bundle savedInstanceState)
33 {
34 super.onCreate(savedInstanceState);
35 setContentView(R.layout.main);
36
37 takePictureButton = (Button)this.findViewById(R.id.button);
38 mSurfaceView = (SurfaceView)this.findViewById(R.id.surfaceview);
39 mSurfaceHolder = mSurfaceView.getHolder();
40 mSurfaceHolder.addCallback(new SurfaceHolderCallback());
41 //设置缓冲区类型
42 mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
43 //拍照按钮监听
44 takePictureButton.setOnClickListener(new View.OnClickListener()
45 {
46
47 @Override
48 public void onClick(View v)
49 {
50 // TODO Auto-generated method stub
51 //拍照
52 mCamera.takePicture(null, null, pictureCallback);
53 }
54 });
55
56 }
57
58 private class SurfaceHolderCallback implements SurfaceHolder.Callback
59 {
60
61 @Override
62 public void surfaceChanged(SurfaceHolder holder, int format, int width,
63 int height) {
64 // TODO Auto-generated method stub
65
66 }
67
68 @Override
69 public void surfaceCreated(SurfaceHolder holder)
70 {
71 // TODO Auto-generated method stub
72 //打开摄像头
73 mCamera = Camera.open();
74 try {
75 mCamera.setPreviewDisplay(mSurfaceHolder);
76 } catch (IOException e) {
77 // TODO Auto-generated catch block
78 e.printStackTrace();
79 }
80 //获取摄像头参数
81 Camera.Parameters mParameters = mCamera.getParameters();
82 //设置图片格式
83 mParameters.setPictureFormat(PixelFormat.JPEG);
84 mCamera.setParameters(mParameters);
85 //开始预览
86 mCamera.startPreview();
87 }
88
89 @Override
90 public void surfaceDestroyed(SurfaceHolder holder)
91 {
92 // TODO Auto-generated method stub
93 if(mCamera!=null)
94 {
95 //停止预览
96 mCamera.stopPreview();
97 //释放摄像头
98 mCamera.release();
99 mCamera = null;
100 }
101 }
102
103 }
104
105 //拍照回调
106 private Camera.PictureCallback pictureCallback = new Camera.PictureCallback()
107 {
108
109 @Override
110 public void onPictureTaken(byte[] data, Camera camera)
111 {
112 // TODO Auto-generated method stub
113 //停止预览
114 mCamera.stopPreview();
115 Bitmap mBitmap;
116 mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
117 //文件路径和文件名
118 File pictureFile = new File(Environment.getExternalStorageDirectory(),"camera"+Integer.toString(whichPicture)+".jpg");
119
120 try
121 {
122 FileOutputStream mFileOutputStream = new FileOutputStream(pictureFile);
123 //将图像数据压入文件
124 mBitmap.compress(Bitmap.CompressFormat.JPEG, 75, mFileOutputStream);
125 try {
126 //关闭输出流
127 mFileOutputStream.close();
128 } catch (IOException e) {
129 // TODO Auto-generated catch block
130 e.printStackTrace();
131 }
132 }
133 catch (FileNotFoundException e)
134 {
135 // TODO Auto-generated catch block
136 e.printStackTrace();
137 }
138 displayToast("保存成功!");
139 whichPicture++;
140 //开始预览
141 mCamera.startPreview();
142 }
143
144 };
145
146 //显示Toast函数
147 private void displayToast(String s)
148 {
149 Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
150 }
151
152 }
在真机上运行该程序:
按一下“拍照”按钮:
图片会被保存到sd卡的根目录下面。
以上是关于android中用Camera来调用摄像头,只能用takePicture来拍照吗?的主要内容,如果未能解决你的问题,请参考以下文章