您的位置:首页 > 移动开发 > Android开发

关于android调用相机及拍照的存储和照片处理功能的全面小案例

2017-04-05 14:28 971 查看
java层:

package com.friendone.inteye;

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 CameraActivity 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. */

   @Override

   public void onCreate(Bundle savedInstanceState)

   {

     super.onCreate(savedInstanceState);  

     /* 使应用程序全屏幕运行,不使用title bar */

     requestWindowFeature(Window.FEATURE_NO_TITLE);

     setContentView(R.layout.camera);

    

     /* 判断存储卡是否存在 */

     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(CameraActivity.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();

         Log.i(TAG,"Camera.open()------------1");

       }catch(Exception e){

         Log.i("Camera.open()-------->", "Exceptione :" + e);

       }

     }

    

     if (mCamera01 != null && !bIfPreview){

       Log
b8d6
.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(CameraActivity.this, str, Toast.LENGTH_LONG).show();

     }

     else{

       Toast.makeText(CameraActivity.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;  

      }     

}

xml层:

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

< LinearLayout

  xmlns:android="http://schemas.android.com/apk/res/android"

  android:background="@drawable/white"

  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

>

  <TextView

    android:id="@+id/myTextView1"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:textColor="@drawable/blue"

    android:text="@string/hello"

  />

  <SurfaceView

    android:id="@+id/mSurfaceView1"

    android:visibility="visible"

    android:layout_width="320dp"

    android:layout_height="240dp">

  </SurfaceView>

  <LinearLayout

    android:orientation="horizontal"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

  >

  <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_gravity="center" />

< /LinearLayout>

其中Intent传过来的值是获取经纬度的值。具体没有写出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: