2013-08-31 95 views
1

我一直在努力與上述一段時間,所以真的很感謝任何答案。安卓在廣播接收器內異步拍照

首先,我的主要目標是當我收到一個意圖(在廣播接收器內)時拍照。 我已經嘗試了上述方法,但無濟於事。 以下(表示相關的代碼段的視覺清晰度)的代碼說明了一種方法:

public class ArduinoReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
takePictureUsingCamera(); 
} } 

函數takePictureUsingCamera()在與所述相機涉及一類調用函數(例如在顯示器中的FrameLayout相機預覽) 。這個特殊的函數調用android中的android takePicture函數:this.mPreview.mCamera.takePicture(null,null,this.mPicture);

但是,當我收到意圖,應用程序崩潰。我覺得背後的原因是拍攝照片可能要求在廣播接收機內完成太多的工作。 (我測試了這個功能,使用一個簡單的圖片捕捉按鈕,它完美的工作。)

所以,我嘗試的第二種方法是創建一個Intentservice,它將處理圖片的拍攝(和其他相關任務存儲圖片),當收到意圖時。

Service的onHandleIntent(Intent intent)方法現在將具有this.mCameraView.takePicture(filename)函數。但是,我需要將我的CameraView類作爲對象傳遞給此服務。爲此,我創建了一個Serializable類並嘗試使用intent的putExtra方法傳遞它。幾次崩潰後,我意識到CameraView類不是可序列化的(它在FrameLayout中顯示相機預覽)。

我想要做上述的另一種方法是在新服務中創建cameraView對象本身,但爲此我需要上下文和對主要活動的引用 - 我不認爲這可以通過intent傳遞。 這留下了開始一個新的活動,以在廣播接收器內拍照的選項 - 再次看起來像做了太多的工作。 正如我之前所說,我已經嘗試了一些方法,但沒有取得任何成功。我個人認爲它不會是這樣的問題。我真的很感激,對任何回答者都非常感謝。

回答

0

我不是100%確定你想要做什麼,但聽起來你想在觸發廣播時觸發某些事情(拍照)。

爲此,您可以在主要活動中創建一個Handler,然後在收到廣播時向其發送消息。在你的活動中有這樣的事情。

Handler myHandler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
         takePicture(); 
        } 
}); 

broadcastReceiver = new YourReceiverClass(myHandler); 

intentFilter = new IntentFilter(
      "your_package_name.YourReceiverClass"); 
    registerReceiver(broadcastReceiver, intentFilter); 

而且像這樣的接收器

private Handler handler; 
public YourReceiverClass(Handler handler) { 
    this.handler = handler; 
} 

public void onReceive(Context context, Intent intent) { 
    Bundle bundle = intent.getExtras(); 
    if (handler != null) { 
      handler.sendEmptyMessage(0); 
      } 
} 
+0

感謝NPN,這正是我想做的事 - 觸發拍攝照片時,我收到了廣播的情況發生。我會現在嘗試上述解決方案,如果它有效(或不),請再次評論。 – Abhi

+0

嗨npn,我試過上述解決方案。然而,應用程序崩潰拍照。我het以下錯誤信息:java.lang.RuntimeException:takePicture失敗,在 android.hardware.Camera.native_takePicture(本地方法)在 android.hardware.Camera.takePicture(相機。 java:948)。任何建議都是爲什麼會發生這種情況,或者如何去調試它。 – Abhi

+0

我在調試方面遠非專家,但對於我來說,當我獲得追溯時,我會回顧消息,直到找到來自我的代碼的調用。舉例來說,我把你剛纔發佈的內容映射到回溯消息的頂部?如果這樣看下去,並試圖找到代碼中的哪個語句觸發了這個回溯。然後你可以在調試器中設置一個斷點或者使用Log.d(「myTag」,「一些有用的信息」); – nPn

0

好了,上述掙扎了一會兒,並考慮到使用的處理程序的上述建議後,我還沒有練到完整解決方案但是,經過一些測試後,該應用程序似乎在拍了幾張照片後就崩潰了。在點擊捕捉按鈕的同時拍攝照片也是如此。

目前,我使用下面的代碼的處理程序:

Handler myHandler = new Handler(Looper.getMainLooper()) 
{ 
@Override 
public void handleMessage(Message msg) 
{ 
System.out.println("HANDLER received a message"); 
takePictureUsingCamera(); 
} 
}; 

我認爲這是與一些先進的Android概念呢?也許有些東西正在耗盡內存?如果有人能根據上述觀察結果給我一些建議,我會很感激。

0

嗯,這不是一個簡單的任務。我在我的應用程序中正在做同樣的事情。 基本上流程很簡單 - 當你得到了廣播,你應該開始您的服務/ IntentService這將做到以下幾點:

  • 從廣播接收器
  • 獲取PARAMS採集部分激活鎖定
  • 啓動打開攝像機的新線程,用所有需要的參數(圖像分辨率,壓縮等)進行初始化,提供攝像機預覽窗口(這是一個有問題的部分,稍後我會介紹),檢查自動對焦並啓動它,從自動對焦穫得回調並拍攝照片。在回調中你將獲得圖片的二進制數據。不要忘記在最後關閉相機。

現在關於預覽表面 - 這裏您沒有Activity上下文的問題,因此預覽窗口將只與NULL表面的「虛擬」窗口。這個事實在不同的設備上產生了很多問題 - 其中一些會起作用,另一些則會失敗。 創建此窗口的代碼是