自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android開發(fā):定制自己的Camera

移動(dòng)開發(fā) Android
Android自帶的Camera應(yīng)用雖然可以滿足大多數(shù)情景,但是其靈活性上還有不足。但是Android允許我們定制自己的Camera。 本文介紹了如何定制Camera的一個(gè)實(shí)例。

在Android的hardware包中有一個(gè)Camera類。這個(gè)類就是獲取Camera服務(wù)的,可以定制Camera等。

可以通過open()方法獲取其實(shí)例。

在使用這個(gè)類是需要在AndroidManifest.xml文件中加入相應(yīng)的權(quán)限和特性。

如:

  1.  <uses-permission android:name = "android.permission.CAMERA" /> 
  2. <uses-feature android:name = "android.hardware.camera" /> 
  3. <uses-feature android:name = "android.hardware.camera.autofocus" />  

等。

本文實(shí)例:

  1. package demo.camera; 
  2. import java.io.OutputStream; 
  3. import java.util.Iterator; 
  4. import java.util.List; 
  5. import android.app.Activity; 
  6. import android.content.ContentValues; 
  7. import android.content.res.Configuration; 
  8. import android.hardware.Camera; 
  9. import android.net.Uri; 
  10. import android.os.Bundle; 
  11. import android.provider.MediaStore; 
  12. import android.view.SurfaceHolder; 
  13. import android.view.SurfaceView; 
  14. import android.view.View; 
  15. import android.widget.LinearLayout; 
  16. /** 
  17.  * Android自帶的Camera應(yīng)用程序可以完成很多功能。但是當(dāng)其不能滿足我們需要的時(shí)候 
  18.  * 我們可以定制自己的Camera。Android提供了Camera類來輔助我們實(shí)現(xiàn)自己的Camera。 
  19.  * 這個(gè)例子就來定義一個(gè)自己的Camera 
  20.  * 首先,在Manifest中需要引入權(quán)限<uses-permission android:name="android:permission.CAMERA"/> 
  21.  * 我們需要用來存放取景器的容器,這個(gè)容器就是SurfaceView。 
  22.  * 使用SurfaceView的同時(shí),我們還需要使用到SurfaceHolder,SurfaceHolder相當(dāng)于一個(gè)監(jiān)聽器,可以監(jiān)聽 
  23.  * Surface上的變化,通過其內(nèi)部類CallBack來實(shí)現(xiàn)。 
  24.  * 為了可以獲取圖片,我們需要使用Camera的takePicture方法同時(shí)我們需要實(shí)現(xiàn)Camera.PictureCallBack類,實(shí)現(xiàn)onPictureTaken方法 
  25.  * @author Administrator 
  26.  * 
  27.  */ 
  28. public class MyCamera extends Activity implements SurfaceHolder.Callback,Camera.PictureCallback{ 
  29.      
  30.     public static final int MAX_WIDTH = 200
  31.     public static final int MAX_HEIGHT = 200
  32.      
  33.     private SurfaceView surfaceView; 
  34.      
  35.     private Camera camera; //這個(gè)是hardare的Camera對(duì)象 
  36.      
  37.     public void onCreate(Bundle savedInstanceState){ 
  38.         super.onCreate(savedInstanceState); 
  39.         this.setContentView(R.layout.camera); 
  40.         surfaceView = (SurfaceView)this.findViewById(R.id.myCameraView); 
  41.         surfaceView.setFocusable(true);  
  42.         surfaceView.setFocusableInTouchMode(true); 
  43.         surfaceView.setClickable(true); 
  44.         surfaceView.setOnClickListener(new View.OnClickListener() { 
  45.              
  46.             @Override 
  47.             public void onClick(View v) { 
  48.                  
  49.                 camera.takePicture(nullnullnull, MyCamera.this); 
  50.                  
  51.             } 
  52.         }); 
  53.         //SurfaceView中的getHolder方法可以獲取到一個(gè)SurfaceHolder實(shí)例 
  54.         SurfaceHolder holder = surfaceView.getHolder(); 
  55.         //為了實(shí)現(xiàn)照片預(yù)覽功能,需要將SurfaceHolder的類型設(shè)置為PUSH 
  56.         //這樣,畫圖緩存就由Camera類來管理,畫圖緩存是獨(dú)立于Surface的 
  57.         holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
  58.         holder.addCallback(this); 
  59.     } 
  60.     @Override 
  61.     public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
  62.     } 
  63.     @Override 
  64.     public void surfaceCreated(SurfaceHolder holder) { 
  65.         // 當(dāng)Surface被創(chuàng)建的時(shí)候,該方法被調(diào)用,可以在這里實(shí)例化Camera對(duì)象 
  66.         //同時(shí)可以對(duì)Camera進(jìn)行定制 
  67.         camera = Camera.open(); //獲取Camera實(shí)例 
  68.      
  69.          
  70.         /** 
  71.          * Camera對(duì)象中含有一個(gè)內(nèi)部類Camera.Parameters.該類可以對(duì)Camera的特性進(jìn)行定制 
  72.          * 在Parameters中設(shè)置完成后,需要調(diào)用Camera.setParameters()方法,相應(yīng)的設(shè)置才會(huì)生效 
  73.          * 由于不同的設(shè)備,Camera的特性是不同的,所以在設(shè)置時(shí),需要首先判斷設(shè)備對(duì)應(yīng)的特性,再加以設(shè)置 
  74.          * 比如在調(diào)用setEffects之前最好先調(diào)用getSupportedColorEffects。如果設(shè)備不支持顏色特性,那么該方法將 
  75.          * 返回一個(gè)null 
  76.          */ 
  77.         try { 
  78.              
  79.             Camera.Parameters param = camera.getParameters(); 
  80.             if(this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE){ 
  81.                 //如果是豎屏 
  82.                 param.set("orientation""portrait"); 
  83.                 //在2.2以上可以使用 
  84.                 //camera.setDisplayOrientation(90); 
  85.             }else
  86.                 param.set("orientation""landscape"); 
  87.                 //在2.2以上可以使用 
  88.                 //camera.setDisplayOrientation(0);               
  89.             } 
  90.             //首先獲取系統(tǒng)設(shè)備支持的所有顏色特效,有復(fù)合我們的,則設(shè)置;否則不設(shè)置 
  91.             List<String> colorEffects = param.getSupportedColorEffects(); 
  92.             Iterator<String> colorItor = colorEffects.iterator(); 
  93.             while(colorItor.hasNext()){ 
  94.                 String currColor = colorItor.next(); 
  95.                 if(currColor.equals(Camera.Parameters.EFFECT_SOLARIZE)){ 
  96.                     param.setColorEffect(Camera.Parameters.EFFECT_SOLARIZE); 
  97.                     break
  98.                 } 
  99.             } 
  100.             //設(shè)置完成需要再次調(diào)用setParameter方法才能生效 
  101.             camera.setParameters(param); 
  102.              
  103.             camera.setPreviewDisplay(holder); 
  104.              
  105.             /** 
  106.              * 在顯示了預(yù)覽后,我們有時(shí)候希望限制預(yù)覽的Size 
  107.              * 我們并不是自己指定一個(gè)SIze而是指定一個(gè)Size,然后 
  108.              * 獲取系統(tǒng)支持的SIZE,然后選擇一個(gè)比指定SIZE小且最接近所指定SIZE的一個(gè) 
  109.              * Camera.Size對(duì)象就是該SIZE。 
  110.              *  
  111.              */ 
  112.             int bestWidth = 0
  113.             int bestHeight = 0
  114.              
  115.             List<Camera.Size> sizeList = param.getSupportedPreviewSizes(); 
  116.             //如果sizeList只有一個(gè)我們也沒有必要做什么了,因?yàn)榫退粋€(gè)別無選擇 
  117.             if(sizeList.size() > 1){ 
  118.                 Iterator<Camera.Size> itor = sizeList.iterator(); 
  119.                 while(itor.hasNext()){ 
  120.                     Camera.Size cur = itor.next(); 
  121.                     if(cur.width > bestWidth && cur.height>bestHeight && cur.width <MAX_WIDTH && cur.height < MAX_HEIGHT){ 
  122.                         bestWidth = cur.width; 
  123.                         bestHeight = cur.height; 
  124.                     } 
  125.                 } 
  126.                 if(bestWidth != 0 && bestHeight != 0){ 
  127.                     param.setPreviewSize(bestWidth, bestHeight); 
  128.                     //這里改變了SIze后,我們還要告訴SurfaceView,否則,Surface將不會(huì)改變大小,進(jìn)入Camera的圖像將質(zhì)量很差 
  129.                     surfaceView.setLayoutParams(new LinearLayout.LayoutParams(bestWidth, bestHeight)); 
  130.                 } 
  131.             } 
  132.             camera.setParameters(param); 
  133.         } catch (Exception e) { 
  134.             // 如果出現(xiàn)異常,則釋放Camera對(duì)象 
  135.             camera.release(); 
  136.         } 
  137.          
  138.         //啟動(dòng)預(yù)覽功能 
  139.         camera.startPreview(); 
  140.          
  141.     } 
  142.     @Override 
  143.     public void surfaceDestroyed(SurfaceHolder holder) { 
  144.         // 當(dāng)Surface被銷毀的時(shí)候,該方法被調(diào)用 
  145.         //在這里需要釋放Camera資源 
  146.         camera.stopPreview(); 
  147.         camera.release(); 
  148.          
  149.     } 
  150.     @Override 
  151.     public void onPictureTaken(byte[] data, Camera camera) { 
  152.         // data是一個(gè)原始的JPEG圖像數(shù)據(jù), 
  153.         //在這里我們可以存儲(chǔ)圖片,很顯然可以采用MediaStore 
  154.         //注意保存圖片后,再次調(diào)用startPreview()回到預(yù)覽 
  155.         Uri imageUri = this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues()); 
  156.         try { 
  157.             OutputStream os = this.getContentResolver().openOutputStream(imageUri); 
  158.             os.write(data); 
  159.             os.flush(); 
  160.             os.close(); 
  161.         } catch (Exception e) { 
  162.             // TODO: handle exception 
  163.             e.printStackTrace(); 
  164.         } 
  165.          
  166.         camera.startPreview(); 
  167.     } 
  168.      
責(zé)任編輯:徐川 來源: OSChina
相關(guān)推薦

2014-08-12 09:54:05

Android定制化啟動(dòng)器

2024-03-15 08:00:00

2024-09-14 14:09:40

2024-08-22 13:40:08

開發(fā)者GPT-4oepoch

2022-08-21 14:05:54

調(diào)試工具CDP

2021-09-02 07:04:45

Docker鏡像語言

2024-03-29 15:43:32

大型語言模型人工智能

2014-05-22 14:15:45

Android系統(tǒng)定制小技巧

2009-10-10 16:31:13

VB開發(fā)定制控件

2014-03-13 09:46:36

Linux操作系統(tǒng)開源

2011-04-02 11:46:50

UI嵌入式開發(fā)

2011-07-25 09:24:07

2014-08-26 10:05:37

框架開發(fā)AngularJS

2016-03-02 10:27:16

Python定制化Eclipse IDE

2023-11-26 00:17:21

2017-03-08 17:47:50

數(shù)據(jù)

2013-01-04 15:17:49

Android ROM

2019-04-08 16:41:55

Oomox圖形應(yīng)用Linux

2019-04-04 14:23:08

GTK2GTK3Linux

2012-04-26 22:32:01

Android
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)