2013-07-07 2 views
7

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

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_starting_point); 

    if(! getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) // checking if flash light is available inn android phone 
    { 
     Toast.makeText(StartingPoint.this, "Sorry this app can't work without flash light", Toast.LENGTH_LONG).show(); 
     finish(); 
    } 

    cam = Camera.open(); 

    param = cam.getParameters(); 


} 

@Override 
public void onClick (View v) 
{ 
     if(!flashOn) 
     { 
      i=0; 

      flashOn=true; 

      param.setFlashMode(Parameters.FLASH_MODE_TORCH); 
      cam.setParameters(param); 
      cam.startPreview(); 
     } 
     else{ 
       i=0; 

       flashOn=false; 

       param.setFlashMode(Parameters.FLASH_MODE_OFF); 
       cam.setParameters(param); 
       cam.stopPreview(); 
      } 

}

Я добавил эти разрешения в Android Manifest, а также.

<uses-permission android:name="android.permission.FLASHLIGHT"/> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera" /> 
<uses-feature android:name="android.hardware.camera.autofocus" /> 

С уважением

+1

Вы пытались установить эти линии cam = Camera.open(); param = cam.getParameters(); перед вашей первой операцией if() в onCreate()? – CENT1PEDE

+0

Вы протестировали это на всех устройствах? –

+0

Пожалуйста, проверьте код @ Ilya_Gazman на XOLO A600 или Moto G ... – Niko

ответ

0

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

public static Boolean hasFlashLight(Context context){ 
    return context.getApplicationContext().getPackageManager() 
      .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); 
} 

и отключить его и дальше:

Parameters params = mCamera.getParameters(); 
if (!isFlashlightOn) { 
    params.setFlashMode(Parameters.FLASH_MODE_OFF); 
} else { 
    params.setFlashMode(Parameters.FLASH_MODE_TORCH); 
} 
mCamera.setParameters(params); 

Дайте мне знать, если это сработает для вас.

+0

это не проблема, это уже реализовано – Niko

+0

Хорошо, я вижу сейчас, на каком устройстве вы тестируете это? У вас такая же проблема с другими устройствами? –

0

У меня была та же проблема. Используйте это

if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) { 
    //Flash ok 
    Parameters params = mCamera.getParameters(); 
    params.setFlashMode(Parameters.FLASH_MODE_TORCH); 
} else { 
    //Flash not supported 
} 

Определить, было ли ваше устройство мигает.

2

У меня есть приложение, которое проверяет функцию фонарика и работает отлично. Вот код, который я использовал для проверки, если пользователь имеет свет:

if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 
    new AlertDialog.Builder(this) 
    .setTitle("Sorry") 
    .setMessage("It appears that your device is incompatible with this app. Sorry for the inconvenience.") 
    .setNeutralButton("Close", new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface arg0, int arg1) { 
      finish(); 
     } 
    }).show(); 
    return; 
} 

Теперь на самом деле сделать легкую работу, я сделал кнопку переключения и написал следующий код:

private boolean isLightOn = false; 
private Camera camera; 
private ToggleButton button; 
public Vibrator v; 

if (camera == null) { 
    camera = Camera.open(); 
} 

final Parameters p = camera.getParameters(); 

button.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View arg0) { 

     if (isLightOn) { 

     Toast.makeText(context, "Light off!", Toast.LENGTH_SHORT).show(); 
     v.vibrate(40); 
     p.setFlashMode(Parameters.FLASH_MODE_OFF); 
     camera.setParameters(p); 
     camera.stopPreview(); 
     isLightOn = false; 

     } else { 

      Toast.makeText(context, "Light on!", Toast.LENGTH_SHORT).show(); 
     v.vibrate(40); 
     p.setFlashMode(Parameters.FLASH_MODE_TORCH); 
     camera.setParameters(p); 
     camera.startPreview(); 
     isLightOn = true; 

     } 

    } 
}); 

И, наконец, , вот только разрешения, которые я использовал:

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera" /> 

Примечание: Все выше код находится в методе OnCreate моей деятельности.

Надеюсь, что это поможет решить вашу проблему!

0

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

SurfaceView preview = (SurfaceView) findViewById(...); 
SurfaceHolder holder = preview.getHolder(); 
holder.addCallback(this); 
Camera camera = Camera.open(); 
camera.setPreviewDisplay(holder); 
+0

это правда? будет ли это работать? – Niko

+0

@Niko Нет, я просто сделал это, чтобы увидеть свою иконку на экране –

+0

hello @ user2498079 - вы проверили этот код ... пожалуйста, протестируйте его. – Niko

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