照相机

来源:互联网 发布:中科大软件学院调剂 编辑:程序博客网 时间: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 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>

</FrameLayout> 

0 0
原创粉丝点击