android手機(jī)拍照功能的實(shí)現(xiàn)及原理_第1頁(yè)
android手機(jī)拍照功能的實(shí)現(xiàn)及原理_第2頁(yè)
android手機(jī)拍照功能的實(shí)現(xiàn)及原理_第3頁(yè)
android手機(jī)拍照功能的實(shí)現(xiàn)及原理_第4頁(yè)
android手機(jī)拍照功能的實(shí)現(xiàn)及原理_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、android手機(jī)拍照功能的實(shí)現(xiàn)及原理html view plaincopy1. -  2. 在main.xml布局文件添加用于顯示取景畫(huà)面的SurfaceView 控件:  3. <SurfaceView android:layout_width="fill_parent" android:layout_height="240dip" android:id="+id/surfaceView" />  4

2、. SurfaceView surfaceView = (SurfaceView)this.findViewById(R.id.surfaceView);  5. surfaceView.getHolder().setFixedSize(176, 144); /設(shè)置分辨率  6. /*下面設(shè)置Surface不維護(hù)自己的緩沖區(qū),而是等待屏幕的渲染引擎將內(nèi)容推送到用戶面前*/  7. surfaceView.getHolder().setType(SurfaceHolder.SURFACE

3、_TYPE_PUSH_BUFFERS);  8. Camera camera = Camera.open();  9. WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);  10. Display display = wm.getDefaultDisplay();  11. Camera.Parameters

4、0;parameters = camera.getParameters();  12. parameters.setPreviewSize(display.getWidth(), display.getHeight();/設(shè)置預(yù)覽照片的大小  13. parameters.setPreviewFrameRate(3);/每秒3幀  14. parameters.setPictureFormat(PixelFormat.JPEG);/設(shè)置照片的輸出格式  15. parameters.s

5、et("jpeg-quality", 85);/照片質(zhì)量  16. parameters.setPictureSize(display.getWidth(), display.getHeight();/設(shè)置照片的大小  17. camera.setParameters(parameters);  18. camera.setPreviewDisplay(surfaceView.getHolder();/通過(guò)SurfaceView顯示取景畫(huà)面  19. camera.start

6、Preview();/開(kāi)始預(yù)覽  20. camera.autoFocus(null);/自動(dòng)對(duì)焦  21. camera.takePicture(null, null, null, jpegCallback);/拍照片  22. camera.stopPreview();/停止預(yù)覽  23. camera.release();/釋放攝像頭  24. -  25. <uses-permission android:name=&qu

7、ot;android.permission.CAMERA"/>  package cn.itcast.picture;import java.io.File;import java.io.FileOutputStream;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.PixelFormat;import

8、android.graphics.Bitmap.CompressFormat;import android.hardware.Camera;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.Display;import android.view.KeyEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.Window;i

9、mport android.view.WindowManager;public class TakePictureActivity extends Activity  private static final String TAG = "TakePictureActivity"    private SurfaceView surfaceView;    private Camera camera;    private boolean preview;  

10、;      Override    public void onCreate(Bundle savedInstanceState)         super.onCreate(savedInstanceState);        Window window = getWindow();     requestWindowFeatur

11、e(Window.FEATURE_NO_TITLE);/沒(méi)有標(biāo)題     window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);/ 設(shè)置全屏     window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);/高亮       

12、 setContentView(R.layout.main);                surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);        surfaceView.getHolder().addCallback(new SufaceListener();  &#

13、160;     /*下面設(shè)置Surface不維護(hù)自己的緩沖區(qū),而是等待屏幕的渲染引擎將內(nèi)容推送到用戶面前*/        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        surfaceView.getHolder().setFixedSize(176, 144); /設(shè)置分辨率 &

14、#160;          private final class SufaceListener implements SurfaceHolder.Callback  Override  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)     Override  public void surfa

15、ceCreated(SurfaceHolder holder)    try     camera = Camera.open();/打開(kāi)攝像頭    Camera.Parameters parameters = camera.getParameters();    WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);  

16、60; Display display = wm.getDefaultDisplay();    parameters.setPreviewSize(display.getWidth(), display.getHeight();/設(shè)置預(yù)覽照片的大小    parameters.setPreviewFrameRate(3);/每秒3幀    parameters.setPictureFormat(PixelFormat.JPEG);/設(shè)置照片的輸出格式 &

17、#160;  parameters.set("jpeg-quality", 85);/照片質(zhì)量    parameters.setPictureSize(display.getWidth(), display.getHeight();/設(shè)置照片的大小    camera.setParameters(parameters);    camera.setPreviewDisplay(surfaceView.getHolder();/通過(guò)Su

18、rfaceView顯示取景畫(huà)面    camera.startPreview();    preview = true;    catch (Exception e)     Log.e(TAG, e.toString();       Override  public void surfaceDestroyed(SurfaceHolder holder)

19、   if(camera!=null)    if(preview) camera.stopPreview();    camera.release();    camera = null;               Override public boolean onKeyDown(int keyCode

20、, KeyEvent event)   if(camera!=null && event.getRepeatCount()=0)   switch (keyCode)    case KeyEvent.KEYCODE_SEARCH:    camera.autoFocus(null);/自動(dòng)對(duì)焦    break;   case KeyEvent.KEYCODE_DPAD_CENTER:&#

21、160;     case KeyEvent.KEYCODE_CAMERA:    /拍照    camera.takePicture(null, null, new PictureCallbackListener();    break;       return true;  private final class PictureCa

22、llbackListener implements Camera.PictureCallback  Override  public void onPictureTaken(byte data, Camera camera)    try     Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);    File file = new File(Environm

23、ent.getExternalStorageDirectory(), "itcast.jpg");    FileOutputStream outStream = new FileOutputStream(file);    press(CompressFormat.JPEG, 100, outStream);    outStream.close();    /重新瀏覽    

24、;camera.stopPreview();    camera.startPreview();    preview = true;    catch (Exception e)     Log.e(TAG, e.toString();        -1.拍照應(yīng)用的界面:-  a.橫向,全屏  b.-    拍照區(qū)

25、域    -  c.右下角:  對(duì)焦   拍照-1.要求當(dāng)用戶觸摸屏幕的時(shí)候顯示:對(duì)焦   拍照2.這兩個(gè)按鈕是顯示在之上的.-3.所以這時(shí)候用的是幀布局.一層在一層之上.4.也用到了相對(duì)布局-下面是拍照的所有源碼:-新建android項(xiàng)目:1./takepicture/src/com/credream/camer/TakepictureActivity.javajava view plaincopy1. package com.credream.camer;  2

26、.   3. import java.io.File;  4. import java.io.FileNotFoundException;  5. import java.io.FileOutputStream;  6. import java.io.IOException;  7.   8. import android.app.Activity;  9. import android.hard

27、ware.Camera;  10. import android.hardware.Camera.PictureCallback;  11. import android.os.Bundle;  12. import android.os.Environment;  13. import android.util.Log;  14. import android.view.MotionEvent;  15. import

28、60;android.view.SurfaceHolder;  16. import android.view.SurfaceHolder.Callback;  17. import android.view.SurfaceView;  18. import android.view.View;  19. import android.view.ViewGroup;  20. import android.view.Window; &#

29、160;21. import android.view.WindowManager;  22.   23.   24. public class TakepictureActivity extends Activity   25.    26.    private View layout;/布局  27.   28.  

30、60;  private Camera camera;/攝像頭  29.     30.     31.     Override  32.       33. public void onCreate(Bundle savedInstanceState)   34.  

31、;     35.     super.onCreate(savedInstanceState);  36.           37. requestWindowFeature(Window.FEATURE_NO_TITLE);/設(shè)置activity沒(méi)有標(biāo)題欄  38.     39.    &#

32、160;  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  40.                 WindowManager.LayoutParams.FLAG_FULLSCREEN);/設(shè)置activity全屏顯示  41.      

33、60;  setContentView(R.layout.main);  42.         /獲取這個(gè)相對(duì)布局  43.         layout = this.findViewById(R.id.buttonlayout);  44.  /這里可以使用surfaceView來(lái)顯示視頻畫(huà)面。  45

34、.         SurfaceView surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);  46.      /直接將畫(huà)面顯示到屏幕上,不再使用緩沖區(qū)  47.    surfaceView.getHolder().setType(SurfaceHolder.SURFACE_

35、TYPE_PUSH_BUFFERS);  48.      /設(shè)置畫(huà)面的分辨率  49.    surfaceView.getHolder().setFixedSize(176, 144);  50.    /保持屏幕的高亮,不要鎖定屏幕  51.      surfaceView.getHolder().setKeepScreenOn(true)

36、;  52.        /當(dāng)surfaceView被創(chuàng)建的時(shí)候就會(huì)調(diào)用  53.  surfaceView.getHolder().addCallback(new SurfaceCallback();  54.      55.    56.       57.    

37、60; 58.  public void takepicture(View v)  59.           60. if(camera!=null)/拍照前判斷,照相機(jī)對(duì)象不允許為null  61.               62. switch (v.

38、getId() /當(dāng)id為takepicture時(shí)候,  63.           64.     case R.id.takepicture:  65.           66.         camera.ta

39、kePicture(null, null, new MyPictureCallback();  67.         /camera.startPreview();/拍完照調(diào)用這個(gè)方法繼續(xù)預(yù)覽,這樣是不可以的  68.         /camera.takePicture這個(gè)方法內(nèi)部采用了異步保存照片,當(dāng)camera.takePicture方法執(zhí)行完后,攝像頭可能

40、還沒(méi)有處理完照片  69.         /所以直接在camera.takePicture方法后面調(diào)用camera.startPreview();方法是不對(duì)的  70.         /這個(gè)方法開(kāi)始拍照,這三個(gè)參數(shù)是:快門(mén)按下去后  71.         /* 72.  &

41、#160;       * null,第一個(gè)當(dāng)快門(mén)按下去之后,會(huì)調(diào)用這個(gè)對(duì)象中的回調(diào)方法 73.          * null,第二個(gè)參數(shù)是當(dāng)攝像頭拍完后,照片數(shù)據(jù)分為照片的原始數(shù)據(jù),和照片經(jīng)過(guò)壓縮后的數(shù)據(jù),第二個(gè)參數(shù)就是指照片的原始數(shù)據(jù) 74.          * 第三個(gè)參數(shù)就是照片經(jīng)過(guò)壓縮后

42、的數(shù)據(jù) 75.          * new MyPictureCallback()這個(gè)方法就是得到攝像頭拍攝完,并壓縮后的數(shù)據(jù) 76.          *  77.          * */  78.   

43、0;     break;  79.         /攝像頭拍照的時(shí)候是不可以預(yù)覽的,因?yàn)閿z像頭在某一個(gè)時(shí)刻只能做一件事情,當(dāng)拍完照后就沒(méi)有預(yù)覽畫(huà)面了。  80.   81.           82.     case R.id.autofocus:

44、60; 83.       84.             camera.autoFocus(null);  85.             /這里的輸入?yún)?shù)是:得到對(duì)焦成功之后的事件。,不想得到這個(gè)事件可以設(shè)為null  86.  

45、60;   87.             break;  88.               89.   90.           91.   &

46、#160;   92.       93.     94.   private final class MyPictureCallback implements PictureCallback  95.       96.       97. public&#

47、160;void onPictureTaken(byte data, Camera camera)   98.     /byte data, Camera camera這個(gè)是壓縮后的數(shù)據(jù)和攝像頭  99.         try   100.        

48、 /保存照片文件    Environment.getExternalStorageDirectory()這個(gè)是sd卡的根目錄  101.     File jpgFile = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+".jpg");  102.    

49、;         /文件輸出流   103. FileOutputStream outStream = new FileOutputStream(jpgFile);  104.     /把照片寫(xiě)到sd卡的根目錄  105.            

50、 outStream.write(data);  106.       107.             outStream.close();  108.         /截止到這里攝像頭已經(jīng)把照片處理完了,這時(shí)候在調(diào)用camera.startPreview();進(jìn)入畫(huà)面預(yù)覽界面,才可以

51、  109.         camera.startPreview();/寫(xiě)完數(shù)據(jù)后繼續(xù)  110.               111.  catch (Exception e)   112.        

52、;         e.printStackTrace();  113.           114.       115.           116.       &

53、#160;   117.       118.       119.      120.  private final class SurfaceCallback implements Callback  121. /當(dāng)surfaceView被創(chuàng)建的時(shí)候執(zhí)行這個(gè)方法  122.  

54、0;      public void surfaceCreated(SurfaceHolder holder)   123.   124.             try  125.            &

55、#160;  126.     camera = Camera.open();/打開(kāi)攝像頭,Camera這里Camera類(lèi),有兩個(gè)這里用硬件中的那個(gè)import android.hardware.Camera;  127.                 Camera.Parameters parameters

56、0;= camera.getParameters();/不同廠商的攝像頭,他們的參數(shù)是不同的。  128.                 /注意這里需要真實(shí)的手機(jī)進(jìn)行測(cè)試,因?yàn)檫@樣才可以得到攝像頭的各項(xiàng)參數(shù)  129.               

57、  /Log.i("TakepictureActivity", parameters.flatten();  130.                 /可以通過(guò)Log.i("TakepictureActivity", parameters.flatten();來(lái)查看該攝像頭的各項(xiàng)參數(shù)  131.  

58、0;              /parameters.flatten()這個(gè)方法用來(lái)查看,攝像頭可以設(shè)置的各項(xiàng)參數(shù)  132.                 /這些參數(shù)根據(jù)攝像頭不同時(shí)不一樣的  133.     &

59、#160;           parameters.setPreviewSize(800, 480);/攝像頭捕獲的照片大小  134.                 parameters.setPreviewFrameRate(5);/每秒中攝像頭捕獲的畫(huà)面  135. &

60、#160;               parameters.setPictureSize(1024,768);/設(shè)置照片大小  136.                 parameters.setJpegQuality(80);/設(shè)置照片的質(zhì)量,100是最好的

61、60; 137.                 camera.setParameters(parameters);/設(shè)置完攝像頭的參數(shù)后把參數(shù)再給攝像頭  138.                 camera.setPreviewDisplay(

62、holder);/把攝像頭捕獲的數(shù)據(jù)給surfaceView  139.                 camera.startPreview();/開(kāi)始預(yù)覽  140.             catch (Exception e)  

63、 141.                 e.printStackTrace();  142.               143.           144. &#

64、160; 145.         public void surfaceChanged(SurfaceHolder holder, int format, int width,int height)   146.           147. /當(dāng)應(yīng)用不在前臺(tái)的時(shí)候調(diào)用這個(gè)方法 

65、0;148.         public void surfaceDestroyed(SurfaceHolder holder)   149.             if(camera!=null)  150.         

66、0;       camera.release();/釋放攝像頭  151.                 camera = null;  152.              &

67、#160;153.           154.           155.       156.   157.     Override  158.     public boolean onTo

68、uchEvent(MotionEvent event)   159.         /判斷如果當(dāng)前的事件是,觸摸按下的事件的話。  160.         if(event.getAction() = MotionEvent.ACTION_DOWN)  161.       

69、      layout.setVisibility(ViewGroup.VISIBLE);/這時(shí)候就顯示按鈕。相對(duì)布局,  162.             /return true的時(shí)候就是把這個(gè)事件消費(fèi)掉。不在往下傳遞。  163.            

70、; return true;  164.           165.         return super.onTouchEvent(event);  166.       167.       168.  

71、60;    169.   java view plaincopy1. -  2./takepicture/AndroidManifest.xmlhtml view plaincopy1. <?xml version="1.0" encoding="utf-8"?>  2. <manifest xmlns:android="3.     p

72、ackage="com.credream.camer"  4.     android:versionCode="1"  5.     android:versionName="1.0" >  6.   7.     <uses-sdk android:minSdkVersion="8"

73、 />  8.  <!- android:screenOrientation="landscape"這句的作用是控制屏幕為橫屏。   9.  全屏,沒(méi)有標(biāo)題欄,和狀態(tài)欄。  10.  ->  11.     <application  12.         android:

74、icon="drawable/ic_launcher"  13.         android:label="string/app_name" >  14.         <activity  15.          &#

75、160;  android:label="string/app_name"  16.             android:name=".TakepictureActivity"  17.              android:screenOr

76、ientation="landscape" >  18.             <intent-filter >  19.                 <action android:name=&qu

77、ot;ent.action.MAIN" />  20.   21.                 <category android:name="ent.category.LAUNCHER" />  22.     

78、        </intent-filter>  23.         </activity>  24.     </application>  25.       26.      

79、60;<!-這個(gè)是訪問(wèn)攝像頭的權(quán)限 ->   27. <uses-permission android:name="android.permission.CAMERA"/>  28. <!- 在SDCard中創(chuàng)建與刪除文件權(quán)限 ->  29. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/

80、>  30. <!- 往SDCard寫(xiě)入數(shù)據(jù)權(quán)限 ->  31. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  32.   33.           34.   35. </manifest>

81、60; html view plaincopy1. -  3./takepicture/res/layout/main.xml html view plaincopy1. <?xml version="1.0" encoding="utf-8"?>  2. <!- 這里用了幀布局 ->  3. <FrameLayout xmlns:android="4.  

82、   android:layout_width="fill_parent"  5.     android:layout_height="fill_parent"  6.     >  7.     <!- 拍照用到了SurfaceView控件 ->  8.   

83、0; <SurfaceView    9.         android:layout_width="fill_parent"   10.         android:layout_height="fill_parent"   11.    

84、60;    android:id="+id/surfaceView"  12.         />  13.     <!- 用到了相對(duì)布局 ->  14.     <RelativeLayout  15.    

85、0;    android:layout_width="fill_parent"   16.         android:layout_height="fill_parent"   17.         android:visibility="gone" 

86、0;18.         android:id="+id/buttonlayout"  19.     >  20.     <!- android:onClick="takepicture"指定點(diǎn)擊后執(zhí)行的方法,  21.     android:layout_alignP

87、arentRight="true"指定在相對(duì)布局(也就是button按鈕的父元素的右邊)  22.     android:layout_alignParentBottom="true"指定在相對(duì)布局(也就是button按鈕的父元素的下邊)  23.     android:layout_marginRight="5dp"指的是右邊距離相對(duì)布局(也就是button按鈕的父元素為5個(gè)像素)  24.

88、       25.      ->  26.     <!- 拍照按鈕 ->  27.         <Button  28.         android:layout_width="wrap_content"   29.         android:layout_height="wrap_content"   30.         android:layout_alignParentRight="true" 

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論