2013-08-31 47 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表面的“虚拟”窗口。这个事实在不同的设备上产生了很多问题 - 其中一些会起作用,另一些则会失败。 创建此窗口的代码是