私はしばらくの間上記に苦労しているので、本当に答えていただければ幸いです。
まず、私の主な目的は、インテントを受信したときに写真を撮ることです(ブロードキャストレシーバー内)。上記に対してかなりの数のアプローチを試みましたが、役に立ちませんでした。次の (視覚的にわかりやすくするために関連するコード スニペットを示しています) コードは、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);
ただし、インテントを受け取ると、アプリがクラッシュします。その理由は、写真を撮るということは、放送受信機の内部で行わなければならない仕事が多すぎるためではないかと感じました。(ボタンを使用した単純な画像キャプチャを使用してこの機能をテストしたところ、完全に機能しました。)
そこで、私が試みた 2 番目のアプローチは、インテントを受信したときに写真の撮影 (および写真の保存などのその他の関連タスク) を処理する Intentservice を作成することでした。
Service の onHandleIntent(Intent intent) メソッドに this.mCameraView.takePicture(filename) 関数が追加されました。ただし、インテントを使用して CameraView クラスをオブジェクトとしてこのサービスに渡す必要があります。このために、Serializable クラスを作成し、インテントの putExtra メソッドを使用してこれを渡してみました。何度かクラッシュした後、CameraView クラスがシリアル化できないことに気付きました (FrameLayout でカメラのプレビューを表示しています)。
上記を行う別の方法として、新しいサービス内に cameraView オブジェクト自体を作成することを考えましたが、そのためにはコンテキストとメイン アクティビティへの参照が必要です。これはインテントを使用して渡すことはできないと思います。これにより、ブロードキャスト レシーバー内で写真を撮る新しいアクティビティを開始するオプションが残されます。これも、あまりにも多くの作業を行うように見えます。前に述べたように、私はいくつかのアプローチを試みましたが、いずれも成功しませんでした。ここまで問題になるとは個人的には思いませんでした。回答者には本当に感謝し、感謝しています。