2

我已经在上述问题上苦苦挣扎了一段时间,所以非常感谢任何答案。

首先,我的主要目标是在收到意图(在广播接收器内)时拍照。我已经尝试了很多上述方法,但无济于事。以下(显示相关代码片段以使视觉清晰)代码说明了一种方法:

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 类并尝试使用意图的 putExtra 方法传递它。几次崩溃后,我意识到 CameraView 类不可序列化(它在 FrameLayout 中显示相机预览)。

我想到的另一种方法是在新服务中创建 cameraView 对象本身,但为此我需要上下文和对主要活动的引用——我认为不能使用意图传递。这留下了启动新活动以在广播接收器内拍照的选项 - 再次看起来做太多工作。正如我之前所说,我尝试了一些方法,但都没有取得成功。我个人认为不会有这么大的问题。我真的很感激并非常感谢任何回答者。

4

3 回答 3

1

我不是 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);
            }
}
于 2013-09-01T00:06:27.627 回答
0

好吧,这不是一个简单的任务。我在我的应用程序中做同样的事情。基本上流程很简单 - 当你收到广播时,你应该启动你的 Service / IntentService ,它将执行以下操作:

  • 从 BroadcastReceiver 获取参数
  • 获取部分唤醒锁
  • 启动打开相机的新线程,使用所有需要的参数(图像分辨率、压缩等)进行初始化,提供相机预览窗口(这是一个有问题的部分,我稍后会介绍),检查自动对焦和启动它,从自动对焦中获取回调并拍照。在回调中,您将拥有图片的二进制数据。最后不要忘记关闭相机。

现在关于预览表面 - 这里的问题是您没有活动上下文,因此预览窗口将是仅具有 NULL 表面的“虚拟”窗口。这个事实在不同的设备上产生了很多问题——在其中一些设备上它会起作用,而在另一些设备上它会失败。创建此窗口的代码是

cameraPreview = new SurfaceView(_serviceReference.get());
cameraPreview.setZOrderOnTop(true);                
cameraPreview.getHolder().setFormat(PixelFormat.TRANSPARENT);
camera.setPreviewDisplay(cameraPreview.getHolder());
camera.startPreview();
于 2013-09-24T16:29:15.320 回答
0

好的,所以在与上述问题斗争了一段时间并考虑到上述使用处理程序的建议之后,我仍然没有得到完整的解决方案。但是,经过一些测试,该应用程序似乎在拍了几张照片后就崩溃了。在单击捕获按钮时拍照也是如此。

目前,我正在为处理程序使用以下代码:

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

我认为这与一些先进的 android 概念有关?也许内存不足?如果有人可以根据上述观察给我一些建议,我将不胜感激。

于 2013-09-06T19:12:09.243 回答