android调用相机到activity内进行拍照、储存示例

MainActivity.java

package com.example.tphone;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.Locale;


import android.app.Activity;

import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;

import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.text.format.DateFormat;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements SurfaceHolder.Callback { /* 创建私有Camera对象 */
	   private Camera mCamera01;
	   private Button mButton01, mButton02, mButton03; 
	   /* 作为review照下来的相片之用 */
	   private ImageView mImageView01;
	   private TextView mTextView01;
	   private String TAG = "HIPPO";
	   private SurfaceView mSurfaceView01;
	   private SurfaceHolder mSurfaceHolder01; 
	   String latLongString;
	   /* 默认相机预览模式为false */
	   private boolean bIfPreview = false;
	   Location location;
	   /* 将照下来的图片存储在此 */
	   private String strCaptureFilePath = "/sdcard/camera_snap.jpg";
	   /** Called when the activity is first created. */
	   @SuppressWarnings("deprecation")
	@Override
	   public void onCreate(Bundle savedInstanceState){
	     super.onCreate(savedInstanceState);   
	     /* 使应用程序全屏幕运行,不使用title bar */
	     requestWindowFeature(Window.FEATURE_NO_TITLE);
	     setContentView(R.layout.activity_main);
	     
	     /* 判断存储卡是否存在 */
	     if(!checkSDCard()){
	       /* 提醒User未安装存储卡 */
	       mMakeTextToast(
	         getResources().getText(R.string.str_err_nosd).toString(),
	         true
	       );
	     }
	     
	     /* 取得屏幕解析像素 */
	     DisplayMetrics dm = new DisplayMetrics();
	     getWindowManager().getDefaultDisplay().getMetrics(dm);
	         
	     mTextView01 = (TextView) findViewById(R.id.myTextView1);
	     mImageView01 = (ImageView) findViewById(R.id.myImageView1);    

	     
	     /* 以SurfaceView作为相机Preview之用 */
	     mSurfaceView01 = (SurfaceView) findViewById(R.id.mSurfaceView1);
	     
	     /* 绑定SurfaceView,取得SurfaceHolder对象 */
	     mSurfaceHolder01 = mSurfaceView01.getHolder();
	     
	     /* Activity必须实现SurfaceHolder.Callback */
	     mSurfaceHolder01.addCallback(MainActivity.this);
	         
	     /*
	      * 以SURFACE_TYPE_PUSH_BUFFERS(3)
	      * 作为SurfaceHolder显示类型 
	      * */
	     mSurfaceHolder01.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	     
	     mButton01 = (Button)findViewById(R.id.myButton1);
	     mButton02 = (Button)findViewById(R.id.myButton2);
	     mButton03 = (Button)findViewById(R.id.myButton3);
	     
	     /* 打开相机及Preview */
	     mButton01.setOnClickListener(new Button.OnClickListener(){
	       public void onClick(View arg0){
	         /* 自定义初始化打开相机函数 */
	         initCamera();
	       }
	     });
	     
	     /* 停止Preview及相机 */
	     mButton02.setOnClickListener(new Button.OnClickListener(){
	       public void onClick(View arg0){
	         /* 自定义重置相机,并关闭相机预览函数 */
	         resetCamera();
	       }
	     });
	     
	     Bundle extras=getIntent().getExtras();
//	     latLongString=extras.getString("latLongString");
	     /* 拍照 */
	     mButton03.setOnClickListener(new Button.OnClickListener(){
	       public void onClick(View arg0){
	         /* 当存储卡存在才允许拍照,存储暂存图像文件 */
	         if(checkSDCard()){
	           /* 自定义拍照函数 */
	           takePicture();
	         }
	         else {
	           /* 存储卡不存在显示提示 */
	           mTextView01.setText(
	             getResources().getText(R.string.str_err_nosd).toString()
	           );
	         } 
	       }      
	     });
	   }
	   //图片名称自增
	  

	   /* 自定义初始相机函数 */
	   private void initCamera(){
	     if(!bIfPreview){
	       /* 若相机非在预览模式,则打开相机 */
	       try{
	         mCamera01 = Camera.open();
	         Toast.makeText(this, "Camera.open()------------1", 5000).show();
	         Log.i(TAG,"Camera.open()------------1");
	       }catch(Exception e){
	         Log.i("Camera.open()-------->", "Exceptione :" + e);
	         Toast.makeText(this, "Camera.open()--Exceptione"+e, 5000).show();
	       }
	     }
	     
	     if (mCamera01 != null && !bIfPreview){
	       Log.i(TAG, "inside the camera");
	       
	       /* 创建Camera.Parameters对象 */
	       Camera.Parameters parameters = mCamera01.getParameters();
	       if (Integer.parseInt(Build.VERSION.SDK) >= 8)
	        setDisplayOrientation(mCamera01, 90);
	       else {
	        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
	         parameters.set("orientation", "portrait");
	         parameters.set("rotation", 90);
	        }
	        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
	         parameters.set("orientation", "landscape");
	         parameters.set("rotation", 90);
	        }
	     }
	       /* 设置相片格式为JPEG */
	       parameters.setPictureFormat(PixelFormat.JPEG);
	       
	       /* 指定preview的屏幕大小 */
	       parameters.setPreviewSize(320, 240);
	       
	       /* 设置图片分辨率大小 */
	       parameters.setPictureSize(320, 240);
	       
	       /* 将Camera.Parameters设置予Camera */
	       try{
	         mCamera01.setParameters(parameters);
	       }catch(Exception e){
	         Log.i("archermind-------->", "Exceptione :" + e);
	       }
	       /* setPreviewDisplay唯一的参数为SurfaceHolder */
	       try{
	         mCamera01.setPreviewDisplay(mSurfaceHolder01);
	       } catch (IOException e){
	         e.printStackTrace();
	       }
	       
	       /* 立即运行Preview */
	       mCamera01.startPreview();
	       bIfPreview = true;
	     }
	   }
	   
	   /* 拍照撷取图像 */ 
	   private void takePicture(){
	     if (mCamera01 != null && bIfPreview) {
	       /* 调用takePicture()方法拍照 */
	       mCamera01.takePicture(shutterCallback, rawCallback, jpegCallback);
	     }
	   }
	   
	   /* 相机重置 */
	   private void resetCamera(){
	     if (mCamera01 != null && bIfPreview){
	       mCamera01.stopPreview();
	       /* 扩展学习,释放Camera对象 */
	       bIfPreview = false;
	       mCamera01.release();
	       mCamera01 = null;
	     }
	   }
	    
	   private ShutterCallback shutterCallback = new ShutterCallback(){ 
	     public void onShutter() { 
	     } 
	   }; 
	    
	   private PictureCallback rawCallback = new PictureCallback() { 
	     public void onPictureTaken(byte[] _data, Camera _camera) { 
	     } 
	   };

	   private PictureCallback jpegCallback = new PictureCallback() {
	     public void onPictureTaken(byte[] _data, Camera _camera){
	       /* onPictureTaken传入的第一个参数即为相片的byte */
	     String name = new DateFormat().format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA)) + ".jpg";
	       Bitmap bm = BitmapFactory.decodeByteArray(_data, 0, _data.length);
	       bm=generatorContactCountIcon(bm);
	       /* 创建新文件 */
	       File myCaptureFile = new File("/sdcard/"+name);
	       try{
	         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));        
	         /* 采用压缩转档方法 */
	         bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
	                  
	         /* 调用flush()方法,更新BufferStream */
	         bos.flush();
	         
	         /* 结束OutputStream */
	         bos.close();
	         
	         /* 将拍照下来且存储完毕的图文件,显示出来 */ 
	         mImageView01.setImageBitmap(bm);
	         
	         /* 显示完图文件,立即重置相机,并关闭预览 */
	         resetCamera();
	         
	         /* 再重新启动相机继续预览 */
	         initCamera();
	       }
	       catch (Exception e){
	         Log.e(TAG, e.getMessage());
	       }
	     }
	   };
	   
	   /* 自定义删除文件函数 */
	   private void delFile(String strFileName){
	     try{
	       File myFile = new File(strFileName);
	       if(myFile.exists()){
	         myFile.delete();
	       }
	     }
	     catch (Exception e){
	       Log.e(TAG, e.toString());
	       e.printStackTrace();
	     }
	   }
	   
	   public void mMakeTextToast(String str, boolean isLong){
	     if(isLong==true){
	       Toast.makeText(MainActivity.this, str, Toast.LENGTH_LONG).show();
	     }
	     else{
	       Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
	     }
	   }
	   
	   private boolean checkSDCard(){
	     /* 判断存储卡是否存在 */
	     if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){
	       return true;
	     }
	     else{
	       return false;
	     }
	   }
	   
	   public void surfaceChanged(SurfaceHolder surfaceholder, int format, int w, int h){
	     Log.i(TAG, "Surface surfaceChanged");
	   }
	   
	   public void surfaceCreated(SurfaceHolder surfaceholder){
	     Log.i(TAG, "Surface surfaceCreated");
	   }
	   
	   public void surfaceDestroyed(SurfaceHolder surfaceholder){
	     /* 当Surface不存在,需要删除图片 */
	    Log.i(TAG, "Surface surfaceDestroyed");
	     try{
	       //delFile(strCaptureFilePath);
	       resetCamera();
	     }
	     catch(Exception e){
	       e.printStackTrace();
	     }
	     Log.i(TAG, "Surface Destroyed");
	   }      
	      //旋转90度
	      protected void setDisplayOrientation(Camera camera, int angle) {
	         Method downPolymorphic;
	         try {
	          downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });
	          if (downPolymorphic != null)
	           downPolymorphic.invoke(camera, new Object[] { angle });
	         } catch (Exception e1) {
	         }
	      }       
	      private Bitmap generatorContactCountIcon(Bitmap icon){   
	              //初始化画布   
	              int iconSize=(int)getResources().getDimension(android.R.dimen.app_icon_size);   
	              Log.i(TAG, "the icon size is "+iconSize);
	              Bitmap contactIcon=Bitmap.createBitmap(320, 240, Config.ARGB_8888);   
	              Canvas canvas=new Canvas(contactIcon);                 
	               //拷贝图片   
	               Paint iconPaint=new Paint();   
	               iconPaint.setDither(true);//防抖动   
	               iconPaint.setFilterBitmap(true);//用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果   
	               Rect src=new Rect(0, 0, icon.getWidth(), icon.getHeight());   
	               Rect dst=new Rect(0, 0, 320, 240);   
	               canvas.drawBitmap(icon, src, dst, iconPaint);   
	                  
	               //在图片上创建经纬度
	               String contacyCount="经纬度:"+latLongString;
	               //启用抗锯齿和使用设备的文本字距   
	               Paint countPaint=new Paint(Paint.ANTI_ALIAS_FLAG|Paint.DEV_KERN_TEXT_FLAG);   
	               countPaint.setColor(Color.RED);   
	               countPaint.setTextSize(20f);   
	               countPaint.setTypeface(Typeface.DEFAULT_BOLD); 
	               canvas.drawText(contacyCount, iconSize-60, 25, countPaint); 
	      Log.i(TAG, "结束==========="+latLongString);
	               return contactIcon;   
	      }      

}

 activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/myTextView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <SurfaceView
        android:id="@+id/mSurfaceView1"
        android:layout_width="320dp"
        android:layout_height="240dp"
        android:visibility="visible" >
    </SurfaceView>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/myButton1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/str_button1" />

        <Button
            android:id="@+id/myButton2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/str_button2" />

        <Button
            android:id="@+id/myButton3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/str_take_picture" />
    </LinearLayout>

    <ImageView
        android:id="@+id/myImageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/mSurfaceView1"
        android:layout_alignRight="@+id/mSurfaceView1"
        android:layout_below="@+id/mSurfaceView1"
        android:layout_marginTop="26dp" />

</RelativeLayout>

 string.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">TPhone</string>
    <string name="action_settings">Settings</string>
    <string name="hello">Hello world!</string>
    
    <string name="str_err_nosd">您没有安装内存卡</string>
    <string name="str_button1">打开相机</string>
    <string name="str_button2">停止相机</string>
    <string name="str_take_picture">拍照</string>

</resources>

 开放权限:

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
     <uses-permission android:name="android.permission.CAMERA" />

猜你喜欢

转载自hafuokas.iteye.com/blog/1932878