2

私はしばらくの間上記に苦労しているので、本当に答えていただければ幸いです。

まず、私の主な目的は、インテントを受信したときに写真を撮ることです(ブロードキャストレシーバー内)。上記に対してかなりの数のアプローチを試みましたが、役に立ちませんでした。次の (視覚的にわかりやすくするために関連するコード スニペットを示しています) コードは、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 オブジェクト自体を作成することを考えましたが、そのためにはコンテキストとメイン アクティビティへの参照が必要です。これはインテントを使用して渡すことはできないと思います。これにより、ブロードキャスト レシーバー内で写真を撮る新しいアクティビティを開始するオプションが残されます。これも、あまりにも多くの作業を行うように見えます。前に述べたように、私はいくつかのアプローチを試みましたが、いずれも成功しませんでした。ここまで問題になるとは個人的には思いませんでした。回答者には本当に感謝し、感謝しています。

4

3 に答える 3

1

あなたが何をしようとしているのか 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);
            }
}
于 2013-09-01T00:06:27.627 に答える
0

さて、上記でしばらく苦労し、ハンドラーを使用するという上記の提案を取り入れた後、私はまだ完全な解決策に達していません。ただし、いくつかのテストの後、数枚の写真を撮るとアプリがクラッシュするようです. これは、キャプチャ ボタンをクリックしながら写真を撮る場合にも当てはまります。

現在、ハンドラーに次のコードを使用しています。

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

これは、高度なアンドロイドの概念と関係があると思いますか? おそらく何かがメモリ不足ですか?上記の観察に基づいて誰かが私にいくつかの提案をしてくれれば、本当に感謝しています。

于 2013-09-06T19:12:09.243 に答える