PhoneGap相机重新启动应用程序

我正在使用PhoneGap的navigator.camera.getPicture函数从Android设备的相机中检索照片。

 function onSuccess(imageData) { alert("Success!"); } function onFail(message) { alert('Failed because: ' + message); } $(function() { $("button").tap(function() { navigator.camera.getPicture(onSuccess, onFail, { quality: 50 }); }); }); 

当我点击button,它确实启动相机,但是当我拍照后点击相机应用程序上的确定,它会重新启动应用程序。

我尝试过了:

  • 使用不同的来源types。
  • 使用不同的目标types。
  • 降低质量。

有任何想法吗?

编辑:我也开始在github问题 。

Related of "PhoneGap相机重新启动应用程序"

这个问题实际上并不是关于Phonegap的。 这也是原生android应用程序的常见问题。

这是因为当相机被触发时,android活动进入后台(onStop状态),等待相机拍照。 然后在相机动作结束之前,GC来到并杀死活动以释放记忆,当相机完成时,您的活动已经死亡。 这就是为什么应用程序重新启动。

这是在Android生命周期文档( http://developer.android.com/reference/android/app/Activity.html ):

如果一项活动完全被另一项活动所遮蔽,它将被停止。 它仍然保留所有的状态和成员信息,但是用户不再可见,所以它的窗口被隐藏起来,并且在其他地方需要内存时通常会被系统杀死。

通过访问导致您的活动背景的媒体库或其他资源也会发生同样的情况。 Phonegap(现在的cordova)团队已经在努力改善这个( https://issues.apache.org/jira/browse/CB-14 )。

我们公司遇到了这个问题,解决scheme是本机开发一个Phonegap插件来使用我们定制的相机,然后我们的活动永远不会进入onStop状态。 请按照http://developer.android.com/guide/topics/media/camera.html#custom-camera上的android API说明进行操作。

再见!


编辑1:

我们提供了一个名为Foreground Camera Plugin的Google Code项目,它修复了Android Camera重新启动Phonegap应用程序的问题。 也有一些如何使用它的方向。 请参阅: http : //code.google.com/p/foreground-camera-plugin/


编辑2:

由于这个问题也出现在图库中,我们提交了另一个名为Foreground Gallery Plugin的 Google Code项目,它与Cordova一起工作并修复了这个问题。 请参阅: http : //code.google.com/p/foreground-gallery-plugin/

请注意,如果您正在Android手机上直接testing此应用程序,则在“ 开发人员选项 ”中有一个名为“ 不要保留活动 ”的选项。 当这个选项被选中时,它将在您离开时消除该活动。 特别是在相机的情况下(和其他应用程序从您的活动中午餐),它将重新开始您的活动。

取消选中,看看是否有帮助。

我有一个三星Galaxy Note II。 我有同样的问题。 我在AndroidManifest.xml中改变了这个,现在它可以在三星和HTC Thunderbolt上运行

 <uses-feature android:name="android.hardware.camera" android:required="false"/> <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="10"/> <activity android:configChanges="orientation|keyboardHidden" /> 

用户不想重新启动手机来释放内存,或者在“设置”中选中一个框。 用户友好的方式,我发现离开相机后返回到我的应用程序的活动,是添加行:

 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

在摄像头cordova插件的CameraLauncher.java之前,此.cordova.startActivityForResult()尝试传回摄像头结果。 这可以确保检索旧活动,而不是垃圾回收和新实例的启动。 从android的意图API:

int FLAG_ACTIVITY_CLEAR_TOP

“如果已设置,并且正在启动的活动已经在当前任务中运行,则不会启动该活动的新实例,而是closures其上的所有其他活动,并将此Intent交付给(现在作为一个新的意图“老活动”。

当Android完成拍照后重新启动应用程序时,将向应用程序发送resume事件。 该事件包含拍摄的照片数据。 所以,一个可能的解决方法涉及捕获事件:

 document.addEventListener('resume', function(evt) { if(evt.action === 'resume' && evt.pendingResult) { var r = evt.pendingResult; if(r.pluginServiceName === 'Camera' && r.pluginStatus === 'OK') { // r.result contains file:/// url or a base64 image. } } }, false); 

当然,你也必须恢复应用程序的状态。 为此,请将您的状态信息保存到例如。 在打开相机之前使用localStorage。

这实际上是当你的设备活动被垃圾收集器杀死时,当你的一些应用程序事件被触发,你的默认活动在后台,因此被杀害。

要解决这个问题,你需要去开发者选项在那里你会看到选项不要保留活动 ,只需取消选中。 重新启动您的应用程序,现在尝试相机 它会工作顺利。

对我来说,它有助于使用cordova背景插件: https : //www.npmjs.com/package/cordova-plugin-background-mode

包含到config.xml中:

 <gap:plugin name="cordova-plugin-background-mode" source="npm"/> 

然后触发点击事件启动相机插件,并发送应用程序到后台:

 $(document).on("click","#btn_bild_aufnehmen",function(){ cordova.plugins.backgroundMode.setDefaults({ text:'desc',title:'appname'}); cordova.plugins.backgroundMode.enable(); //do your camera stuff }); 

不要忘记在相机插件成功的情况下禁用背景模式:

 cordova.plugins.backgroundMode.disable(); 

当然也可以禁用它onResume并启用它onPause:

 function onResume(){ window.plugin.backgroundMode.disable(); } function onPause(){ window.plugin.backgroundMode.enable(); } 

我有一个类似的问题,甚至在相机文档中提供的完整示例在Android设备(Samsung,Galaxy S)上崩溃应用程序。 这里是我得到的日志的输出:

在这里输入图像说明

我也有同样的问题。 我清除了手机中的所有数据,以增加手机的内存大小。 然后停止所有正在运行的应用程序并重新启动我的应用 这次捕获事件被称为我的应用程序没有崩溃。

内存较less的手机基本上存在这个问题。 这将在高端手机中正常工作。

注意:还要将这些额外的参数添加到捕获的图像中:

  navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 20, destinationType:Camera.DestinationType.DATA_URL, targetWidth: 200, targetHeight: 200, saveToPhotoAlbum : true });