簡體   English   中英

Android在廣播接收器中異步拍照

[英]Android taking pictures asynchronously inside a broadcast receiver

我已經為上述問題苦苦掙扎了一段時間,因此,非常感謝您提供任何答案。

首先,我的主要目的是在收到意圖后(在廣播接收器內部)拍照。 我已經嘗試了很多上述方法,但無濟於事。 以下代碼(為了清晰起見,顯示了相關的代碼片段)代碼說明了一種方法:

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);

但是,當我收到意圖時,應用程序崩潰。 我覺得這背后的原因是拍照可能要求廣播接收機內部做太多的工作。 (我通過使用按鈕的簡單圖片捕獲測試了此功能,並且效果很好。)

因此,我嘗試的第二種方法是創建一個Intent服務,當接收到一個Intent時,該服務將處理拍照(以及其他相關任務,如存儲圖片)。

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

我想做上述事情的另一種方法是在新服務內部創建cameraView對象本身,但是為此,我需要上下文和對主活動的引用-我認為不能使用意圖來傳遞它。 這樣就可以選擇開始新的活動,以便在廣播接收器內拍攝照片-再次看起來工作量很大。 正如我之前所說,我已經嘗試了幾種方法,但是在任何一種方法中都沒有取得成功。 我個人認為這不會是一個問題。 我將非常感謝並非常感謝任何答復者。

我不是100%不確定您要做什么,但是聽起來您想在廣播時觸發某事(拍照)嗎?

為此,您可以在主要活動中創建一個處理程序,然后在收到廣播后向其發送消息。 這樣的事情在您的活動中。

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);
            }
}

好的,在經過一段時間的努力並考慮了使用處理程序的建議之后,我仍然沒有完整的解決方案。 但是,經過一些測試,該應用程序似乎在拍攝了幾張照片后崩潰了。 在單擊“捕獲”按鈕的同時拍照的情況也是如此。

目前,我正在為處理程序使用以下代碼:

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

我認為這與某些高級android概念有關嗎? 也許有些內存不足? 如果有人能根據上述觀察結果給我一些建議,我將不勝感激。

好吧,這不是一個簡單的任務。 我在應用程序中執行相同的操作。 基本上,流程很簡單-廣播后,您應該啟動Service / IntentService,它將執行以下操作:

  • 從BroadcastReceiver獲取參數
  • 獲取部分喚醒鎖
  • 啟動將打開相機的新線程,使用所有需要的參數(圖像分辨率,壓縮等)進行初始化,提供相機預覽窗口(這是一個有問題的部分,我稍后會介紹),檢查自動對焦並啟動它,從自動對焦中獲取回調並拍照。 在回調中,您將擁有圖片的二進制數據。 不要忘記最后關閉相機。

現在關於預覽圖面-這里的問題是您沒有Activity上下文,因此預覽窗將是僅具有NULL面的“虛擬”窗。 這個事實在不同的設備上造成了很多問題-在某些設備上它將起作用,而在其他設備上則將失敗。 創建此窗口的代碼是

cameraPreview = new SurfaceView(_serviceReference.get());
cameraPreview.setZOrderOnTop(true);                
cameraPreview.getHolder().setFormat(PixelFormat.TRANSPARENT);
camera.setPreviewDisplay(cameraPreview.getHolder());
camera.startPreview();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM