2016-07-13 3 views
4

Я искал проблему, чтобы исправить проблему в течение нескольких дней, и сейчас я абсолютно уверен. Я пробовал все, и я не нахожу причины, почему приложение «Моя камера» бросает мне исключение для службы.Процесс, в котором работает служба камеры, неожиданно скончался

В данном случае. Я использую библиотеку HDR jni, которую я уже проверяю, и она отлично работает. Это не память собственной памяти, и это не проблема jni. Таким образом, проблема должна быть в моем коде:

Я просто жду на CaptureResult, чтобы вернуть мне AE_CONVERGED_STATE, чтобы проверить, если датчик уже принять правильную экспозицию, а затем я называю свой метод:

Log.performanceEnd("YUV capture"); 
     Log.d(TAG, "[onImageAvailable] YUV capture, mBurstCount: " + mBurstCount); 
     Image image = imageReader.acquireNextImage(); 
     if (mBackgroundHandler != null) { 
      mBackgroundHandler.post(new YuvCopy(image, mBurstCount)); 
     } 
     mBurstCount++; 

     if (mBurstState == BURST_STATE_HDR) { 
      switch (mBurstCount) { 
       case 1: 
        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, HDR_EXPOSURE_COMPENSATION_VALUE_HIGH); 
        break; 
       case 2: 
        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, HDR_EXPOSURE_COMPENSATION_VALUE_LOW); 
        break; 
       case 3: 
        //Restore exposure compensation value 
        mCaptureCallback = mPhotoCaptureCallback; 
        mSettingsManager.setExposureCompensation(mPreviewRequestBuilder); 
        mActivity.runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          onPictureCaptured(); 
         } 
        }); 
        unlockFocus(); 
        break; 
      } 
      if (mBurstCount != 3) { 
       updatePreviewSession(); 
      } 
      //Finish HDR session 
      if (mBurstCount < YUV_BURST_LIMIT) mHdrState = STATE_PICTURE_TAKEN; 
     } 

Вот мой метод YUV:

/** 
* Transform YUV420 to NV21 readable frames 
*/ 
private class YuvCopy implements Runnable { 
    private final Image mImage; 
    private final int mPictureIndex; 

    public YuvCopy(Image image, int index) { 
     mImage = image; 
     mPictureIndex = index; 
    } 

    @Override 
    public void run() { 
     if (mImage != null) { 
      if (mImage.getWidth() * mImage.getHeight() > 0) { 
       Image.Plane[] planes = mImage.getPlanes();     

       long startCopy = System.currentTimeMillis(); 

       int width = mImage.getWidth(); 
       int height = mImage.getHeight(); 
       int ySize = width * height; 
       ByteBuffer yBuffer = mImage.getPlanes()[0].getBuffer(); 
       ByteBuffer uvBuffer = mImage.getPlanes()[1].getBuffer(); 
       ByteBuffer vuBuffer = mImage.getPlanes()[2].getBuffer(); 
       byte[] mData = new byte[ySize + (ySize/2)]; 
       yBuffer.get(mData, 0, ySize); 
       vuBuffer.get(mData, ySize, (ySize/2) - 1); 
       mData[mData.length - 1] = uvBuffer.get(uvBuffer.capacity() - 1); 
       mImage.close(); 

       mHdrCaptureArray[mPictureIndex] = mData; 

       Log.i(TAG, "[YuvCopy|run] Time to Copy data: " + (System.currentTimeMillis() - startCopy) + "ms"); 

       if (mPictureIndex == YUV_BURST_LIMIT - 1) { 
        startHdrProcessing(); 

       } else { 
        mImage.close(); 
       } 

      } 
     } 
    } 

Я собираю в общей сложности три фотографии, а затем я называю метод слияния моей библиотеки JNI. Я попытался прокомментировать весь jni-код, и это все еще происходит, поэтому я думаю, что, возможно, проблема должна быть здесь, в моем методе YUV или, возможно, в вызове Burst HDR.

Наконец вот моя ошибка журнала, когда он happends:

01-01 12:30:27.531 21945-21957/com.myCamera W/AudioSystem: AudioFlinger server died! 
01-01 12:30:27.532 21945-22038/com.myCamera W/AudioSystem: AudioPolicyService server died! 
1-01 12:30:27.903 21945-21978/com.myCamera I/CameraManagerGlobal: Connecting to camera service 
01-01 12:30:27.903 21945-21978/com.myCamera E/CameraManagerGlobal: Camera service is unavailable 
01-01 12:30:27.903 21945-21978/com.myCamera W/System.err: android.hardware.camera2.CameraAccessException: Camera service is currently unavailable 
01-01 12:30:29.103 21945-21945/com.myCamera W/System.err: android.hardware.camera2.CameraAccessException: Process hosting the camera service has died unexpectedly 

Иногда это занимает всего 2 фотографии, а иногда и 300, но в конце концов, это все еще происходит. Кроме того, много раз все мое устройство почти мертво, и все работает отлично, поэтому мне нужно перезагрузить свой телефон.

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

Большое вам спасибо!

ответ

1

И, наконец, проблема была вызвана тем, что у меня была неправильная конфигурация моих ImageReaders, в зависимости от уровня аппаратного обеспечения телефона камера может разрешать различные типы imageReaders с разными размерами для каждого из них. Например, INFO_SUPPORTED_HARDWARE_LEVEL == FULL не поддерживает конвертер изображений JPEG, сконфигурированный до максимального размера устройства, а другой с форматом YUV по размеру предварительного просмотра в этот момент. Во всяком случае, иногда это может работать, а иногда и терпит неудачу.

Если приложение пытается создать сеанс с использованием набора целей, которые превышают пределы, описанные в приведенных ниже таблицах, может возникнуть одна из трех возможных возможностей. Во-первых, сеанс может быть успешно создан и работать нормально. Во-вторых, сеанс может быть успешно создан, но устройство камеры не будет удовлетворять гарантиям частоты кадров, как описано в getOutputMinFrameDuration (int, Size). Или, в-третьих, если набор выходных данных не может быть использован вообще, создание сеанса завершится неудачно, при вызове onConfigureFailed (CameraCaptureSession).

Цитата: https://developer.android.com/reference/android/hardware/camera2/CameraDevice.html

Это означает, что мое устройство не может иметь читателя YUV изображений сконфигурировано до 4608x3456 размера, когда мой JPEG ImageReader конфигурирован таким же размера тоже. Он может поддерживать только мой размер предварительного просмотра (1920x1080). Вы можете проверить все возможные конфигурации в этом link.

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

Удачного дня!

+0

У меня была очень похожая ошибка, но причина была другая. Я потратил несколько часов, чтобы найти точную причину ... И в конце концов я нашел ее после того, как прочитал некоторые первые строки, где вы начинаете объяснять «неправильную конфигурацию моих ImageReaders». В моем случае речь шла о пользовательских вспышках ... Спасибо за идею –

Смежные вопросы