2012-07-24

Android camera應用(一) - 使用Intent調用其他服務幫忙拍照

使用相機功能應該也是很多寫應用程式的人想學習的

今天介紹用最簡單的方式調用其他有相機功能的服務幫我們拍照

這樣可以省去很多不必要的麻煩,簡化應用程式,下面就開始為您介紹


main.xml
<?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="vertical" >
<Button
   android:id="@+id/captureimage"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="使用其他服務幫忙拍照 "
   />
<ImageView
   android:id="@+id/imagecaptured"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   />
</LinearLayout>

DemoCameraActivity.java
package jim.demo.camera;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class DemoCameraActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //調用其他服務拍照按鈕
        Button buttonCamera = (Button)findViewById(R.id.captureimage);
        
        
       
        buttonCamera.setOnClickListener(new Button.OnClickListener(){
   public void onClick(View v) {
    //使用Intent調用其他服務幫忙拍照
     Intent intent_camera = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
     startActivityForResult(intent_camera, 0);
   }
         
        });
        
        
    }
    
    @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      //拍照後顯示圖片
      ImageView iv = (ImageView)findViewById(R.id.imagecaptured);
   if (resultCode == RESULT_OK)
     {
    //取出拍照後回傳資料
    Bundle extras = data.getExtras();
    //將資料轉換為圖像格式
          Bitmap bmp = (Bitmap) extras.get("data");
          //載入ImageView
          iv.setImageBitmap(bmp);
     }
   
     //覆蓋原來的Activity
     super.onActivityResult(requestCode, resultCode, data);
  }
}

執行後畫面




說明:

          使用Intent調用其他服務幫忙拍照主要只有簡單的二行


         Intent intent_camera = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent_camera, 0);

第一行是啟用呼叫其他有拍照功能的Intent 
         
第二行是執行呼叫,後面的"0"是參數,可以用來分辨用,下面說明(注)


//拍照後回傳監聽式
 protected void onActivityResult(int requestCode, int resultCode, Intent data)


data是照片資料

requestCode是剛剛回傳的參數 = 0(注)

resultCode判別按下的是確定或取消


注:為什麼會有這個參數,主要是因為不管是抓取手機內圖片或是拍照後


都是會回到onActivityResult這個監聽式,如果沒有用這個參數,就分辨不出是用哪個功能


也就沒辦法去接收相關的資料,拍照和抓取手機內圖片的接收方法是不同的


所以如果無法分辨,只用單一種方式接取是會出現錯誤的


後記:

           一般如果應用程式要做用拍照功能,需要在AndroidManifest.xml內


授予使用照相機權限, <uses-permission android:name="android.permission.CAMERA" />


而使用調用其他服務幫忙拍照不需要加入此權限也能拍照,因為拍照的是其他的服務


所以本身程式不需要加入權限,這是比較特別的地方。

4 則留言:

  1. 您好,請問我該如何把調用其他服務拍的照片解析度給放大呢?
    我看我的寬*高是120*160的 謝謝

    回覆刪除
    回覆
    1. 請參考Android Image應用(五) - 縮放、指定圖片大小

      (http://jim690701.blogspot.tw/2012/08/android-image.html)

      重點在照片抓回來後轉為Bitmap,轉為Bitmap後就可以處理(放大、縮小)

      所以你只要照片抓回來轉為Bitmap後去參考第5篇的縮放就可以做到你要的要求了

      刪除
  2. 你好
    我用你的程式碼執行後 且將它安裝在手機裡
    但是按了button後
    他卻沒有反應

    請問是手機設定問題
    (我已經開了usb偵錯模式了)
    還是程式碼哪裡需要修改

    謝謝

    回覆刪除

您的寶貴建議是我前進的動力!