EX10_05.java
上传用户:vip_99
上传日期:2021-03-27
资源大小:61159k
文件大小:12k
源码类别:

android开发

开发平台:

Java

  1. package irdc.ex10_05;
  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;
  4. import jp.sourceforge.qrcode.QRCodeDecoder;
  5. import jp.sourceforge.qrcode.data.QRCodeImage;
  6. import android.app.Activity;
  7. import android.content.Context;
  8. import android.content.Intent;
  9. import android.content.pm.ActivityInfo;
  10. import android.graphics.Bitmap;
  11. import android.graphics.BitmapFactory;
  12. import android.graphics.Canvas;
  13. import android.graphics.Matrix;
  14. import android.graphics.Paint;
  15. import android.graphics.PixelFormat;
  16. import android.hardware.Camera;
  17. import android.hardware.Camera.PictureCallback;
  18. import android.hardware.Camera.ShutterCallback;
  19. import android.net.Uri;
  20. import android.os.Bundle;
  21. import android.util.DisplayMetrics;
  22. import android.util.Log;
  23. import android.view.SurfaceHolder;
  24. import android.view.SurfaceView;
  25. import android.view.View;
  26. import android.view.Window;
  27. import android.view.ViewGroup.LayoutParams;
  28. import android.webkit.URLUtil;
  29. import android.widget.Button;
  30. import android.widget.ImageView;
  31. import android.widget.Toast;
  32. public class EX10_05 extends Activity 
  33. implements SurfaceHolder.Callback
  34. {
  35.   /* 创建私有Camera对象 */
  36.   private Camera mCamera01;
  37.   private Button mButton01, mButton02, mButton03;
  38.     
  39.   /* 作为review照下来的相片之用 */
  40.   private ImageView mImageView01;
  41.   private String TAG = "HIPPO";
  42.   private SurfaceView mSurfaceView01;
  43.   private SurfaceHolder mSurfaceHolder01;
  44.   
  45.   /* 默认相机预览模式为false */
  46.   private boolean bIfPreview = false;
  47.   
  48.   /** Called when the activity is first created. */
  49.   @Override
  50.   public void onCreate(Bundle savedInstanceState)
  51.   {
  52.     super.onCreate(savedInstanceState);
  53.     
  54.     /* 使应用程序全屏幕运行,不使用title bar */
  55.     requestWindowFeature(Window.FEATURE_NO_TITLE);
  56.     
  57.     setContentView(R.layout.main);
  58.     
  59.     /* 添加红色正方形红框View,供User对准条形码 */
  60.     DrawCaptureRect mDraw = new DrawCaptureRect
  61.     (
  62.       EX10_05.this,
  63.       110, 10, 100, 100,
  64.       getResources().getColor(R.drawable.lightred)
  65.     );
  66.     
  67.     /* 将创建的红色方框添加至此Activity中 */
  68.     addContentView
  69.     (
  70.       mDraw,
  71.       new LayoutParams
  72.       (
  73.         LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT
  74.       )
  75.     );
  76.     
  77.     /* 取得屏幕解析像素 */
  78.     DisplayMetrics dm = new DisplayMetrics();
  79.     getWindowManager().getDefaultDisplay().getMetrics(dm);
  80.     
  81.     mImageView01 = (ImageView) findViewById(R.id.myImageView1);
  82.     
  83.     /* 以SurfaceView作为相机Preview之用 */
  84.     mSurfaceView01 = (SurfaceView) findViewById(R.id.mSurfaceView1);
  85.     
  86.     /* 绑定SurfaceView,取得SurfaceHolder对象 */
  87.     mSurfaceHolder01 = mSurfaceView01.getHolder();
  88.     
  89.     /* Activity必须实现SurfaceHolder.Callback */
  90.     mSurfaceHolder01.addCallback(EX10_05.this);
  91.     
  92.     /* 额外的设置预览大小设置,在此不使用 */
  93.     //mSurfaceHolder01.setFixedSize(320, 240);
  94.       
  95.     /*
  96.      * 以SURFACE_TYPE_PUSH_BUFFERS(3)
  97.      * 作为SurfaceHolder显示类型 
  98.      * */
  99.     mSurfaceHolder01.setType
  100.     (SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  101.     
  102.     mButton01 = (Button)findViewById(R.id.myButton1);
  103.     mButton02 = (Button)findViewById(R.id.myButton2);
  104.     mButton03 = (Button)findViewById(R.id.myButton3);
  105.     
  106.     /* 打开相机及预览二维条形码 */
  107.     mButton01.setOnClickListener(new Button.OnClickListener()
  108.     {
  109.       @Override
  110.       public void onClick(View arg0)
  111.       {
  112.         // TODO Auto-generated method stub
  113.         
  114.         /* 自定义初始化打开相机函数 */
  115.         initCamera();
  116.       }
  117.     });
  118.     
  119.     /* 停止预览 */
  120.     mButton02.setOnClickListener(new Button.OnClickListener()
  121.     {
  122.       @Override
  123.       public void onClick(View arg0)
  124.       {
  125.         // TODO Auto-generated method stub
  126.         
  127.         /* 自定义重置相机,并关闭相机预览函数 */
  128.         resetCamera();
  129.       }
  130.     });
  131.     
  132.     /* 拍照QR Code二维条形码 */
  133.     mButton03.setOnClickListener(new Button.OnClickListener()
  134.     {
  135.       @Override
  136.       public void onClick(View arg0)
  137.       {
  138.         // TODO Auto-generated method stub
  139.         /* 自定义拍照函数 */
  140.         takePicture();
  141.       }
  142.     });
  143.   }
  144.   
  145.   /* 自定义初始相机函数 */
  146.   private void initCamera()
  147.   {
  148.     if(!bIfPreview)
  149.     {
  150.       /* 若相机非在预览模式,则打开相机 */
  151.       mCamera01 = Camera.open();
  152.     }
  153.     
  154.     if (mCamera01 != null && !bIfPreview)
  155.     {
  156.       Log.i(TAG, "inside the camera");
  157.       
  158.       /* 创建Camera.Parameters对象 */
  159.       Camera.Parameters parameters = mCamera01.getParameters();
  160.       
  161.       /* 设置相片格式为JPEG */
  162.       parameters.setPictureFormat(PixelFormat.JPEG);
  163.       
  164.       /* 指定preview的屏幕大小 */
  165.       parameters.setPreviewSize(160, 120);
  166.       
  167.       /* 设置图片分辨率大小 */
  168.       parameters.setPictureSize(160, 120);
  169.       
  170.       /* 将Camera.Parameters设置予Camera */
  171.       mCamera01.setParameters(parameters);
  172.       
  173.       /* setPreviewDisplay唯一的参数为SurfaceHolder */
  174.       mCamera01.setPreviewDisplay(mSurfaceHolder01);
  175.       
  176.       /* 立即运行Preview */
  177.       mCamera01.startPreview();
  178.       bIfPreview = true;
  179.     }
  180.   }
  181.   
  182.   /* 拍照撷取图像 */ 
  183.   private void takePicture() 
  184.   {
  185.     if (mCamera01 != null && bIfPreview) 
  186.     {
  187.       /* 调用takePicture()方法拍照 */
  188.       mCamera01.takePicture
  189.       (shutterCallback, rawCallback, jpegCallback);
  190.     }
  191.   }
  192.   
  193.   /* 相机重置 */
  194.   private void resetCamera()
  195.   {
  196.     if (mCamera01 != null && bIfPreview)
  197.     {
  198.       mCamera01.stopPreview();
  199.       /* 扩展学习,释放Camera对象 */
  200.       //mCamera01.release();
  201.       mCamera01 = null;
  202.       bIfPreview = false;
  203.     }
  204.   }
  205.    
  206.   private ShutterCallback shutterCallback = new ShutterCallback()
  207.   { 
  208.     public void onShutter() 
  209.     { 
  210.       // Shutter has closed 
  211.     } 
  212.   }; 
  213.    
  214.   private PictureCallback rawCallback = new PictureCallback() 
  215.   { 
  216.     public void onPictureTaken(byte[] _data, Camera _camera) 
  217.     { 
  218.       // TODO Handle RAW image data 
  219.     } 
  220.   }; 
  221.   private PictureCallback jpegCallback = new PictureCallback() 
  222.   {
  223.     public void onPictureTaken(byte[] _data, Camera _camera)
  224.     {
  225.       // TODO Handle JPEG image data
  226.       try
  227.       {
  228.         /* onPictureTaken传入的第一个参数即为相片的byte */
  229.         Bitmap bm =
  230.         BitmapFactory.decodeByteArray(_data, 0, _data.length);
  231.         
  232.         int resizeWidth = 160;
  233.         int resizeHeight = 120;
  234.         float scaleWidth = ((float) resizeWidth) / bm.getWidth();
  235.         float scaleHeight = ((float) resizeHeight) / bm.getHeight();
  236.         
  237.         Matrix matrix = new Matrix();
  238.         /* 使用Matrix.postScale方法缩小 Bitmap Size*/
  239.         matrix.postScale(scaleWidth, scaleHeight);
  240.         
  241.         /* 创建新的Bitmap对象 */
  242.         Bitmap resizedBitmap = Bitmap.createBitmap
  243.         (bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
  244.         
  245.         /* 撷取4:3图片的居中红色框部分100x100像素 */
  246.         Bitmap resizedBitmapSquare = Bitmap.createBitmap
  247.         (resizedBitmap, 30, 10, 100, 100);
  248.         
  249.         /* 将拍照的图文件以ImageView显示出来 */
  250.         mImageView01.setImageBitmap(resizedBitmapSquare);
  251.         
  252.         /* 将传入的图文件译码成字符串 */
  253.         String strQR2 = decodeQRImage(resizedBitmapSquare);
  254.         if(strQR2!="")
  255.         {
  256.           if (URLUtil.isNetworkUrl(strQR2))
  257.           {
  258.             /* OMIA规范,网址条形码,打开浏览器上网 */
  259.             mMakeTextToast(strQR2, true);
  260.             Uri mUri = Uri.parse(strQR2);
  261.             Intent intent = new Intent(Intent.ACTION_VIEW, mUri);
  262.             startActivity(intent);
  263.           }
  264.           else if(eregi("wtai://",strQR2))
  265.           {
  266.             /* OMIA规范,手机拨打电话格式 */
  267.             String[] aryTemp01 = strQR2.split("wtai://");
  268.             Intent myIntentDial = new Intent
  269.             (
  270.               "android.intent.action.CALL",
  271.               Uri.parse("tel:"+aryTemp01[1])
  272.             );
  273.             startActivity(myIntentDial); 
  274.           }
  275.           else if(eregi("TEL:",strQR2))
  276.           {
  277.             /* OMIA规范,手机拨打电话格式 */
  278.             String[] aryTemp01 = strQR2.split("TEL:");
  279.             Intent myIntentDial = new Intent
  280.             (
  281.               "android.intent.action.CALL",
  282.               Uri.parse("tel:"+aryTemp01[1])
  283.             );
  284.             startActivity(myIntentDial);
  285.           }
  286.           else
  287.           {
  288.             /* 若仅是文字,则以Toast显示出来 */
  289.             mMakeTextToast(strQR2, true);
  290.           }
  291.         }
  292.         
  293.         /* 显示完图文件,立即重置相机,并关闭预览 */
  294.         resetCamera();
  295.         
  296.         /* 再重新启动相机继续预览 */
  297.         initCamera();
  298.       }
  299.       catch (Exception e)
  300.       {
  301.         Log.e(TAG, e.getMessage());
  302.       }
  303.     }
  304.   };
  305.   
  306.   public void mMakeTextToast(String str, boolean isLong)
  307.   {
  308.     if(isLong==true)
  309.     {
  310.       Toast.makeText(EX10_05.this, str, Toast.LENGTH_LONG).show();
  311.     }
  312.     else
  313.     {
  314.       Toast.makeText(EX10_05.this, str, Toast.LENGTH_SHORT).show();
  315.     }
  316.   }
  317.   
  318.   private boolean checkSDCard()
  319.   {
  320.     /* 判断记忆卡是否存在 */
  321.     if(android.os.Environment.getExternalStorageState().equals
  322.     (android.os.Environment.MEDIA_MOUNTED))
  323.     {
  324.       return true;
  325.     }
  326.     else
  327.     {
  328.       return false;
  329.     }
  330.   }
  331.   
  332.   /* 解碼传入的Bitmap图片 */
  333.   public String decodeQRImage(Bitmap myBmp)
  334.   {
  335.     String strDecodedData = "";
  336.     try
  337.     {
  338.       QRCodeDecoder decoder = new QRCodeDecoder();
  339.       strDecodedData  = new String
  340.       (decoder.decode(new AndroidQRCodeImage(myBmp)));
  341.     }
  342.     catch(Exception e)
  343.     {
  344.       e.printStackTrace();
  345.     }
  346.     return strDecodedData; 
  347.   }
  348.   
  349.   /* 自定义实现QRCodeImage类 */
  350.   class AndroidQRCodeImage implements QRCodeImage
  351.   {
  352.     Bitmap image;
  353.     
  354.     public AndroidQRCodeImage(Bitmap image)
  355.     {
  356.       this.image = image;
  357.     }
  358.     
  359.     public int getWidth()
  360.     {
  361.       return image.getWidth();
  362.     }
  363.     
  364.     public int getHeight()
  365.     {
  366.       return image.getHeight();
  367.     }
  368.     
  369.     public int getPixel(int x, int y)
  370.     {
  371.       return image.getPixel(x, y);
  372.     }   
  373.   }
  374.   
  375.   /* 绘制相机预览画面里的正方形方框 */
  376.   class DrawCaptureRect extends View
  377.   {
  378.     private int colorFill;
  379.     private int intLeft,intTop,intWidth,intHeight;
  380.     
  381.     public DrawCaptureRect
  382.     (
  383.       Context context, int intX, int intY, int intWidth,
  384.       int intHeight, int colorFill
  385.     )
  386.     {
  387.       super(context);
  388.       this.colorFill = colorFill;
  389.       this.intLeft = intX;
  390.       this.intTop = intY;
  391.       this.intWidth = intWidth;
  392.       this.intHeight = intHeight;
  393.     }
  394.     
  395.     @Override
  396.     protected void onDraw(Canvas canvas)
  397.     {
  398.       Paint mPaint01 = new Paint();
  399.       mPaint01.setStyle(Paint.Style.FILL);
  400.       mPaint01.setColor(colorFill);
  401.       mPaint01.setStrokeWidth(1.0F);
  402.       /* 在画布上绘制红色的四条方边框作为瞄准器 */
  403.       canvas.drawLine
  404.       (
  405.         this.intLeft, this.intTop,
  406.         this.intLeft+intWidth, this.intTop, mPaint01
  407.       );
  408.       canvas.drawLine
  409.       (
  410.         this.intLeft, this.intTop,
  411.         this.intLeft, this.intTop+intHeight, mPaint01
  412.       );
  413.       canvas.drawLine
  414.       (
  415.         this.intLeft+intWidth, this.intTop,
  416.         this.intLeft+intWidth, this.intTop+intHeight, mPaint01
  417.       );
  418.       canvas.drawLine
  419.       (
  420.         this.intLeft, this.intTop+intHeight,
  421.         this.intLeft+intWidth, this.intTop+intHeight, mPaint01
  422.       );
  423.       super.onDraw(canvas);
  424.     }
  425.   }
  426.   
  427.   /* 自定义比较字符串函数 */
  428.   public static boolean eregi(String strPat, String strUnknow)
  429.   {
  430.     String strPattern = "(?i)"+strPat;
  431.     Pattern p = Pattern.compile(strPattern);
  432.     Matcher m = p.matcher(strUnknow);
  433.     return m.find();
  434.   }
  435.   
  436.   @Override
  437.   public void surfaceChanged
  438.   (SurfaceHolder surfaceholder, int format, int w, int h)
  439.   {
  440.     // TODO Auto-generated method stub
  441.     Log.i(TAG, "Surface Changed");
  442.   }
  443.   
  444.   @Override
  445.   public void surfaceCreated(SurfaceHolder surfaceholder)
  446.   {
  447.     // TODO Auto-generated method stub
  448.     Log.i(TAG, "Surface Changed");
  449.   }
  450.   
  451.   @Override
  452.   public void surfaceDestroyed(SurfaceHolder surfaceholder)
  453.   {
  454.     // TODO Auto-generated method stub
  455.     Log.i(TAG, "Surface Destroyed");
  456.   }
  457.   
  458.   @Override
  459.   protected void onPause()
  460.   {
  461.     // TODO Auto-generated method stub
  462.     super.onPause();
  463.   }
  464. }