android camera开发(mrCamera源代码)

file:AndroidManifest.xml

 

[java]   view plain copy
 
  1. <uses-permission android:name="android.permission.RESTART_PACKAGES" />  
  2. <uses-permission android:name="android.permission.CAMERA" />  
  3. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
  4. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  


main.java

 

 

[java]   view plain copy
 
  1. package com.mrsoft.mrcamer.mr;  
  2.   
  3.   
  4. import java.io.File;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.OutputStream;  
  9. import java.text.SimpleDateFormat;  
  10. import java.util.Date;  
  11.   
  12. import android.app.Activity;  
  13. import android.app.ActivityManager;  
  14. import android.app.AlertDialog;  
  15. import android.app.AlertDialog.Builder;  
  16. import android.content.DialogInterface;  
  17. import android.content.DialogInterface.OnClickListener;  
  18. import android.content.res.Resources;  
  19. import android.graphics.Bitmap;  
  20. import android.graphics.BitmapFactory;  
  21. import android.graphics.Canvas;  
  22. import android.graphics.PixelFormat;  
  23. import android.graphics.Rect;  
  24. import android.graphics.Bitmap.Config;  
  25. import android.hardware.Camera;  
  26. import android.hardware.Camera.AutoFocusCallback;  
  27. import android.os.Bundle;  
  28. import android.os.Environment;  
  29. import android.util.DisplayMetrics;  
  30. import android.view.KeyEvent;  
  31. import android.view.Menu;  
  32. import android.view.MenuItem;  
  33. import android.view.MotionEvent;  
  34. import android.view.SurfaceHolder;  
  35. import android.view.SurfaceView;  
  36. import android.widget.ImageView;  
  37. import android.widget.Toast;  
  38.   
  39. public class main extends Activity implements SurfaceHolder.Callback{  
  40.     private final static int MENU_MRCAMERA = Menu.FIRST;  
  41.     private final static int MENU_MRPHOTO = Menu.FIRST+1;  
  42.     private final static int MENU_ABOUT = Menu.FIRST+2;  
  43.     private final static int MENU_EXIT = Menu.FIRST+3;  
  44.     private boolean bTE = false;  
  45.     private Rect rc = new Rect(0380320480);  
  46.     private SurfaceHolder sfHolder;  
  47.     private Camera camera;  
  48.     private SurfaceView mr_sv;  
  49.     private ImageView mr_iv;  
  50.     private Bitmap jpg;  
  51.     private Bitmap markBmp;  
  52.     private OutputStream fos;  
  53.     private String mFileName;  
  54.     private Date mDate;  
  55.     private SimpleDateFormat mFmt;  
  56.     private static int IMG_PREVIEW_WIDTH = 480;  
  57.     private static int IMG_PREVIEW_HEIGHT = 320;  
  58.     private static int IMG_WIDTH = 1280;  
  59.     private static int IMG_HEIGHT = 960;  
  60.   
  61.     /** Called when the activity is first created. */  
  62.     @Override  
  63.     public void onCreate(Bundle savedInstanceState) {  
  64.         super.onCreate(savedInstanceState);  
  65.         setContentView(R.layout.main);  
  66.           
  67.         //getWindowManager().getDefaultDisplay().getMetrics(DisMet);  
  68.           
  69.         mr_sv = (SurfaceView)findViewById(R.id.mr_sv);  
  70.         mr_iv = (ImageView)findViewById(R.id.mr_iv);  
  71.           
  72.         Resources res = getResources();  
  73.         markBmp = BitmapFactory.decodeResource(res , R.drawable.mp);  
  74.           
  75.         sfHolder = mr_sv.getHolder();  
  76.         sfHolder.addCallback(this);  
  77.         sfHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  78.           
  79.         boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);   //判断sd卡是否存在  
  80.         if (!sdCardExist)  
  81.         {  
  82.             AlertDialog.Builder builder = new Builder(main.this);  
  83.             builder.setMessage("请插入内存卡后重新再试!");  
  84.             builder.setTitle("提示");  
  85.             builder.setPositiveButton("确认"new OnClickListener(){  
  86.                 @Override  
  87.                 public void onClick(DialogInterface arg0, int arg1) {  
  88.                     // TODO Auto-generated method stub  
  89.                     arg0.dismiss();  
  90.                     exit();  
  91.                 }  
  92.             });  
  93.         }  
  94.     }  
  95.   
  96.     @Override  
  97.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  98.             int height) {  
  99.         // TODO Auto-generated method stub  
  100.         Camera.Parameters parameters = camera.getParameters();  
  101.         parameters.setPictureFormat(PixelFormat.JPEG);  // 设置图片的格式  
  102.         parameters.set("orientation""portrait");  
  103.         parameters.setPreviewSize(IMG_PREVIEW_WIDTH, IMG_PREVIEW_HEIGHT);   // 设置图片预览的高度和宽度  
  104.         parameters.setPictureSize(IMG_WIDTH, IMG_HEIGHT);   // 设置图片的高度和宽度  
  105.         parameters.setPreviewFrameRate(60);     // 设置图片预览的帧速  
  106.         camera.setParameters(parameters);  
  107.         camera.startPreview();  
  108.     }  
  109.     @Override  
  110.     public void surfaceCreated(SurfaceHolder holder) {  
  111.         // TODO Auto-generated method stub  
  112.         try {  
  113.             camera = Camera.open();  
  114.             camera.setPreviewDisplay(sfHolder);  
  115.         } catch (IOException e) {  
  116.             // TODO Auto-generated catch block  
  117.             e.printStackTrace();  
  118.         }  
  119.     }  
  120.     @Override  
  121.     public void surfaceDestroyed(SurfaceHolder holder) {  
  122.         // TODO Auto-generated method stub  
  123.         camera.stopPreview();  
  124.         camera = null;  
  125.     }  
  126.     @Override  
  127.     public boolean onCreateOptionsMenu(Menu menu) {  
  128.         // TODO Auto-generated method stub  
  129.         //menu.add(0, MENU_MRCAMERA, 1, "大头贴");  
  130.         menu.add(0, MENU_MRPHOTO, 2"相册");  
  131.         menu.add(0, MENU_ABOUT, 3"关于");  
  132.         menu.add(0, MENU_EXIT, 3"退出");  
  133.         return super.onCreateOptionsMenu(menu);  
  134.     }  
  135.     @Override  
  136.     public boolean onOptionsItemSelected(MenuItem item) {  
  137.         // TODO Auto-generated method stub  
  138.         switch (item.getItemId())  
  139.         {  
  140.         case MENU_MRCAMERA:  
  141.             //mr_iv.setImageBitmap(markBmp);  
  142.             break;  
  143.         case MENU_MRPHOTO:  
  144.             break;  
  145.         case MENU_ABOUT:  
  146.             AlertDialog.Builder bd = new Builder(main.this);  
  147.             bd.setMessage("mrCamera.apk\n版本:1.0\n作者:mrandexe");  
  148.             bd.setTitle("关于");  
  149.             bd.setPositiveButton("确认"new OnClickListener(){  
  150.                 @Override  
  151.                 public void onClick(DialogInterface arg0, int arg1) {  
  152.                     // TODO Auto-generated method stub  
  153.                     arg0.dismiss();  
  154.                 }  
  155.             });  
  156.             bd.create().show();  
  157.             break;  
  158.         case MENU_EXIT:  
  159.             AlertDialog.Builder builder = new Builder(main.this);  
  160.             builder.setMessage("确认退出吗?");  
  161.             builder.setTitle("提示");  
  162.             builder.setPositiveButton("确认"new OnClickListener(){  
  163.                 @Override  
  164.                 public void onClick(DialogInterface arg0, int arg1) {  
  165.                     // TODO Auto-generated method stub  
  166.                     arg0.dismiss();  
  167.                     exit();  
  168.                 }  
  169.             });  
  170.             builder.setNegativeButton("取消"new OnClickListener(){  
  171.   
  172.                 @Override  
  173.                 public void onClick(DialogInterface dialog, int which) {  
  174.                     // TODO Auto-generated method stub  
  175.                     dialog.dismiss();  
  176.                 }  
  177.             });  
  178.             builder.create().show();  
  179.             break;  
  180.         default:  
  181.             break;  
  182.         }  
  183.         return super.onOptionsItemSelected(item);  
  184.     }  
  185.     @Override  
  186.     public boolean onTouchEvent(MotionEvent event) {  
  187.         // TODO Auto-generated method stub  
  188.           
  189.         if (event.getAction()==MotionEvent.ACTION_DOWN)  
  190.         {  
  191.             int x = (int)event.getX();  
  192.             int y = (int)event.getY();  
  193.               
  194.             if (rc.contains(x, y))  
  195.             {  
  196.                 bTE = !bTE;  
  197.                 if (bTE)  
  198.                 {  
  199.                     camera.autoFocus(mAfc);  
  200.                     camera.stopPreview();  
  201.                     Toast.makeText(this"拍摄照片储存中.", Toast.LENGTH_SHORT).show();  
  202.                 }  
  203.                 else  
  204.                 {  
  205.                     //mr_iv.setImageBitmap(null);  
  206.                     camera.startPreview();  
  207.                 }  
  208.             }  
  209.         }  
  210.         return super.onTouchEvent(event);  
  211.     }  
  212.       
  213.     private AutoFocusCallback mAfc = new AutoFocusCallback()  
  214.     {  
  215.   
  216.         @Override  
  217.         public void onAutoFocus(boolean success, Camera camera) {  
  218.             // TODO Auto-generated method stub  
  219.             camera.takePicture(new shutter(), new raw(), new jpeg());  
  220.         }  
  221.           
  222.     };  
  223.     class shutter implements Camera.ShutterCallback  
  224.     {  
  225.         @Override  
  226.         public void onShutter() {  
  227.             // TODO Auto-generated method stub  
  228.         }  
  229.           
  230.     }  
  231.       
  232.     class raw implements Camera.PictureCallback  
  233.     {  
  234.   
  235.         @Override  
  236.         public void onPictureTaken(byte[] data, Camera camera) {  
  237.             // TODO Auto-generated method stub  
  238.         }  
  239.       
  240.     }  
  241.       
  242.     class jpeg implements Camera.PictureCallback  
  243.     {  
  244.         @Override  
  245.         public void onPictureTaken(byte[] data, Camera camera) {  
  246.             // TODO Auto-generated method stub  
  247.             try {  
  248.                 mDate = new Date(System.currentTimeMillis());  
  249.                 mFmt = new SimpleDateFormat("MMddhhmmss");  
  250.                 mFileName = mFmt.format(mDate);  
  251.                 //Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);  
  252.                 jpg = BitmapFactory.decodeByteArray(data, 0, data.length);  
  253.                 //jpg = mixtureBitmap(bm, markBmp);  
  254.                 //mr_iv.setImageBitmap(jpg);  
  255.                 File fPath = new File(Environment.getExternalStorageDirectory().toString()+"/mrCamera/");  
  256.                 if (!fPath.exists())  
  257.                 {  
  258.                     fPath.mkdir();  
  259.                 }  
  260.                 File fName = new File(fPath, mFileName+".jpg");  
  261.                 if (!fName.exists())  
  262.                 {  
  263.                     fName.createNewFile();  
  264.                 }  
  265.                 fos = new FileOutputStream(fName);  
  266.                 jpg.compress(Bitmap.CompressFormat.JPEG, 100, fos );  
  267.                   
  268.             } catch (FileNotFoundException e) {  
  269.                 // TODO Auto-generated catch block  
  270.                 e.printStackTrace();  
  271.             } catch (IOException e) {  
  272.                 // TODO Auto-generated catch block  
  273.                 e.printStackTrace();  
  274.             }  
  275.             finally  
  276.             {  
  277.                 try {  
  278.                     fos.flush();  
  279.                     fos.close();  
  280.                 } catch (IOException e) {  
  281.                     // TODO Auto-generated catch block  
  282.                     e.printStackTrace();  
  283.                 }  
  284.                   
  285.             }  
  286.             }  
  287.               
  288.         }  
  289.       
  290.     public Bitmap mixtureBitmap(Bitmap bmp, Bitmap mark)  
  291.     {  
  292.         int sW = bmp.getWidth();  
  293.         int sH = bmp.getHeight();  
  294.         Bitmap newBmp = Bitmap.createBitmap(sW, sH, Config.ARGB_8888);  
  295.         Canvas cv = new Canvas(newBmp);  
  296.         cv.drawBitmap(bmp, 00null);  
  297.         cv.drawBitmap(mark, 00null);  
  298.         cv.save(Canvas.ALL_SAVE_FLAG);  
  299.         cv.restore();  
  300.         return newBmp;  
  301.     }  
  302.   
  303.     @Override  
  304.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  305.         // TODO Auto-generated method stub  
  306.         if (keyCode==KeyEvent.KEYCODE_BACK && event.getRepeatCount()==0)  
  307.         {  
  308.             exit();  
  309.             return true;  
  310.         }  
  311.         return super.onKeyDown(keyCode, event);  
  312.     }  
  313.       
  314.     private void exit()  
  315.     {  
  316.         ActivityManager actMgr = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE);  
  317.         actMgr.restartPackage(getPackageName());  
  318.     }  
  319. }  

 

file:main.xml

 

[html]   view plain copy
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7.     <SurfaceView   
  8.     android:id="@+id/mr_sv"   
  9.     android:layout_width="fill_parent"   
  10.     android:layout_height="fill_parent">  
  11.     </SurfaceView>  
  12.     <ImageView   
  13.     android:layout_height="fill_parent"   
  14.     android:id="@+id/mr_iv"   
  15.     android:layout_width="fill_parent">  
  16.     </ImageView>  
  17. </RelativeLayout>  

转载于:https://www.cnblogs.com/moonlza/p/3307349.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值