Приложение зависает/замерзает при использовании функции camera.open() - требуется перезапуск устройства

Мое приложение довольно простое и простое, мне просто нужно открыть камеру (даже не отображая изображения, я прокомментировал код)

Итак, в основном, у меня есть что-то вроде:

@Override
public void onResume() {
    super.onResume();
    if (camera != null) {
        //Just to be sure
        camera.stopPreview();
        camera.setPreviewCallback(null);
        camera.release();
        camera = null;
    }

    Log.e("DebugCam", "Before");
    camera = Camera.open();
    Log.e("DebugCam", "After");
}

@Override
protected void onPause() {
    super.onPause();
    if (camera != null) {
        camera.stopPreview();
        camera.release();
        camera = null;
    }
}

Но мой логарифм просто отображает первое сообщение:

Before

Приложение просто висит, а мне нужно перезагрузить устройство, чтобы он снова работает!

Я действительно не понимаю, где проблема или как я мог, по крайней мере, избежать заморозки, которая действительно раздражает.

Я действительно не понимаю, как я мог отлаживать это...

Изменить: я видел это на отслеживании ошибок Android, кажется, что мне нужно обходное решение, поскольку патч был выпущен в июне) https://code.google.com/p/android/issues/detail?id=1578

Ответ 1

Проблема связана с вашими обновленными данными Rom, которые установлены на вашем мобильном телефоне. Невозможно ничего сделать, если вы не обновили свой Rom на своем мобильном телефоне.

Ответ 2

Я хотел обобщить всю информацию по проблеме, которую мне удалось найти.

Я провел некоторое исследование и нашел интересную и, вероятно, не очень тесно связанную тему о подобной проблеме в DroidForums:

Там они узнали, что SD-карта вызывала зависание (я не уверен, что это так сейчас, но будет хорошо, если кто-то может попробовать), и вот цитата оттуда:

Моя камера и видеокамера зависали, как и многие другие люди и я был разочарован.. в моих руках у меня есть телефон "как новый", надеясь, что помог бы... нет такой удачи... выяснил, что это было... SDHC CARD! простой формат карты и проблемы ушли.. чтобы проверить это самостоятельно перейдите к вашим основным настройкам и размонтируйте SD-карту, а затем перезапустите приложение камеры и посмотреть, если оно не замерзнет... если оно не нравится, не мой тогда у вас есть свой ответ... не совсем уверен, что на моей SDHC-карте вызвало это... все еще расследуется, но определенно что-то там... я буду обновлять, когда я узнаю, что именно для всех остальных

Надеюсь, что это поможет, и спасибо всем за множество советов, которые я использовал от этот форум...

UPDATE!!!

Я только что повторил ту же проблему с моим новым телефоном Gingerbread и я попробовал что-то новое... просто переместить несколько фотографий и видео с телефон и обратно их на ПК... работал как шарм... не нужно отформатируйте всю карту, просто дайте приложению камеры/видеокамеры немного места.. как если 5,5 ГБ было недостаточно, но эй, кто знал... теперь видео занимает только 1/2 второй, чтобы сохранить и камера снова работает нормально... просто подумал, что пусть все знают...

В общем, кажется, что карта памяти иногда вызывает проблему (или в большинстве случаев), поэтому, если вы можете отформатировать тот, который вы используете, или заменить его на новый, вы можете увидеть, если это проблема.

Далее об официальной ошибке, которая была зарегистрирована здесь (как вы упомянули): Очевидно, контрольный пример такой же, как и тот, который вы представили здесь, поскольку приложения, использующие Camera.open(), испытывают проблему в том же месте.

Цитата оттуда:

Судя по всему, Camera.open() сам зависает, не вызывая каких-либо исключений, так что нет ничего, что я мог бы поймать и действовать. Я могу тогда также не используйте встроенное приложение камеры, поскольку оно дает только черный предварительный просмотр экран и чуть позже сообщение о том, что я не отвечаю, когда я пытаюсь взаимодействовать с ним. Так как в приведенном выше фрагмент кода был уже ноль (при запуске программы), я ничего не могу выпуск: без камеры. релиз().

Хорошо, что это было исправлено в последнем выпуске, и несколько дней назад был комментарий (последний от 15 июля 2013 г.):

Спасибо за исправление, но есть ли обходной путь для устройства старше чем 22 июня 2013 года, когда был выпущен патч (что означает после 4.2.2 выпущен в феврале 2013 года...)

Надеюсь, мы получим обновленную информацию об этом, так что позвольте нам пожелать услышать новости о старых API.

Далее я нашел тему здесь (опять же, упомянув о проблеме с SD-картой; там не так много информации, но в любом случае):

Цитата оттуда:

И решение найдено: я удалил миниатюры в папке изображений моей SD-карты и перезагрузил телефон. Кажется, что немного окно миниатюр, которое указывает, что последний выстрел был ответственным за сбой приложения, по какой-то причине не удалось загрузить большие пальцы и сбой приложения.

Затем была эта тема на xda-Developers под названием "4.2 Android camera APK FIX!" (не волнуйтесь, это только для устройств с ROOTED :-():

Краткие инструкции взяты из ветки:

Camera apk: http://db.tt/xmpgkZIA

Добавьте этот apk в систему/приложение после первой установки камеры apk только для руководство по эксплуатации.    http://db.tt/OZF6D8fL

Это файлы lib, поместите их в разрешение исправления system/lib и перезагрузите.    http://db.tt/73lcCrcl http://db.tt/wQ7bfR8N

   Для тех, у кого устройство не поддерживается, измените следующие строки в build.prop и перезагрузиться:

ro.product.model=Galaxy Nexus ro.product.brand=google

Далее (просто чтобы упомянуть об этом широкой публике), я обнаружил это в AndroidCentral, просто ради этого, опять же "исправление" для корневых устройств.

На сайте sebertech я нашел эту тему, касающуюся проблемы камеры с Galaxy S3, и в основном это TouchWix - ССЫЛКА:

Для устройств Galaxy S3, которые страдают от проблем с производительностью, укоренение является первым шагом к решению этих проблем. Но надо принять во внимание риски, хотя уже есть безопасные способы рутировать телефон. Но прежде чем вы на самом деле решили сделать у меня есть кое-что, что я хочу, чтобы ты попробовал.

  1. Вспомните недавно установленные приложения, попробуйте отключить их и Посмотрите, есть ли улучшения в производительности вашего телефона. Несколько действительно тяжелые приложения, возможно, даже вызвали или способствовали проблема.
  2. Попробуйте очистить память, перейдя на главный экран и удерживая кнопка Домой. Список запущенных или недавно открытых приложений шоу; Вы просто должны провести пальцем влево или вправо, чтобы закрыть их. Я симпатичная уверен, что вы уже знали, как много приложений работают в фон.

Limit Galaxy S3 Processes

  1. На главном экране нажмите кнопку "Меню" и выберите "Настройки".
  2. Прокрутите вниз и нажмите на Опции разработчика.
  3. Найдите опцию "Ограничить фоновые процессы" и нажмите на нее.
  4. Ограничьте Galaxy S3 для запуска около 4 процессов одновременно или ниже.

Clear the data for TouchWiz

  1. На главном экране нажмите кнопку меню.
  2. Выберите "Настройки системы", затем "Диспетчер приложений"
  3. . Прокрутите вниз, чтобы найти TW, и нажмите "Очистить данные".

Если ничего не работает, возможно, пришло время рутировать ваше устройство и использовать более легкие и быстрые пользовательские ПЗУ и избавление от интерфейса TouchWiz.

Наконец, чтобы закончить этот длинный ответ, я хотел бы сказать, что, хотя я нашел очень мало исправлений/обходных путей для этого, я очень надеюсь, что Официальное исправление ошибок (снова связано, чтобы иметь это вещь, цитируемая еще раз), будет широко доступна, и не только для версий 4.xx Android, жаль, что у нас ее нет для более старых версий (что в любом случае связано с исправлением ошибки для старых API?).

Ответ 3

попробуйте следующее:

  @Override
 public void onResume() {
super.onResume();
if (camera != null) {
    //Just to be sure
    camera.stopPreview();
    camera.setPreviewCallback(null);
    camera.release();
    camera = null;
}

Log.e("DebugCam", "Before");
try {
    camera = Camera.open();// this is no safe way to open the camera
}catch(Exception e)
{
  e.printStackTrace();//get the exception on Logcat
}
Log.e("DebugCam", "After");
}

Прямо из DOCS

/** Безопасный способ получить экземпляр объекта Camera. */

public static Camera getCameraInstance(){
Camera c = null;
try {
    c = Camera.open(); // attempt to get a Camera instance
}
catch (Exception e){
    // Camera is not available (in use or does not exist)
}
return c; // returns null if camera is unavailable
}

Посмотрите: http://developer.android.com/guide/topics/media/camera.html#custom-camera

Ответ 4

У меня возникла аналогичная проблема, и это сработало для меня:

По-видимому, этот обратный вызов подавлял буферы данными для каждого кадра предварительного просмотра камеры.

camera.setPreviewCallback(new PreviewCallback() {
      public void onPreviewFrame(byte[] data, Camera arg1) {
      //invalidate surfaceview
      }
});

Удаление обратного вызова для меня. Надеюсь, поможет.:)

Ответ 5

Если вам нужно только открыть камеру, я буду использовать следующий код
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, actionCode);
для этого вам понадобится final static int actioncode=100; как переменная класса

Ответ 6

В onPause удалите SurfaceView из frameLayout, например:

@Override
protected void onPause() {
    super.onPause();
    if (camera != null) {
        camera.stopPreview();
        camera.setPreviewCallback(null);
        camera.release();
        camera = null;

        preview.removeView(mPreview);  //here preview is FrameLayout and mPreview is your camera SurfaceView.
    }
}