Приложение Phonegap завершает работу после того, как камера зафиксирует изображение. [Android] - программирование
Подтвердить что ты не робот

Приложение Phonegap завершает работу после того, как камера зафиксирует изображение. [Android]

Я получаю сообщение об ошибке с 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;
}
4b9b3361

Ответ 1

У меня была такая же проблема в течение 2 дней, пока я не установил, что у вас должен быть доступ к разрешению на получение файла изображения, который вы использовали в устройстве. По умолчанию нет разрешения на возврат изображения, чтобы он возвращал значение null, и ваше приложение вылетает.

Если вы используете Cordova/PhoneGap в XCode, вы также должны создать файл Config.xml в папке www и дать разрешение на доступ к файлу изображения.

<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

Ответ 3

Возможно, вашей мобильной памяти недостаточно, эта проблема не связана с телефоном. Это обычная проблема для собственных приложений для 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);
}

Ответ 4

Убедитесь, что ваш тег активности в вашем AndroidManifest.xml имеет следующий атрибут:

android:configChanges="orientation|keyboardHidden"

Изменение ориентации приведет к перезагрузке вашего приложения. Если вы действительно получаете сбой, запустите "adb logcat", чтобы зафиксировать возникшую ошибку.

Ответ 6

Понижение до 25 и использование <preference name="android-minSdkVersion" value="7" /> помогло мне!

Ответ 7

Для меня трюк состоял в том, чтобы изменить манифест:

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

to

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

Теперь он работает, но я понятия не имею, почему...

Ответ 8

У меня есть Samsung 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" />

Ответ 9

DATA_URI не рекомендуется время от времени, он не возвращается в приложение. Поскольку DATA_URI предоставляет строку base64, поэтому для некоторых устройств для этого недостаточно памяти. используйте FILE_URI, он безопасен для устройства Android.

если вам нужна строка Base64 означает, что вы скрыты после вызова captureSuccess, используя File readAsDataURL

ссылка на ссылку

Ответ 10

Попробуйте снизить параметр качества до 25. На некоторых устройствах недостаточно памяти на 50.