版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度農(nóng)業(yè)產(chǎn)業(yè)化項(xiàng)目財(cái)務(wù)評(píng)估與融資方案合同3篇
- 商業(yè)大廈消防改造工程合同范本
- 2025年度鮮奶運(yùn)輸企業(yè)信用評(píng)估與激勵(lì)機(jī)制合同3篇
- 戶外用品租賃經(jīng)營(yíng)合同
- 激情溢!籃球場(chǎng)地租賃合同
- 教育培訓(xùn)機(jī)構(gòu)教務(wù)經(jīng)理合同
- 礦山企業(yè)總工程師聘用合同
- 總代理緊急代理權(quán)協(xié)議
- 文化傳媒項(xiàng)目合同管理要點(diǎn)
- 二零二五年度多功能車(chē)場(chǎng)租賃及配套設(shè)施建設(shè)協(xié)議3篇
- 汽機(jī)油管道安裝方案指導(dǎo)
- 2022年中國(guó)城市英文名稱(chēng)
- 語(yǔ)言規(guī)劃課件
- 下肢皮牽引護(hù)理PPT課件(19頁(yè)P(yáng)PT)
- 臺(tái)資企業(yè)A股上市相關(guān)資料
- 電 梯 工 程 預(yù) 算 書(shū)
- 參會(huì)嘉賓簽到表
- 形式發(fā)票格式2 INVOICE
- 2.48低危胸痛患者后繼治療評(píng)估流程圖
- 人力資源管理之績(jī)效考核 一、什么是績(jī)效 所謂績(jī)效簡(jiǎn)單的講就是對(duì)
- 山東省醫(yī)院目錄
評(píng)論
0/150
提交評(píng)論