2014-12-23 5 views
1

Я застрял здесь с проблемой. Попытка построить приложение-факел. Работает нормально, но когда я переключаю фрагмент или перехожу на рабочий стол и возвращаюсь, вспышка не работает. Ошибка подключения к службе камеры.Cant open Camera Servoce Android

Я думаю, что проблема в том, что я создаю новый экземпляр камеры, а новый кант больше не подключается к камере. Но как мне его решить?

public class FlashCameraManager { 

private boolean isFlashOn; 
private Camera camera; 
public Camera.Parameters params; 


// getting camera parameters 
public void getCamera() { 
    if (camera == null) { 
     try { 
      camera = Camera.open(); 
      params = camera.getParameters(); 
     } catch (RuntimeException e) { 
      camera = null; 
      Log.e("Camera Error. Failed to Open. Error: ", e.getMessage()); 
     } 
    } else { 
     camera.release(); 
     camera = null; 
    } 
} 

public void FlashOnOff() 
{ 
    //Flash Aktivieren oder deaktivieren 
    if (isFlashOn) 
    { 
     //Turn Flash off 

     if (camera == null || params == null) { 
      return; 
     } 

     params = camera.getParameters(); 
     params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
     camera.setParameters(params); 
     camera.stopPreview(); 

     isFlashOn = false; 
     Log.d("FlashCameraManager", "Turning Flash off"); 
    } 
    else 
    { 
     // Turn Flash on 
     if (camera == null || params == null) { 
      return; 
     } 
     params = camera.getParameters(); 
     params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
     camera.setParameters(params); 
     camera.startPreview(); 

     isFlashOn = true; 
     Log.d("FlashCameraManager", "Turning Flash on"); 

    } 
} 

public boolean isFlashActive() 
{ 
    //Prüfen ob Flash an oder aus ist 
    return isFlashOn; 
}} 

Это из MainActivity

 final ImageButton flash = (ImageButton) rootView.findViewById(R.id.none_flash); 
    if(camera == null) { 
     camera = new FlashCameraManager(); 
    } 
    camera.getCamera(); 

    flash.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     //Content 
     if (camera.isFlashActive()) 
     { 
      //Turn Flash off 
      camera.FlashOnOff(); 
      Log.d("NoneFragment", "Turning Flash off"); 
      flash.setActivated(false); 
     } 
     else 
     { 
      //Turn Flash on 
      camera.FlashOnOff(); 
      Log.d("NoneFragment", "Turning Flash on"); 
      flash.setActivated(true); 
     } 

    }}); 

ответ

0

После того, как вы сделали с камерой (т.е. до выхода из приложения или запуска другой деятельности), убедитесь, что вы освободить ресурсы камеры с помощью вызова метода release() , который в Руководстве API «Отключает и освобождает ресурсы объекта камеры». Руководство по API также дает некоторое представление о правильном использовании класса и выполнении простых операций, таких как задание изображения. Руководство по API можно найти здесь:

http://developer.android.com/reference/android/hardware/Camera.html

Вы могли бы также рассмотреть вопрос о принятии взгляда на новой камере API (android.hardware.camera2), в качестве текущего API, который вы используете нежелателен уровня API 21. руководство для нового API можно найти здесь:

http://developer.android.com/reference/android/hardware/camera2/package-summary.html

+0

Спасибо за вашу помощь. camera.release() был ключевым. Поместите его в onPause() в моем фрагменте, чтобы камера автоматически остановилась. – Nick

+0

Другие вопросы: к какому уровню API работает камера2. Только 21, или я не прав? – Nick

+0

Вы правы, android.hardware.camera2 доступен только для уровня API 21 и выше, поэтому, возможно, это не лучший выбор, если вы хотите поддерживать старые устройства; просто хотел сообщить вам, что API, который вы используете в настоящее время, устарел и, возможно, не лучший выбор для будущей разработки. – Willis