照相机
来源:互联网 发布:中科大软件学院调剂 编辑:程序博客网 时间:2024/03/29 15:31
package com.layne.watch;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.os.Bundle;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.FeatureInfo;
import android.content.pm.PackageManager;
import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.view.KeyEvent;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Toast;
public class zhaoxji extends Activity implements OnClickListener, OnCompletionListener{
private Camera camera;
private Camera.Parameters parameters = null;
private MediaPlayer player = null;
Button sxt_but;
static Boolean front=false;
int i=0;
int sg=1;
static File fileFolder=new File("/storage/sdcard0/DCIM/Play");
SurfaceView surfaceView;
Bundle bundle = null; // 声明一个Bundle对象,用来存储数据
@Override
protected void onPause() {
// TODO 自动生成的方法存根
super.onPause();
}
@Override
protected void onRestart() {
// TODO 自动生成的方法存根
super.onRestart();
}
private static void requestScanFile(Context context, File file) {
Intent i = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
i.setData(Uri.fromFile(file));
context.sendBroadcast(i);
}
static Context context;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 显示界面
context=this;
if (!fileFolder.exists()) { // 如果目录不存在,则创建一个名为"finger"的目录
fileFolder.mkdir();
}
setContentView(R.layout.zhaoxj);
player = new MediaPlayer();
player.setOnCompletionListener(this);
player.reset();
sxt_but=(Button)findViewById(R.id.sxt_but);
sxt_but.setOnClickListener(this);
File[] f = fileFolder.listFiles();
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
surfaceView = (SurfaceView) this
.findViewById(R.id.surfaceView);
surfaceView.getHolder()
.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView.getHolder().setFixedSize(176, 144); //设置Surface分辨率
surfaceView.getHolder().setKeepScreenOn(true);// 屏幕常亮
surfaceView.getHolder().addCallback(new SurfaceCallback());//为SurfaceView的句柄添加一个回调函数
surfaceView.setOnClickListener(this);
}
public static Bitmap byte2Bitmap(String path) {
if(path == null || path.length()<1 ) return null;
File file = new File(path);
Bitmap resizeBmp = null;
BitmapFactory.Options opts = new BitmapFactory.Options();
// 数字越大读出的图片占用的heap越小 不然总是溢出
if (file.length() < 20480) { // 0-20k
opts.inSampleSize = 1;
} else if (file.length() < 51200) { // 20-50k
opts.inSampleSize = 2;
} else if (file.length() < 307200) { // 50-300k
opts.inSampleSize = 4;
} else if (file.length() < 819200) { // 300-800k
opts.inSampleSize = 6;
} else if (file.length() < 1048576) { // 800-1024k
opts.inSampleSize = 8;
} else {
opts.inSampleSize = 10;
}
resizeBmp = BitmapFactory.decodeFile(file.getPath(), opts);
return resizeBmp;}
@Override
protected void onDestroy() {
super.onDestroy();
try {
unregisterReceiver(mGattUpdateReceiver);
} catch (Exception e) {
// TODO: handle exception
}
}
public final class MyPictureCallback implements PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
bundle = new Bundle();
bundle.putByteArray("bytes", data); //将图片字节数据保存在bundle当中,实现数据交换
// 保存图片到sad卡中
saveToSDCard(data);
Toast.makeText(getApplicationContext(),"Take photos success",
Toast.LENGTH_SHORT).show();
if(boo_sg){closesg();}
camera.startPreview(); // 拍完照后,重新开始预览
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 将拍下来的照片存放在SD卡中
* @param data
* @throws IOException
*/
public static void saveToSDCard(byte[] data) throws IOException {
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 格式化时间
String filename = format.format(date) + ".jpg";
if (!fileFolder.exists()) { // 如果目录不存在,则创建一个名为"finger"的目录
fileFolder.mkdir();
}
File jpgFile = new File(fileFolder, filename);
FileOutputStream outputStream = new FileOutputStream(jpgFile); // 文件输出流
outputStream.write(data); // 写入sd卡中
outputStream.close(); // 关闭输出流
if(front){
Bitmap b =adjustPhotoRotation(byte2Bitmap(jpgFile.getPath()),180);
outputStream = new FileOutputStream(jpgFile); // 文件输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.PNG,80, baos);
outputStream.write(baos.toByteArray());
outputStream.close(); // 关闭输出流);
b.recycle();
}
requestScanFile(context, jpgFile);
}
private final class SurfaceCallback implements Callback {
// 拍照状态变化时调用该方法
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
parameters = camera.getParameters(); // 获取各项参数
parameters.setPictureFormat(PixelFormat.JPEG); // 设置图片格式
parameters.setPreviewSize(width, height); // 设置预览大小
parameters.setPreviewFrameRate(5); //设置每秒显示4帧
parameters.setPictureSize(width, height); // 设置保存的图片尺寸
parameters.setJpegQuality(80); // 设置照片质量
}
// 开始拍照时调用该方法
@SuppressLint("NewApi")
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
try {
camera = Camera.open(i);
if(i==1){
front=true;
}else{
front=false;
}
} catch (Exception e) {
camera = Camera.open(0);
}
// 打开摄像头
camera.setPreviewDisplay(holder);
camera.setDisplayOrientation(getPreviewDegree(zhaoxji.this));
camera.startPreview(); // 开始预览
} catch (Exception e) {
}
}
// 停止拍照时调用该方法
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
camera.release(); // 释放照相机
camera = null;
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_CAMERA: // 按下拍照按钮
if (camera != null && event.getRepeatCount() == 0) {
play("km.mp3");
// 拍照
//注:调用takePicture()方法进行拍照是传入了一个PictureCallback对象——当程序获取了拍照所得的图片数据之后
//,PictureCallback对象将会被回调,该对象可以负责对相片进行保存或传入网络
camera.takePicture(null, null, new MyPictureCallback());
}
}
if(event.getKeyCode()==event.KEYCODE_BACK)
{finish();}
return super.onKeyDown(keyCode, event);
}
// 提供一个静态方法,用于根据手机方向获得相机预览画面旋转的角度
public static int getPreviewDegree(Activity activity) {
// 获得手机的方向
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degree = 0;
// 根据手机的方向计算相机预览画面应该选择的角度
switch (rotation) {
case Surface.ROTATION_0:
degree = 90;
break;
case Surface.ROTATION_90:
degree = 0;
break;
case Surface.ROTATION_180:
degree = 270;
break;
case Surface.ROTATION_270:
degree = 180;
break;
}
return degree;
}
@SuppressLint("NewApi")
@Override
public void onClick(View v) {
if(v==sxt_but){
if(i==0){
try {
i=1;
onCreate(bundle);
} catch (Exception e) {
e.printStackTrace();
}
}
else{ i=0;
onCreate(bundle);}
}
if(v==surfaceView){
camera.autoFocus(autoFocusCallBack);
}
}
AutoFocusCallback autoFocusCallBack = new AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
System.out.println("focus------------->" + success);
}
};
Boolean boo_sg=false;
public void opensg(){
PackageManager pm= this.getPackageManager();
FeatureInfo[] features=pm.getSystemAvailableFeatures();
for(FeatureInfo f : features)
{
if(PackageManager.FEATURE_CAMERA_FLASH.equals(f.name)) //判断设备是否支持闪光灯
{
Camera.Parameters parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters( parameters );
camera.startPreview();
}
}
}
public void closesg(){
Camera.Parameters p = camera.getParameters();
p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(p);
}
int zoomValue=0;
public void setZoomIn(){
try{
Camera.Parameters parameters = camera.getParameters();
if(zoomValue<30){
zoomValue +=5;}
parameters.setZoom(zoomValue);
camera.setParameters(parameters);
}catch (Exception e) {
e.printStackTrace();
}
}
public void setZoomOut(){
try{
Camera.Parameters parameters = camera.getParameters();
if(zoomValue>0){
zoomValue -=5;}
parameters.setZoom(zoomValue);
camera.setParameters(parameters);
}catch (Exception e) {
e.printStackTrace();
}
}
public void play(String pat) {
try {
player.pause();
player.stop();
player.reset();
AssetFileDescriptor afd =zhaoxji.this.getAssets().openFd(pat);
player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
player.prepare();
player.start();
player.seekTo(0);
} catch (Exception e) {
}
}
@Override
public void onCompletion(MediaPlayer arg0) {
// TODO 自动生成的方法存根
}
public static Bitmap adjustPhotoRotation(Bitmap bm, final int orientationDegree)
{
Matrix m = new Matrix();
m.setRotate(orientationDegree, (float) bm.getWidth(), (float) bm.getWidth());
float targetX, targetY;
if (orientationDegree == 90) {
targetX = bm.getWidth();
targetY = 0;
} else {
targetX = bm.getWidth();
targetY = bm.getHeight();
}
final float[] values = new float[9];
m.getValues(values);
float x1 = values[Matrix.MTRANS_X];
float y1 = values[Matrix.MTRANS_Y];
m.postTranslate(targetX - x1, targetY - y1);
Bitmap bm1 = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Bitmap.Config.ARGB_8888);
Paint paint = new Paint();
Canvas canvas = new Canvas(bm1);
canvas.drawBitmap(bm, m, paint);
return bm1;
}
}
zhaoxj.xml
</FrameLayout>
zhaoxj.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/FrameLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- 显示预览图形 -->
<!-- 相对布局,放置两个按钮 -->
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
<Button
android:id="@+id/sxt_but"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@drawable/sxt_but" />
</RelativeLayout>
</RelativeLayout>
0 0
- 照相机
- 照相机
- 照相机
- 照相机
- windows照相机
- 一次性照相机
- 打开照相机
- J2me 照相机
- 自定义 照相机
- Android照相机
- 自定义照相机
- Android 照相机
- UIImagePickerController(照相机)
- 维度照相机
- android照相机
- 照相机拍照
- OpenGL照相机
- 调用照相机
- WPF调用线程 解决“调用线程无法访问此对象,因为另一个线程拥有该对象“问题
- Linux C中strcpy , strncpy , strlcpy 的区别
- Java反射及其在Android中的应用学习总结
- MYSQL优化
- PHP中使用json_encode处理中文
- 照相机
- 算法竞赛入门经典:第十章 数学概念与方法 10.7无关的元素
- PHP函数addslashes和mysql_real_escape_string的区别
- ctype.h
- lightOJ 1067 - Combinations
- 算法竞赛入门经典:第十章 数学概念与方法 10.8约数的个数
- 自定义dialog
- linux 安装rabbitmq 简易记录
- 《Java设计模式》之原型模式