别人可以随便控制你手机把手机opencv控制摄像头拍照你在发过去

手机前置摄像头是否能被他人监控? - 知乎9被浏览14810分享邀请回答22 条评论分享收藏感谢收起21 条评论分享收藏感谢收起查看更多回答Android开发之控制摄像头拍照
现在的手机一般都会提供相机功能,有些相机的镜头甚至支持1300万以上像素,有些甚至支持独立对焦、光学变焦这些只有单反才有的功能,甚至有些手机直接宣传可以拍到星星。可以说手机已经变成了专业数码相机。为了充分利用手机上的相机功能, 提供了Camera类来控制相机拍照。现在就让我们看一下如果使用Camera类来控制手机拍照。
使用Camera控制手机拍照的步骤如下:
1) 调用Camera的open()方法打开相机。该方法默认打开后置摄像头。如果需要打开指定摄像头,可以为该方法传入摄像头ID。
2) 调用Camera的getParameters()方法获取拍照参数。该方法返回一个 Camera.Parameters 对象。
3) 调用Camera.Parameters对象方法设置拍照参数。
4) 调用Camera的startPreview()方法开始预览取景,在预览取景之前需要调用Camera 的 setPreviewDisplay(SurfaceHolder holder)方法设置使用哪个Surface View 来显示取景照片。
5) 调用Camera的takePicture()方法进行拍照。
6) 结束程序时,调用Camera的stopPreview()结束取景预览,并调用release()方法释放资源。
应用实例:拍照时自动对焦
下面的实例示范了使用Camera来进行拍照、当用户按下拍照键时,该应用会自动对焦,当对焦成功时拍下照片。该程序的界面中只提供了一个SurfaceView来显示预览取景,十分简单。该程序代码如下:
package com.jph.
import java.io.F
import java.io.FileOutputS
import java.io.IOE
import java.text.SimpleDateF
import java.util.D
import java.util.L
import android.app.A
import android.graphics.B
import android.pressF
import android.graphics.BitmapF
import android.graphics.ImageF
import android.hardware.C
import android.hardware.Camera.AutoFocusC
import android.hardware.Camera.PictureC
import android.hardware.Camera.ShutterC
import android.os.B
import android.os.E
import android.util.DisplayM
import android.view.D
import android.view.SurfaceH
import android.view.SurfaceHolder.C
import android.view.SurfaceV
import android.view.V
import android.view.W
import android.view.WindowM
import android.widget.EditT
import android.widget.ImageV
import android.widget.T
* 控制手机拍照
* @author jph
public class CaptureImage extends Activity
SurfaceView sV
SurfaceHolder surfaceH
int screenWidth, screenH
// 定义系统所用的照相机
// 是否在预览中
boolean isPreview =
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
// 设置全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
// 获取窗口管理器
WindowManager wm = getWindowManager();
Display display = wm.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
// 获取屏幕的宽和高
display.getMetrics(metrics);
screenWidth = metrics.widthP
screenHeight = metrics.heightP
// 获取界面中SurfaceView
sView = (SurfaceView) findViewById(R.id.sView);
// 获得SurfaceView的SurfaceHolder
surfaceHolder = sView.getHolder();
// 为surfaceHolder添加一个回调监听器
surfaceHolder.addCallback(new Callback()
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height)
public void surfaceCreated(SurfaceHolder holder)
// 打开摄像头
initCamera();
public void surfaceDestroyed(SurfaceHolder holder)
// 如果camera不为null ,释放摄像头
if (camera != null)
if (isPreview) camera.stopPreview();
camera.release();
private void initCamera()
if (!isPreview)
// 此处默认打开后置摄像头。
// 通过传入参数可以打开前置摄像头
camera = Camera.open(0);
camera.setDisplayOrientation(90);
if (camera != null && !isPreview)
Camera.Parameters parameters = camera.getParameters();
// 设置预览照片的大小
parameters.setPreviewSize(screenWidth, screenHeight);
// 设置预览照片时每秒显示多少帧的最小值和最大值
parameters.setPreviewFpsRange(4, 10);
// 设置图片格式
parameters.setPictureFormat(ImageFormat.JPEG);
// 设置JPG照片的质量
parameters.set("jpeg-quality", 85);
// 设置照片的大小
parameters.setPictureSize(screenWidth, screenHeight);
// 通过SurfaceView显示取景画面
camera.setPreviewDisplay(surfaceHolder);
// 开始预览
camera.startPreview();
catch (Exception e)
e.printStackTrace();
isPreview =
* 此方法在布局文件中调用
public void capture(View source)
if (camera != null)
// 控制摄像头自动对焦后才拍照
camera.autoFocus(autoFocusCallback);
AutoFocusCallback autoFocusCallback = new AutoFocusCallback()
// 当自动对焦时激发该方法
public void onAutoFocus(boolean success, Camera camera)
if (success)
// takePicture()方法需要传入3个监听器参数
// 第1个监听器:当用户按下快门时激发该监听器
// 第2个监听器:当相机获取原始照片时激发该监听器
// 第3个监听器:当相机获取JPG照片时激发该监听器
camera.takePicture(new ShutterCallback()
public void onShutter()
// 按下快门瞬间会执行此处代码
}, new PictureCallback()
public void onPictureTaken(byte[] data, Camera c)
// 此处代码可以决定是否需要保存原始照片信息
}, myJpegCallback);
PictureCallback myJpegCallback = new PictureCallback()
public void onPictureTaken(byte[] data, Camera camera)
// 根据拍照所得的数据创建位图
final Bitmap bm = BitmapFactory.decodeByteArray(data, 0,
data.length);
String fileName=getFileNmae();
if (fileName==null)
// 创建一个位于SD卡上的文件
File file = new File(fileName);
FileOutputStream outStream =
// 打开指定文件对应的输出流
outStream = new FileOutputStream(file);
// 把位图输出到指定文件中
bm.compress(CompressFormat.JPEG, 100,
outStream);
outStream.close();
Toast.makeText(CaptureImage.this, "照片以保存到"+fileName,
Toast.LENGTH_SHORT).show();
catch (IOException e)
e.printStackTrace();
// 重新浏览
camera.stopPreview();
camera.startPreview();
isPreview =
* 返回摄取照片的文件名
* @return 文件名
protected String getFileNmae() {
// TODO Auto-generated method stub
String fileN
if (!Environment.getExternalStorageState().equals
(Environment.MEDIA_MOUNTED)) {
Toast.makeText(this, "监测到你的手机没有插入SD卡,请插入SD卡后再试",
Toast.LENGTH_LONG).show();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH.mm.ss", Locale.getDefault());
fileName=Environment.getExternalStorageDirectory()+File.separator
+sdf.format(new Date())+".JPG";
return fileN
程序运行效果图:

我要回帖

更多关于 控制别人的手机摄像头 的文章

 

随机推荐