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,欢迎一起学习交流,有什么问题或者笔者不对的地方可以指出,大家共同进步。
- android 照相机开发
- android开发调用照相机
- Android多媒体开发:照相机
- Android实战开发:自定义照相机
- Android开发应用之照相机的使用
- Android 开发一个简单的照相机程序
- android开发:调用照相机临时跳转页面
- Android照相机
- Android 照相机
- android照相机
- Android开发 调用照相机实现代码和注意事项
- Android应用开发-----------------接受照相机拍照广播和录像广播
- Android开发 调用照相机实现代码和注意事项
- Android开发中使用照相机功能 及其常见问题解法方法
- Android开发 调用照相机实现代码和注意事项
- 面向照相机的开发
- 安卓照相机开发
- Android调用系统照相机
- 我是这么利用数据---对需求说不
- ML二:NNSearch数据结构--二叉树
- 整体刷新和局部刷新frameset窗口
- Anagrams
- 《java解惑》:数值表达式
- android 照相机开发
- java中的char类型和Unicode编码
- 记一次内存暴涨之二分法
- 在ubuntu12.04上部署OPenstack (2)
- XHTML标签嵌套规则
- 关于三元运算符中的类型提升
- Struts2异常----- According to TLD or attribute directive in tag file, attribute test
- Java基础1(基础、运算符、语句1)
- 数学之路-群体行为与群体智能(1)