Taschenlampen App blockiert Kamera?
Hi ich wollte eine eigene Taschenlampe programmieren hab dies auch halbwegs Erfolgreich getan. Doch habe ich folgendes Problem:
Wenn ich die App öffne und die Lampe an und aus mache, sie dann schließe und die Handy Kamera, Snapchat oder änliches öffne kommt die Nachricht: Warnung Kamerafehler!
Ich schätze das die App die Kamera blockiert. Wie kann ich das beheben??
ActivityMain.java
import android.content.pm.PackageManager; import android.hardware.Camera; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.CompoundButton; import android.widget.Switch; import android.widget.Toast; import android.widget.ToggleButton;
public class MainActivity extends AppCompatActivity{
ToggleButton togglebtn;
Camera camera;
Camera.Parameters pam;
boolean lighton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
togglebtn = (ToggleButton) findViewById(R.id.toggleButton);
togglebtn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked == true){
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)){
if (camera == null){
camera = Camera.open();
}
pam = camera.getParameters();
pam.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(pam);
camera.startPreview();
lighton = true;
}else{
Toast.makeText(getApplicationContext(), "keine LED-Lampe vorhanden", Toast.LENGTH_SHORT).show();
}
}
if (isChecked == false){
lightoff();
}
}
});
}
public void lightoff(){
if (lighton == false) {
camera = Camera.open();
}
pam = camera.getParameters();
pam.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(pam);
camera.stopPreview();
lighton = false;
}
@Override
protected void onPause(){
if (lighton == true) {
lightoff();
camera.release();
}
super.onPause();
}
@Override
protected void onResume() {
togglebtn.setChecked(false);
super.onResume();
}
}
Danke im vorraus:)
1 Antwort
Du rufst
camera.release();
beim Verlassen der Activity nur auf, wenn der Blitz eingeschaltet ist
Ist der Blitz gerade aus dann ist:
if (lighton == true) {
nicht erfüllt und die Camera wird nicht freigegeben und ist dadurch für andere Apps blockiert.
Ich würde vorschlagen die Camera IMMER in onResume zu öffnen
und IMMER in onPause mit
camera.release();
wieder freizugeben - egal ob der Blitz gerade an oder aus ist.
Denn solange deine Taschenlampe App im Vordergrund ist willst Du ja die Kontrolle über die Kamera haben...
Bei OnResume macht es dann ggf. Sinn den Blitz vor Aufruf von camera.release() abzuschalten falls eingeschaltet ist
Gute Antwort.
Nur schreibt bitte nicht (wie in Lehrbüchern aus den 70er Jahren, wo es in einigen Sprachen leider nicht anders möglich war)
if(isChecked == true) // Das ist der Tod jedes großen Progarmmes
schreibt stattdessen
if(isChecked)
oder
if(! isLighton)
Warum wohl? Bei den heute oftmals durch Cola und Chips verklebten Tastaturen geschieht ab und zu folgendes:
if(isChecked = true) // und voila: verloren!
ein
if(true == isChecked) kann könnte man ja gerade noch verstehen.
Ebenso in der Sprache C oder C++:
niemals
if(x == 4)
aber immer:
if(4 == x)
(warum wohl?)