android 照相机开发

来源:互联网 发布:淘宝自动好评是多久 编辑:程序博客网 时间:2024/05/01 11:16

            Android照相机开发,主要有两种,一种是调用系统拍照程序,第二种是自己开发照相程序,调用系统摄像头,这里介绍第二种开发方式,开发步骤主要分三步。

           一:使用surfaceView来实现预览。

           二:调用系统摄像头。

           三:进行拍照后的图片保存。

           下面贴出代码,其中使用了自定义的application类来缓存图片:

这是继承的application代码:

package com.example.cream.widget;


import java.util.ArrayList;
import java.util.List;


import android.app.Application;
import android.graphics.Bitmap;
import android.util.Log;


public class Myapplication extends Application {
public List<Bitmap> list;//用这个list来缓存图片
public List<Bitmap> getList() {
return list;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Log.d("dd", "开始");
list = new ArrayList<Bitmap>();
}

}

其中需要在androidmanifest中进行配置一下,配置很简单,在application标签中添加属性Android:name=类的全限定名就可以了

这是继承的surfaceView的代码:

package com.example.cream.widget;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


import com.example.cream.MainActivity;


import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Environment;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;


public class MySurfaceView extends SurfaceView implements
SurfaceHolder.Callback {
SurfaceHolder surFaceHolder;
Camera camera;
public Bitmap img;
private final int DISPLAY_ORIENTATION = 90;// 设置显示方式


public MySurfaceView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}


public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
surFaceHolder = this.getHolder();
surFaceHolder.addCallback(this);
surFaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}


public MySurfaceView(Context context) {
super(context);


}


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
camera.startPreview();
camera.setDisplayOrientation(DISPLAY_ORIENTATION);
Log.d("dd", "change");


}


@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.d("dd", "create");
if (camera == null) {


try {
camera = Camera.open(0);
camera.setPreviewDisplay(holder);
} catch (IOException e) {
camera.release();
Log.d("dd", "照相机正在被使用");
}
}
}


@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.d("dd", "destroyed");
camera.stopPreview();
try {
camera.reconnect();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
camera.release();
camera = null;
}


public void close() {
if (camera != null) {
camera.release();
camera = null;
}
}
//开始照相
public void playPicture() {
camera.takePicture(shutter, raw, jpeg);
}


//下面的三个变量将在照相时依次调用
private ShutterCallback shutter = new ShutterCallback() {


@Override
public void onShutter() {


}
};


private PictureCallback raw = new PictureCallback() {


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


}
};


private PictureCallback jpeg = new PictureCallback() {


@Override
public void onPictureTaken(byte[] data, Camera camera) {
BitmapFactory.Options option = new BitmapFactory.Options();// 将图片进行压缩防止OOM
option.inSampleSize = 2;
img = BitmapFactory.decodeByteArray(data, 0, data.length, option);
// 因为是竖屏拍摄所以需要将图片旋转90度才能正常显示
Matrix matrix = new Matrix();
matrix.reset();
matrix.postRotate(90);
img = Bitmap.createBitmap(img, 0, 0, img.getWidth(),
img.getHeight(), matrix, true);
MainActivity.handler.sendEmptyMessage(1);
camera.startPreview();
}
};


// 打开闪光灯
public void lightOn() {
Camera.Parameters params = camera.getParameters();
params.setFlashMode(params.FLASH_MODE_ON);
camera.setParameters(params);
}


// 关闭闪光灯
public void lightOff() {
Camera.Parameters params = camera.getParameters();
params.setFlashMode(params.FLASH_MODE_OFF);
camera.setParameters(params);
}
}

下面是主页面的代码:

package com.example.cream;


import java.util.List;


import com.example.cream.widget.MySurfaceView;
import com.example.cream.widget.Myapplication;


import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;


public class MainActivity extends Activity implements OnClickListener {
MySurfaceView msf;
public static Handler handler;
Button show;
ImageView play;
ImageView close;
ImageView shanguang;
boolean isOpenLight = false;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
init();
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {
((Myapplication) MainActivity.this.getApplication())
.getList().add(msf.img);//将图片缓存
}
}
};


}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 1, 0, "查看照片");
return super.onCreateOptionsMenu(menu);
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == 1) {
Intent it = new Intent(MainActivity.this, ShowImage.class);
startActivity(it);
finish();
}
return super.onOptionsItemSelected(item);
}


void init() {
msf = (MySurfaceView) findViewById(R.id.mysurface);
play = (ImageView) findViewById(R.id.play);
close = (ImageView) findViewById(R.id.close);
shanguang = (ImageView) findViewById(R.id.shanguang);
play.setOnClickListener(this);
close.setOnClickListener(this);
shanguang.setOnClickListener(this);
}


@Override
public void onClick(View arg0) {
switch (arg0.getId()) {
case R.id.close:
finish();
break;
case R.id.play:
msf.playPicture();
break;
case R.id.shanguang:
if (!isOpenLight) {
msf.lightOn();
isOpenLight = true;
} else {
msf.lightOff();
isOpenLight = false;
}
break;
default:
break;
}


}


@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
msf.close();
}


}

显示图片笔者这儿使用的是画廊来显示:

package com.example.cream;


import java.util.ArrayList;
import java.util.List;


import com.example.cream.widget.Myapplication;


import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;


public class ShowImage extends Activity {
Gallery gallery;
List<Bitmap> list;


@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.showimg);
init();
}


void init() {
list = ((Myapplication) getApplication()).getList();
System.out.println(list.size());
gallery = (Gallery) findViewById(R.id.gallery);
gallery.setAdapter(new Myadapter(list));
}


class Myadapter extends BaseAdapter {
List<Bitmap> list;


public Myadapter(List<Bitmap> list) {
this.list = list;
}


@Override
public int getCount() {
return list.size();
}


@Override
public Object getItem(int arg0) {
return list.get(arg0);
}


@Override
public long getItemId(int arg0) {
return arg0;
}


@SuppressWarnings("deprecation")
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
ImageView iv = new ImageView(ShowImage.this);
Bitmap bitmap = this.list.get(arg0);
BitmapDrawable bd = new BitmapDrawable(bitmap);
iv.setBackgroundDrawable(bd);
return iv;
}


}
}


有关XML的布局文件这儿就不贴出来了,有需要的朋友可以直接下载demo,欢迎一起学习交流,有什么问题或者笔者不对的地方可以指出,大家共同进步。

0 0