Trực tiếp sử dụng Camera API được cung cấp bởi Android

Chúng tôi sẽ hướng dẫn các bạn lập trình android sử dụng Camera API để tích hợp Camera trong ứng dụng.
Đầu tiên bạn cần thuyết minh đối tượng Camera bởi sử dụng phương thức static được cung cấp bởi API gọi là Camera.open. Cú pháp như sau:
Camera object = null;
object = Camera.open(); 
Ngoài hàm trên, lớp Camera còn cung cấp một số hàm khác, như sau:
SttPhương thức & Miêu tả
getCameraInfo(int cameraId, Camera.CameraInfo cameraInfo)
Nó trả về thông tin về một camera cụ thể
getNumberOfCameras()
Nó trả về một số nguyên xác định các camera có sẵn trên thiết bị
lock()
Được sử dụng để khóa camera, vì thế các ứng dụng khác không thể truy cập nó
release()
Được sử dụng để mở khóa hay giải phóng camera đã khóa, và các ứng dụng khác có thể truy cập nó
open(int cameraId)
Được sử dụng để mở một camera cụ thể khi hỗ trợ nhiều camera
enableShutterSound(boolean enabled)
Được sử dụng để enable/disable cửa chớp (shutter) của khung chụp hình
Bây giờ bạn cần tạo một lớp riêng và kế thừa nó từ SurfaceView và triển khai SurfaceHolder Interface.
Hai lớp đã được sử dụng cho mục đích sau:
ClassMiêu tả
Camera
Được sử dụng để điều khiển Camera và chụp các hình hoặc ghi video từ camera
SurfaceView
Được sử dụng để biểu diễn một live camera tới người dùng
Bạn phải gọi phương thức Preview của lớp Camera để bắt đầu preview tới người dùng.
public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback {
   private Camera theCamera;
   
   public void surfaceCreated(SurfaceHolder holder) {
      theCamera.setPreviewDisplay(holder);
      theCamera.startPreview();
   }
   
   public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3){
   }
   
   public void surfaceDestroyed(SurfaceHolder arg0) {
   }
} 
Ngoài preview, ngoài ra còn có một số tùy chọn khác của camera có thể được thiết lập bởi sử dụng các hàm được cung cấp bởi Camera API.
SttPhương thức & Miêu tả
startFaceDetection()
Hàm này bắt đầu dò tìm bề mặt của Camera
stopFaceDetection()
Được sử dụng để dừng sự dò tìm bề mặt mà đã được kích hoạt bởi phương thức trên
startSmoothZoom(int value)
Nó nhận một giá trị nguyên và zoom màn hình camera về giá trị đó
stopSmoothZoom()
Nó được sử dụng để dừng việc zoom
stopPreview()
Nó được sử dụng để dừng preview
takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg)
Nó được sử dụng để kích hoạt/vô hiệu hóa shutter sound của việc ghi hình

Ví dụ

Ví dụ sau minh họa sự sử dụng của Camera API trong ứng dụng.
Để thực nghiệm ví dụ này, bạn cần thiết bị Mobile thực sự được trang bị phiên bản Android OS mới nhất, bởi vì có thể Camera không được hỗ trợ bởi Emulator.
Sau đây là nội dung của Main Activity file đã được sửa đổi: src/MainActivity.java.
package com.example.sairamkrishna.myapplication;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;

import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;

import android.graphics.Bitmap;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;

import android.os.BatteryManager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;

import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;

import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import java.util.ArrayList;
import java.util.Set;

public class MainActivity extends Activity implements SurfaceHolder.Callback {
   Camera camera;
   SurfaceView surfaceView;
   SurfaceHolder surfaceHolder;
   
   Camera.PictureCallback rawCallback;
   Camera.ShutterCallback shutterCallback;
   Camera.PictureCallback jpegCallback;
   
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      
      surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
      surfaceHolder = surfaceView.getHolder();
      
      surfaceHolder.addCallback(this);
      surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
      
      jpegCallback = new PictureCallback() {
         
         @Override
         public void onPictureTaken(byte[] data, Camera camera) {
            FileOutputStream outStream = null;
               try {
                  outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));
                  
                  outStream.write(data);
                  outStream.close();
               }
               
               catch (FileNotFoundException e) {
                  e.printStackTrace();
               }
               
               catch (IOException e) {
                  e.printStackTrace();
               }
               
               finally {
               }
               
               Toast.makeText(getApplicationContext(), "Picture Saved", Toast.LENGTH_LONG).show();
               refreshCamera();
            }
         };
      }
      
      public void captureImage(View v) throws IOException {
         camera.takePicture(null, null, jpegCallback);
      }
      
      public void refreshCamera() {
         if (surfaceHolder.getSurface() == null) {
            return;
         }
         
         try {
            camera.stopPreview();
         }
         
         catch (Exception e) {
         }
         
         try {
            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();
         }
         catch (Exception e) {
      }
   }
   
   @Override
   protected void onDestroy() {
      super.onDestroy();
   }
   
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.menu_main, menu);
      return true;
   }
   
   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
      // Handle action bar item clicks here. The action bar 
      // automatically handle clicks on the Home/Up button, so long
      // as you specify a parent activity in AndroidManifest.xml.
      
      int id = item.getItemId();
      
      //noinspection SimplifiableIfStatement
      if (id == R.id.action_settings) {
         return true;
      }
      return super.onOptionsItemSelected(item);
   }
   
   @Override
   public void surfaceCreated(SurfaceHolder holder) {
      try {
         camera = Camera.open();
      }
      
      catch (RuntimeException e) {
         System.err.println(e);
         return;
      }
      
      Camera.Parameters param;
      param = camera.getParameters();
      param.setPreviewSize(352, 288);
      camera.setParameters(param);
      
      try {
         camera.setPreviewDisplay(surfaceHolder);
         camera.startPreview();
      }
      
      catch (Exception e) {
         System.err.println(e);
         return;
      }
   }
   
   @Override
   public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
      refreshCamera();
   }
   
   @Override
   public void surfaceDestroyed(SurfaceHolder holder) {
      camera.stopPreview();
      camera.release();
      camera = null;
   }
}
Sửa đổi nội dung của the res/layout/activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
   android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
   
   <TextView android:text="Camera Example" android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/textview"
      android:textSize="35dp"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true" />
      
   <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point"
      android:id="@+id/textView"
      android:layout_below="@+id/textview"
      android:layout_centerHorizontal="true"
      android:textColor="#ff7aff24"
      android:textSize="35dp" />
      
   <SurfaceView
      android:id="@+id/surfaceView"
      android:layout_width="match_parent"
      android:layout_height="0dp"
      android:layout_weight="1"/>
      
</RelativeLayout>
Sửa đổi nội dung của the res/values/string.xml
<resources>
   <string name="app_name">My Application</string>
   <string name="hello_world">Hello world!</string>
   <string name="action_settings">Settings</string>
</resources>
Sửa đổi nội dung của the AndroidManifest.xml và thêm permission như sau.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.camera1"
   android:versionCode="1"
   android:versionName="1.0" >
   
   <uses-permission android:name="android.permission.CAMERA" />
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
   <uses-feature android:name="android.hardware.camera" />
   <uses-feature android:name="android.hardware.camera.autofocus" />

   <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
      
      <activity
         android:name="com.example.sairamkrishna.myapplication.MainActivity"
         android:label="@string/app_name" >
      
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
         
      </activity>
      
   </application>
</manifest>
Cuối cùng, bạn chạy ứng dụng Android vừa tạo ở trên.
Hãy click http://vnskills.com/ để đăng ký tham gia các khóa học về tất cả các ngôn ngữ lập trình, thiết kế web, photoshop… 

0 nhận xét:

Đăng nhận xét

 
Top