2016-02-03 4 views
0

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

public class FlashFragment extends Fragment { 

private boolean isLighOn = false; 
private Camera camera; 
private Button button; 

public FlashFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_flash, container, false); 
    button = (Button) rootView.findViewById(R.id.buttonFlashlight); 

    Context context = getActivity(); 
    PackageManager pm = context.getPackageManager(); 

    // if device support camera? 
    if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 
     Log.e("err", "Device has no camera!"); 

    } 
    try{ 
     camera = Camera.open(); 
     final Camera.Parameters p = camera.getParameters(); 

     button.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 

       if (isLighOn) { 

        Log.i("info", "torch is turn off!"); 

        p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
        camera.stopPreview(); 
        isLighOn = false; 

       } else { 

        Log.i("info", "torch is turn on!"); 

        p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
        camera.startPreview(); 
        isLighOn = true; 

       } 

      } 
     }); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 

    // Inflate the layout for this fragment 
    return rootView; 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
} 
} 
+0

Вы добавили необходимые разрешения к вашему файлу AndroidManifest.xml? – Robbie188

+0

[очень первый абзац ...] (http://developer.android.com/reference/android/hardware/Camera.Parameters.html) – Selvin

ответ

0

Вы просто пропустили строку, чтобы установить параметры для камеры

camera.setParameters(p); 

Итак, ваш код onClickListener должен выглядеть примерно следующее

button.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 

      if (isLighOn) { 

       Log.i("info", "torch is turn off!"); 

       p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
       camera.setParameters(p); 
       camera.stopPreview(); 
       isLighOn = false; 

      } else { 

       Log.i("info", "torch is turn on!"); 

       p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
       camera.setParameters(p); 
       camera.startPreview(); 
       isLighOn = true; 

      } 

     } 
    }); 

Это должно решить вашу проблему. он всегда работает в моем случае.

1

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

Некоторые устройства являются чужими, чем другие.

Убедитесь, чтобы проверить, если вспышка существует

hasFlash = context.getPackageManager().hasSystemFeature(
      PackageManager.FEATURE_CAMERA_FLASH); 

Потом я узнал, что некоторые камеры нуждаются в surfaceTexture, чтобы включить вспышку (даже если это просто манекен один):

SurfaceTexture dummy = new SurfaceTexture(0); 
mCamera.setPreviewTexture(dummy); 

Для включения Я использовал этот метод:

public void enable() { 
    if (!isReady) { 
     return; 
    } 
    try { 
     mCamera.reconnect(); 
     mParameters.setFlashMode(Parameters.FLASH_MODE_TORCH); 
     mCamera.setParameters(mParameters); 
     mCamera.startPreview(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

Я не уверен, что больше, если было необходимо переподключение(). Но я уверен, что требуется startPreview().

И, наконец, у меня были некоторые устройства, которые приняты

Parameters.FLASH_MODE_ON 

вместо FLASH_MODE_TORCH. Странно, потому что Docs говорит что-то другое в этом режиме, но это то, что я испытал в прошлом (возможно, эта информация даже устарела).

Не забудьте снять камеру.

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

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