溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android中怎么調用Camera

發(fā)布時間:2021-06-24 16:14:15 來源:億速云 閱讀:134 作者:Leah 欄目:移動開發(fā)

Android中怎么調用Camera,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

首先是布局文件,線性布局,左邊兩個按鈕垂直擺放,右邊預覽圖以及照相獲取到的圖:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="fill_parent"     android:layout_height="fill_parent"     android:orientation="horizontal" >      <LinearLayout         android:layout_width="200dip"         android:layout_height="150dip"         android:orientation="vertical" >          <Button             android:id="@+id/btn1"             android:layout_width="80dip"             android:layout_height="50dip"             android:text="Start takPic" />          <Button             android:id="@+id/btn2"             android:layout_width="80dip"             android:layout_height="50dip"             android:text="Get Pic" />     </LinearLayout>      <LinearLayout         android:id="@+id/cameraView"         android:layout_width="200dip"         android:layout_height="150dip"         android:orientation="vertical" >     </LinearLayout>  </LinearLayout>

代碼,都寫在一起的。包含一個自定義的surfaceView(用于相機的照相預覽).以及activit:

  1. package com.nico; 

  2.  

  3. import java.io.ByteArrayInputStream; 

  4. import java.io.IOException; 

  5.  

  6. import android.app.Activity; 

  7. import android.content.Context; 

  8. import android.graphics.PixelFormat; 

  9. import android.graphics.drawable.BitmapDrawable; 

  10. import android.graphics.drawable.Drawable; 

  11. import android.hardware.Camera; 

  12. import android.os.Bundle; 

  13. import android.os.Environment; 

  14. import android.util.Log; 

  15. import android.view.SurfaceHolder; 

  16. import android.view.SurfaceView; 

  17. import android.view.View; 

  18. import android.view.Window; 

  19. import android.view.WindowManager; 

  20. import android.view.View.OnClickListener; 

  21. import android.widget.Button; 

  22. import android.widget.LinearLayout; 

  23.  

  24. public class Test extends Activity implements OnClickListener { 

  25.     /** Called when the activity is first created. */ 

  26.  

  27.     // camera 類 

  28.     private Camera camera = null; 

  29.     // 繼承surfaceView的自定義view 用于存放照相的圖片 

  30.     private CameraView cv = null; 

  31.  

  32.     // 回調用的picture,實現里邊的onPictureTaken方法,其中byte[]數組即為照相后獲取到的圖片信息 

  33.     private Camera.PictureCallback picture = new Camera.PictureCallback() { 

  34.  

  35.         @Override 

  36.         public void onPictureTaken(byte[] data, Camera camera) { 

  37.             // 主要就是將圖片轉化成drawable,設置為固定區(qū)域的背景(展示圖片),當然也可以直接在布局文件里放一個surfaceView供使用。 

  38.             ByteArrayInputStream bais = new ByteArrayInputStream(data); 

  39.             Drawable d = BitmapDrawable.createFromStream(bais, Environment 

  40.                     .getExternalStorageDirectory().getAbsolutePath() 

  41.                     + "/img.jpeg"); 

  42.             l.setBackgroundDrawable(d); 

  43.             try { 

  44.             } catch (Exception e) { 

  45.                 e.printStackTrace(); 

  46.             } 

  47.         } 

  48.  

  49.     }; 

  50.  

  51.     // 按鈕 布局等定義,不作贅述 

  52.     Button btn1 = null; 

  53.     Button btn2 = null; 

  54.     LinearLayout l = null; 

  55.  

  56.     @Override 

  57.     public void onCreate(Bundle savedInstanceState) { 

  58.         super.onCreate(savedInstanceState); 

  59.  

  60.         requestWindowFeature(Window.FEATURE_NO_TITLE); 

  61.         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 

  62.                 WindowManager.LayoutParams.FLAG_FULLSCREEN); 

  63.         getWindow().setFormat(PixelFormat.TRANSLUCENT); 

  64.         setContentView(R.layout.main); 

  65.  

  66.         l = (LinearLayout) findViewById(R.id.cameraView); 

  67.         btn1 = (Button) findViewById(R.id.btn1); 

  68.         btn2 = (Button) findViewById(R.id.btn2); 

  69.  

  70.         btn1.setOnClickListener(this); 

  71.         btn2.setOnClickListener(this); 

  72.     } 

  73.  

  74.     //主要的surfaceView,負責展示預覽圖片,camera的開關 

  75.     class CameraView extends SurfaceView { 

  76.  

  77.         // 

  78.         private SurfaceHolder holder = null; 

  79.  

  80.         public CameraView(Context context) { 

  81.             super(context); 

  82.             holder = this.getHolder(); 

  83.  

  84.             holder.addCallback(new SurfaceHolder.Callback() { 

  85.  

  86.                 @Override 

  87.                 public void surfaceChanged(SurfaceHolder holder, int format, 

  88.                         int width, int height) { 

  89.                     Camera.Parameters parameters = camera.getParameters(); 

  90.                     //以下注釋掉的是設置預覽時的圖像以及拍照的一些參數 

  91.                     // parameters.setPictureFormat(PixelFormat.JPEG); 

  92.                     // parameters.setPreviewSize(parameters.getPictureSize().width, 

  93.                     // parameters.getPictureSize().height); 

  94.                     // parameters.setFocusMode("auto"); 

  95.                     // parameters.setPictureSize(width, height); 

  96.                     camera.setParameters(parameters); 

  97.                     camera.startPreview(); 

  98.                 } 

  99.  

  100.                 @Override 

  101.                 public void surfaceCreated(SurfaceHolder holder) { 

  102.                     camera = Camera.open(); 

  103.  

  104.                     try { 

  105.                         //設置camera預覽的角度,因為默認圖片是傾斜90度的 

  106.                         camera.setDisplayOrientation(90); 

  107.                         //設置holder主要是用于surfaceView的圖片的實時預覽,以及獲取圖片等功能,可以理解為控制camera的操作.. 

  108.                         camera.setPreviewDisplay(holder); 

  109.                     } catch (IOException e) { 

  110.                         camera.release(); 

  111.                         camera = null; 

  112.                         e.printStackTrace(); 

  113.                     } 

  114.  

  115.                 } 

  116.  

  117.                 @Override 

  118.                 public void surfaceDestroyed(SurfaceHolder holder) { 

  119.                     //顧名思義可以看懂 

  120.                     camera.stopPreview(); 

  121.                     camera.release(); 

  122.                     camera = null; 

  123.                 } 

  124.             }); 

  125. //          holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

  126.         } 

  127.     } 

  128.  

  129.     @Override 

  130.     public void onClick(View v) { 

  131.         if (v == btn1) { 

  132.             l.removeAllViews(); 

  133.             cv = new CameraView(Test.this); 

  134.             LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 

  135.                     LinearLayout.LayoutParams.FILL_PARENT, 

  136.                     LinearLayout.LayoutParams.FILL_PARENT); 

  137.             l.addView(cv, params); 

  138.         } else if (v == btn2) { 

  139.             camera.takePicture(null, null, picture); 

  140.         } 

  141.     } 

  142. }

看完上述內容,你們掌握Android中怎么調用Camera的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI