android开发APP实现照相机功能


Android SDK 中提供的面向硬件的特性

特性

描述

android.hardware.Camera

相机交互的类,可以截取照片、获取预览屏幕的图像,修改照相机操作的参数。

android.hardware.SensorManager

允许访问 Android 平台传感器的类。并非所有配备 Android 的设备都支持 SensorManager 中的所有传感器。

android.hardware.SensorListener

在传感器值实时更改时,希望接收更新的类要实现的接口。用以监视硬件中一个或多个可用传感器。

android.media.MediaRecorder

用于录制媒体的类。

android.FaceDetector

人脸进行基本识别类。

android.os.*

可以与操作环境交互的包,包括电源管理、文件查看器、处理器和消息类。

  android.hardware.SensorManager 包含几个常量,这表示 Android 传感器系统的不同方面,包括:

传感器类型:方向、加速表、光线、磁场、临近性、温度等。采样率最快、游戏、普通、用户界面。

当应用程序请求特定的采样率时,其实只是对传感器子系统的一个提示,或者一个建议。不保证特定的采样率可用。准确性高、低、中、不可靠。

  SensorListener 接口是传感器应用程序的中心。它包括两个必需方法:

onSensorChanged(int sensor,float values[]) 方法在传感器值更改时调用。该方法只对受此应用程序监视的传感器调用。该方法

 

相机拍摄:

package com.android.cameraAndroid;

 

import android.app.Activity;

import android.os.Bundle;

 

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

 

import android.content.Context;

import android.content.Intent;

import android.graphics.PixelFormat;

import android.hardware.Camera;

import android.hardware.Camera.Parameters;

import android.hardware.Camera.PictureCallback;

import android.hardware.Camera.ShutterCallback;

import android.media.AudioManager;

import android.media.ToneGenerator;

import android.net.Uri;

import android.os.Environment;

import android.os.StatFs;

import android.view.Menu;

import android.view.MenuItem;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

 

public class CameraAndroid extends Activity {

 

private CameraPreview preview;

private Camera camera;

private ToneGenerator tone;

private static final int OPTION_SNAPSHOT = 0;

 

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

preview = new CameraPreview(this);

setContentView(preview);

}

 

@Override

public boolean onOptionsItemSelected(MenuItem item) {

int itemId = item.getItemId();

switch(itemId){

case OPTION_SNAPSHOT:

//拍摄照片

camera.takePicture(shutterCallback, null, jpegCallback);

break;

}

return true;

}

//返回照片的JPEG格式的数据

private PictureCallback jpegCallback = new PictureCallback(){

 

public void onPictureTaken(byte[] data, Camera camera) {

Parameters ps = camera.getParameters();

if(ps.getPictureFormat() == PixelFormat.JPEG){

    //存储拍照获得的图片

    String path = save(data);

    //将图片交给Image程序处理

    Uri uri = Uri.fromFile(new File(path));

        Intent intent = new Intent();

        intent.setAction("android.intent.action.VIEW");

        intent.setDataAndType(uri, "image/jpeg");

        startActivity(intent);

}

}

};

//快门按下的时候onShutter()被回调

private ShutterCallback shutterCallback = new ShutterCallback(){

public void onShutter() {

if(tone == null)

//发出提示用户的声音

tone = new ToneGenerator(AudioManager.STREAM_MUSIC,

ToneGenerator.MAX_VOLUME);

tone.startTone(ToneGenerator.TONE_PROP_BEEP2);

}

};

private String save(byte[] data){

String path = "/sdcard/"+System.currentTimeMillis()+".jpg";

try {

//判断SD卡上是否有足够的空间

String storage = Environment.getExternalStorageDirectory().toString();

StatFs fs = new StatFs(storage);

long available = fs.getAvailableBlocks()*fs.getBlockSize();

if(available<data.length){

//空间不足直接返回空

return null;

}

File file = new File(path);

if(!file.exists())

//创建文件

file.createNewFile();

FileOutputStream fos = new FileOutputStream(file);

fos.write(data);

fos.close();

} catch (Exception e) {

e.printStackTrace();

return null;

}

return path;

}

 

@Override

public boolean onCreateOptionsMenu(Menu menu) {

menu.add(0, OPTION_SNAPSHOT, 0, R.string.snapshot);

return super.onCreateOptionsMenu(menu);

}

 

class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

SurfaceHolder mHolder;

 

public CameraPreview(Context context) {

super(context);

mHolder = getHolder();

mHolder.addCallback(this);

mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

}

//Sureface创建的时候,此方法被调用

public void surfaceCreated(SurfaceHolder holder) {

//打开摄像头,获得Camera对象

camera = Camera.open();

try {

//设置显示

camera.setPreviewDisplay(holder);

} catch (IOException exception) {

camera.release();

camera = null;

}

}

 

//Surface销毁的时候,此方法被调用

public void surfaceDestroyed(SurfaceHolder holder) {

camera.stopPreview();

//释放Camera

camera.release();

camera = null;

}

 

public void surfaceChanged(SurfaceHolder holder, int format, int w,

int h) {

//已经获得Surfacewidthheight,设置Camera的参数

Camera.Parameters parameters = camera.getParameters();

parameters.setPreviewSize(w, h);

camera.setParameters(parameters);

//开始预览

camera.startPreview();

}

}

}

  • 0
    点赞
  • 0
    评论
  • 15
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值