相机捕获图像后,Phonegap应用程序退出。 [Android]产品

时间:2012-02-16 00:15:20

标签: android cordova camera

我在Phonegap 1.4.1上收到错误。

我创建的phonegap应用程序在我拍照后返回应用程序后重新启动。

以下是我正在使用的代码:

function capturePhoto() {
  // Take picture using device camera and retrieve image as base64-encoded string
  navigator.camera.getPicture(onPhotoURISuccess, onFail, { quality: 50, destinationType: Camera.DestinationType.FILE_URI });
}

function onPhotoURISuccess(imageURI) {
  // Uncomment to view the image file URI 
  // console.log(imageURI);

  // Get image handle
  //
  var largeImage = document.getElementById('largeImage');

  // Unhide image elements
  //
  largeImage.style.display = 'block';

  // Show the captured photo
  // The inline CSS rules are used to resize the image
  //
  largeImage.src = imageURI;
}

10 个答案:

答案 0 :(得分:4)

我在2天内遇到同样的问题,直到我知道您应该获得获取设备中的图像文件的权限。默认情况下,没有返回图像的权限,因此它返回null并且您的应用程序崩溃。

如果您在XCode中使用Cordova / PhoneGap,那么您还应该在www文件夹中创建Config.xml文件并授予访问该图像文件的权限。

<feature name="http://api.phonegap.com/1.0/device" />
<feature name="http://api.phonegap.com/1.0/battery"/>
<feature name="http://api.phonegap.com/1.0/camera"/>
<feature name="http://api.phonegap.com/1.0/contacts"/>
<feature name="http://api.phonegap.com/1.0/file"/>
<feature name="http://api.phonegap.com/1.0/geolocation"/>
<feature name="http://api.phonegap.com/1.0/media"/>
<feature name="http://api.phonegap.com/1.0/network"/>
<feature name="http://api.phonegap.com/1.0/notification"/>

如果您正在使用Android,请在AndroidManifest.xml文件上授予权限。

您可以在此处找到config.xml文件的所有内容: https://build.phonegap.com/docs/config-xml

答案 1 :(得分:2)

使用foreground-camera-plugin会解决这个问题:

https://code.google.com/p/foreground-camera-plugin/

答案 2 :(得分:2)

可能是你的移动内存不够,这个问题实际上并不是关于Phonegap的。这也是本机Android应用程序的常见问题。因为当触发相机时,android活动会进入后台(onStop状态),等待相机拍摄照片。然后GC在摄像机动作结束前杀死活动以释放记忆,当摄像机完成后,你的活动已经死亡。这就是应用程序重新启动的原因。

这是我的建议

1.更换cramer插件,避免使用自定义插件启动垃圾回收,(http://code.google.com/p/foreground-camera-plugin/http://code.google.com/p/foreground-gallery-插件/) 2.如果不足以杀死其他进程,则检测内存,活动释放内存 3.提高生存率,尽量避免在所选系统中释放内存。

    private void clearMemory(boolean killAll)
{
    mklog("当前系统可用内存大小是:" + getAvailMemory(getApplicationContext()));
    ActivityManager activityManger = (ActivityManager) this
            .getSystemService(ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> list = activityManger
            .getRunningAppProcesses();
    if (list != null)
        for (int i = 0; i < list.size(); i++)
        {
            ActivityManager.RunningAppProcessInfo apinfo = list.get(i);

            System.out.println("pid            " + apinfo.pid);
            System.out.println("processName              "
                    + apinfo.processName);
            System.out
                    .println("importance            " + apinfo.importance);
            String[] pkgList = apinfo.pkgList;

            if (apinfo.importance >= ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND
                    || (killAll && apinfo.importance >= ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE))
            {
                // Process.killProcess(apinfo.pid);
                for (int j = 0; j < pkgList.length; j++)
                {
                    activityManger.killBackgroundProcesses(pkgList[j]);
                    mklog("准备杀死进程:" + pkgList[j]);
                }
            }

        }

    mklog("清理之后 当前系统可用内存大小是:" + getAvailMemory(getApplicationContext()));
}

private long getAvailMemory(Context context)
{
    ActivityManager am = (ActivityManager) context
            .getSystemService(Context.ACTIVITY_SERVICE);
    MemoryInfo mi = new MemoryInfo();
    am.getMemoryInfo(mi);
    return mi.availMem / (1024 * 1024);
}   
      public void mklog(String contentString)
{
    Log.i("Web Console", contentString);
}

答案 3 :(得分:1)

确保AndroidManifest.xml中的活动代码具有以下属性:

android:configChanges="orientation|keyboardHidden"

方向更改将导致您的应用重新加载。如果您实际上遇到了崩溃,请运行​​“adb logcat”来捕获正在发生的错误。

答案 4 :(得分:1)

这个问题实际上并不是关于Phonegap的。这也是本机Android应用程序的常见问题。

请参阅PhoneGap camera restarts the application

答案 5 :(得分:1)

降低到25并使用<preference name="android-minSdkVersion" value="7" />帮助了我!

答案 6 :(得分:0)

对我来说,诀窍是修改清单:

<uses-sdk android:minSdkVersion="11" android:targetSdkVersion="14"/>

<uses-sdk android:minSdkVersion="7" />

它现在有效,但我不知道为什么......

答案 7 :(得分:0)

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

答案 8 :(得分:0)

有时不推荐

DATA_URI ,它不会返回应用。因为 DATA_URI 给出了base64字符串,所以有些设备没有足够的内存。仅使用 FILE_URI ,它对于Android设备是安全的。

如果您需要Base64字符串,则意味着您在使用文件readAsDataURL

调用captureSuccess后进行隐蔽

ref this link

答案 9 :(得分:-1)

尝试将质量参数降低到25.某些设备的内存不足50。