我正在使用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。
答案 0 :(得分:35)
这个问题实际上并不是关于Phonegap的。这也是本机Android应用程序的常见问题。
这是因为当触发相机时,android活动进入后台(onStop状态),等待相机拍照。然后GC在摄像机动作结束前杀死活动以释放记忆,当摄像机完成后,你的活动已经死亡。这就是应用程序重新启动的原因。
它位于Android Lifecycle docs(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 的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/
答案 1 :(得分:27)
请注意,如果您直接在Android手机上测试此应用程序,则“开发人员选项”中有一个名为“不要保留活动”的选项。选中此选项后,它会在您离开时删除该活动。特别是在相机(以及从您的活动中获得的其他应用程序)的情况下,它将重新启动您的活动。
取消选中此功能,看看是否有帮助。
答案 2 :(得分:4)
我有三星Galaxy Note II。我有同样的问题。我在AndroidManifest.xml中对此进行了更改,现在它适用于Samsung和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" />
答案 3 :(得分:2)
用户不想重新启动手机以释放内存,或选中“设置”中的复选框。我发现在离开相机后返回应用程序活动的用户友好方式是添加一行:
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
在此.cordova.startActivityForResult()尝试传回相机结果之前,摄像机cordova插件的CameraLauncher.java中的。这样可以确保检索旧活动,而不是进行垃圾回收并启动新实例。来自android Intent API:
int FLAG_ACTIVITY_CLEAR_TOP
&#34;如果设置,则正在启动的活动已经在运行中 当前任务,然后而不是启动它的新实例 活动,其上的所有其他活动将被关闭 这个意图将作为一个传递到(现在在顶部)旧活动 新的意图。&#34;
答案 4 :(得分:2)
当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。
答案 5 :(得分:1)
对我来说,它有助于使用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();
}
答案 6 :(得分:0)
我遇到了类似的问题,即使Camera Documentation提供的完整示例也会在Android设备(三星,Galaxy S)上崩溃应用程序。这是我得到的日志输出:
答案 7 :(得分:0)
我也有同样的问题。我清除了手机中的所有数据,以增加手机的内存大小。然后停止所有正在运行的应用程序并重新启动我的应用这次调用捕获事件时,我的应用程序没有崩溃。
基本上,内存较少的手机存在此问题。这在高端手机中可以正常使用。
注意:还要将这些额外参数添加到捕获的图像中:
navigator.camera.getPicture(onPhotoDataSuccess, onFail, {
quality: 20,
destinationType:Camera.DestinationType.DATA_URL,
targetWidth: 200,
targetHeight: 200,
saveToPhotoAlbum : true
});
答案 8 :(得分:0)
当您的设备活动被垃圾收集器杀死时,实际发生这种情况,当您的某些应用事件被触发时,您的默认活动会在后台进行,因此会被杀死。
要解决此问题,您需要转到开发人员选项在那里您会看到不要保留活动选项,只需取消选中即可。重启您的应用并立即尝试相机。它会顺利运作。