Android开发Camera类照相机,前后摄像头切换,分辨率读取和调节

来源:互联网 发布:淘宝天天特价 编辑:程序博客网 时间:2024/05/22 05:32
package com.example.camera722;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.os.Environment;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.Toast;

public class MainActivity extends Activity {
SurfaceView sView;
SurfaceHolder surfaceHolder;
ArrayAdapter<String> adapter;
public static int picWidth;
public static int picHeight;

public static int preWidth;
public static int preHeight;
public static boolean TakePictureFlag=true; //防止拍照键连续按下会使程序崩溃
// 定义系统所用的照相机
Camera camera;
//是否在浏览中
boolean isPreview = false;
public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;
int camIdx=Camera.CameraInfo.CAMERA_FACING_BACK;
Button captureButton;
//List<Size> supportedPictureSizes;
private List<Size> supportedPictureSizes;
private List<String> list=new ArrayList<String>();

private List<Size> supportedPreviewSizes;
private List<String> prelist=new ArrayList<String>();
Spinner spinner;
Camera.Parameters parameters;
@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
@Override
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.activity_main);/**/
//WindowManager wm = (WindowManager) getSystemService(
// Context.WINDOW_SERVICE);
//Display display = wm.getDefaultDisplay();
// 获取屏幕的宽和高
//screenWidth = display.getWidth();
//screenHeight = display.getHeight();
// 获取界面中SurfaceView组件
sView = (SurfaceView) findViewById(R.id.sView);
// 获得SurfaceView的SurfaceHolder
surfaceHolder = sView.getHolder();
spinner=(Spinner)findViewById(R.id.spinner);
//添加事件Spinner事件监听
spinner.setOnItemSelectedListener(new SpinnerSelectedListener());

//设置默认值
spinner.setVisibility(View.VISIBLE);
// 为surfaceHolder添加一个回调监听器
surfaceHolder.addCallback(new Callback()
{
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height)
{

}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
// 打开摄像头
initCamera();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
// 如果camera不为null ,释放摄像头
if (camera != null)
{
if (isPreview)
camera.stopPreview();
camera.release();
camera = null;
isPreview=false;
}
}
});

// 设置该SurfaceView自己不维护缓冲
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

//拍照
captureButton = (Button) findViewById(R.id.button1);
captureButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
// get an image from the camera

if(TakePictureFlag){
TakePictureFlag=false;
camera.takePicture(null, null, mPicture);
}
}
}
);

/**************************前后摄像头切换********************************/
Button switchbutton=(Button) findViewById(R.id.button0);
switchbutton.setOnClickListener(
new View.OnClickListener() {

@SuppressLint("NewApi")
@Override
public void onClick(View v) {
if(camIdx == Camera.CameraInfo.CAMERA_FACING_BACK) {//代表摄像头的方位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK后置
if (camera != null && isPreview){
camera.stopPreview();//停掉原来摄像头的预览
camera.release();//释放资源
camera = null;//取消原来摄像头
camIdx=Camera.CameraInfo.CAMERA_FACING_FRONT;
camera = Camera.open(camIdx);//打开当前选中的摄像头
try {
camera.setPreviewDisplay(surfaceHolder);//通过surfaceview显示取景画面
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
camera.startPreview();//开始预览
}
}

else if(camIdx == Camera.CameraInfo.CAMERA_FACING_FRONT) {//代表摄像头的方位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK后置
if (camera != null && isPreview){
camera.stopPreview();//停掉原来摄像头的预览
camera.release();//释放资源
camera = null;//取消原来摄像头
camIdx=Camera.CameraInfo.CAMERA_FACING_BACK;
camera = Camera.open(camIdx);//打开当前选中的摄像头
try {
camera.setPreviewDisplay(surfaceHolder);//通过surfaceview显示取景画面
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
camera.startPreview();//开始预览
}
}
parameters = camera.getParameters();
pinner();
}
});
/**************************前后摄像头切换********************************/
}
//下拉列表事件监听
class SpinnerSelectedListener implements OnItemSelectedListener{
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
picWidth=Integer.parseInt((String.valueOf(supportedPictureSizes.get(arg2).width)));
picHeight=Integer.parseInt((String.valueOf(supportedPictureSizes.get(arg2).height)));
parameters = camera.getParameters();
parameters.setPictureSize(picWidth, picHeight);
camera.setParameters(parameters);
}
public void onNothingSelected(AdapterView<?> arg0) {

}
}

/*************************向文件写数据***************************/
private PictureCallback mPicture = new PictureCallback() {

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

File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
if (pictureFile == null){
return;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
//Log.d(TAG, "File not found: " + e.getMessage());
} catch (IOException e) {
//Log.d(TAG, "Error accessing file: " + e.getMessage());
}
camera.startPreview();
TakePictureFlag=true;
}
};
/*************************向文件写数据***************************/
/*******************************下拉列表设置**********************************************/
public void pinner(){
supportedPictureSizes = parameters.getSupportedPictureSizes();
picWidth=supportedPictureSizes.get(0).width;
picHeight=supportedPictureSizes.get(0).height;
list.clear();
for(int i=0;i<supportedPictureSizes.size();i++){
list.add(String.valueOf(supportedPictureSizes.get(i).width)+"*"+
String.valueOf(supportedPictureSizes.get(i).height));
}
adapter=new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line,
list);
spinner.setAdapter(adapter);
//设置下拉列表的风格
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//将adapter 添加到spinner中
spinner.setAdapter(adapter);
}
/*******************************下拉列表设置**********************************************/
/*************************相机初始化*******************/
@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
private void initCamera()
{
if (!isPreview)
{
camera=Camera.open(camIdx);
}
if (camera != null && !isPreview)
{
try
{
parameters = camera.getParameters();

//parameters = camera.getParameters();
pinner();
parameters.getPreviewSize();
supportedPreviewSizes = parameters.getSupportedPreviewSizes();
for(int i=0;i<supportedPreviewSizes.size();i++){
Log.v("CameraLog",
"previewWidth"+String.valueOf(i)+":" +
String.valueOf(supportedPreviewSizes.get(i).width));
Log.v("CameraLog",
"previewHeight"+String.valueOf(i)+":" +
String.valueOf(supportedPreviewSizes.get(i).height));
}




// 设置预览照片的大小
parameters.setPreviewSize(
supportedPreviewSizes.get(supportedPreviewSizes.size()-1).width,
supportedPreviewSizes.get(supportedPreviewSizes.size()-1).height);
//parameters.setPreviewSize(1280, 720);


// 每秒显示4帧
parameters.setPreviewFrameRate(4);
// 设置图片格式
parameters.setPictureFormat(PixelFormat.JPEG);
// 设置JPG照片的质量
parameters.set("jpeg-quality", 85);
//设置照片的大小
parameters.setPictureSize(picWidth, picHeight);
//android2.3.3以后无需下步
camera.setParameters(parameters);
//通过SurfaceView显示取景画面
camera.setPreviewDisplay(surfaceHolder);
// 开始预览
camera.setParameters(parameters);
camera.startPreview();
// 自动对焦
//camera.autoFocus(null);
}
catch (Exception e)
{
e.printStackTrace();
}

isPreview = true;
}
}



/***************** 保存照片 ****************************/
private static File getOutputMediaFile(int type){
File mediaFile;
String timeStamp=new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
mediaFile=new File(getSDPath()+File.separator+"IMG_"+timeStamp+"abc.jpg");
return mediaFile;
}
public static String getSDPath(){
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED); //判断sd卡是否存在
if (sdCardExist) //如果SD卡存在,则获取跟目录
{
//sdDir = Environment.getExternalStorageDirectory();//获取跟目录
//} else{
File file=new File("/mnt/sdcard/DCIM/mymedia");
file.mkdir();
return "/mnt/sdcard/DCIM/mymedia";
}else
return "/mnt";

//return sdDir.toString()+"/DCIM/mymedia";
}

/***************** 保存照片 ****************************/


/*********************退出程序***************************/
private long exitTime = 0;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//if(KeyEvent.KEYCODE_HOME==keyCode)
// android.os.Process.killProcess(android.os.Process.myPid());
if (keyCode == KeyEvent.KEYCODE_HOME) {
Log.d("test", "Home key down");
//catchHomeKey=true;
}
if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){
if((System.currentTimeMillis()-exitTime) > 2000){
Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
finish();
System.exit(0);
}
return true;
}
return super.onKeyDown(keyCode, event);
}
/*********************退出程序***************************/
}



<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:gravity="fill"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
    android:launchMode="singleInstance"
    tools:context=".MainActivity" >

 <SurfaceView
     android:id="@+id/sView"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"/>

 <TableLayout
     android:id="@+id/table"
     android:layout_width="fill_parent"
     android:layout_height="45dp"
     android:stretchColumns="true">
     <TableRow
         android:layout_weight="1"
         android:layout_width="fill_parent"
      android:layout_height="@dimen/table_height"
      android:background="#00000000"
      android:orientation="horizontal">
         <Button
             android:layout_width="@dimen/table_width"
             android:id="@+id/button0"
             android:layout_weight="1"
             android:text="切换"
             android:layout_height="wrap_content"
             android:textSize="20dp"
             android:background="#00000000"
             />
         <Button
             android:layout_width="@dimen/table_width"
             android:id="@+id/button1"
             android:layout_weight="1"
             android:layout_height="wrap_content"
             android:text="拍照"
             android:textSize="20dp"
             android:background="#00000000"
             />
         <Spinner
             android:id="@+id/spinner"
             android:layout_width="50dp"
             android:layout_height="wrap_content"
             android:layout_weight="1"
             android:background="#00000000"
             />
     </TableRow>
 </TableLayout>
</RelativeLayout>



备注:
在AndroidManifest.xml里添加如下语句 

<uses-permission android:name="android.permission.DISABLE_KEYGUARD"></uses-permission>
 <uses-permission android:name="android.permission.CAMERA"/>
 <uses-permission android:name="android.hardware.camera"/>
 <uses-permission android:name="android.hardware.camera.autofocus"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

 

如果不能横屏,添加这句            android:screenOrientation="landscape"