PhoneGap 摄像头重启应用

Posted

技术标签:

【中文标题】PhoneGap 摄像头重启应用【英文标题】:PhoneGap camera restarts the application 【发布时间】:2012-01-12 04:14:32 【问题描述】:

我正在使用 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 ); 
    );
);

当我点击按钮时,它确实启动了相机,但是当我在拍照后点击相机应用上的“确定”时,它会重新启动应用。

我尝试过:

使用不同的来源类型。 使用不同的目的地类型。 降低质量。

有什么想法吗?

编辑:我也开始an issue at github。

【问题讨论】:

PhneGap 1.2?什么版本的安卓? PhoneGap 1.2,Android 2.3.7 MIUI phonegap 1.7 和 android 2.3 有同样的问题 能否请您更新 github 问题 URL。它已过时。 【参考方案1】:

这个问题实际上与Phonegap 无关。这也是原生 Android 应用的常见问题。

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

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

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

访问媒体库或导致您的活动进入后台的其他资源也会发生同样的情况。 Phonegap(现为 Cordova)团队已经在努力改进这一点 (https://issues.apache.org/jira/browse/CB-14)。

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

再见!


编辑 1:

我们提交了一个名为Foreground Camera Plugin的谷歌代码项目,修复了Android Camera重启Phonegap应用的问题。关于如何使用它也有一些方向。请看:http://code.google.com/p/foreground-camera-plugin/


编辑 2:

由于这个问题也发生在图库中,我们提交了另一个名为 Foreground Gallery Plugin 的 Google 代码项目,该项目与 Cordova 一起使用并修复了这个问题。请看:http://code.google.com/p/foreground-gallery-plugin/

【讨论】:

如果现在我不能用它拍照,那么首先使用PhoneGap的原因是什么?没有意义。 @vinicius 你没有考虑开源你的插件吗? 嗨@keune 我会先和我的团队谈谈,如果可以开源插件,我会尝试上传一个带有工作插件的“hello world”项目并通过这里的链接。但是感谢您的想法。 您好 Vicinius,您有计划将其更新到更高版本的 PhoneGap 吗? 不错的插件,但在实际的 phonegap 版本中已弃用,插件适用于 cordova 2.1,现在 cordova 是 3.1 版。在科尔多瓦 3.1 中,需要使用插件解决问题【参考方案2】:

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

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

【讨论】:

跳到***.com/questions/14615190/…,给自己打个绿勾。 谢谢!你的回答救了我。 这对我有用,是开发的好方法。但是我该如何做到这一点,以便我的用户不必执行此步骤? @wilblack 假设普通用户不使用“开发人员选项”,而仅来自实际开发人员,所以我想这回答了你的问题...... 您应该使用 Don't keep Activity on 进行一些测试,以确保您的应用程序正确地保持在低内存状态。【参考方案3】:

我有一台三星 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" />

【讨论】:

在 Galaxy S5 上的工作就像一个魅力(我刚刚从你的 sn-p 添加了第一行代码)。谢谢。【参考方案4】:

用户不想重启手机以释放内存,也不想选中“设置”中的复选框。我发现离开相机后返回应用程序活动的用户友好方式是添加以下行:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

在相机cordova 插件的CameraLauncher.java 中,就在this.cordova.startActivityForResult() 尝试传回相机结果之前。这可确保检索旧活动,而不是被垃圾收集并启动新实例。来自 android Intent API:

int FLAG_ACTIVITY_CLEAR_TOP

"如果设置,并且正在启动的活动已经在 当前任务,而不是启动该任务的新实例 活动,除此之外的所有其他活动都将关闭,并且 此 Intent 将作为 新意图。”

【讨论】:

对我不起作用 :( 应用程序仍然重新启动.. (cordova 4.1.2, Android 5.0.2) 我也将它与 Android lolipop、Samsung S5 和 cordova 3.5.0 绑定,但它不起作用。【参考方案5】:

当 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。

【讨论】:

【参考方案6】:

对我来说,使用 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 通知面板中看到它。但拍照后活动仍会重新开始。有任何想法吗?我像你的例子一样包装了相机和条形码调用。 抱歉,我无法提出好的建议是什么问题。似乎后台模式启动正常。所以也许你没有在相机插件的成功功能中先禁用背景模式?还是进入错误回调?【参考方案7】:

我遇到了类似的问题,即使Camera Documentation 提供的完整示例也会使 Android 设备(三星、Galaxy S)上的应用程序崩溃。这是我得到的日志输出:

【讨论】:

【参考方案8】:

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

基本上,内存较少的手机存在此问题。这适用于高端手机。

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

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

【讨论】:

【参考方案9】:

这实际上发生在您的设备活动被垃圾收集器杀死时,当您的某些应用程序事件被触发时,您的默认活动进入后台,因此它被杀死。

要解决此问题,您需要转到 Developer Options 在那里您会看到 Don't Keep Activities 选项,只需取消选中即可。重新启动您的应用程序并立即尝试使用相机。它会顺利运行。

【讨论】:

这并不能解决问题 - 该设置是为了让您可以在操作系统因持续低内存使用而终止应用程序时复制用例。如果用户正在运行您的应用程序的设备内存不足,它将终止该应用程序(执行此设置正在执行的操作)。

以上是关于PhoneGap 摄像头重启应用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Cordova/Phonegap 保存从手机摄像头拍摄的图像 Windows Phone 7

phonegap入门--4 Camera 摄像头

使用带有PhoneGap的设备摄像头

PhoneGap 应用程序可以使用服务器页面加载吗?

在 PhoneGap 中读取图像捕获文件

检查ios phonegap中的相机是不是存在