2014-01-03 2 views
0

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

package app.technozed.androlighter; 
import android.app.Activity; 
import android.hardware.Camera; 
import android.hardware.Camera.Parameters; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 

public class MainActivity extends Activity { 

boolean flashlightOn; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    flashlightOn = false; 
    setContentView(R.layout.activity_main); 

    Button onbut = (Button) findViewById(R.id.onbut); 
    //Button offbut = (Button) findViewById(R.id.offbut); 

    onbut.setOnClickListener(new View.OnClickListener() { 

public void onClick(View v) { 
    Camera cam; 
    cam = Camera.open(); 

    if (flashlightOn == false) {  
     Parameters p = cam.getParameters(); 
     p.setFlashMode(Parameters.FLASH_MODE_TORCH); 
     cam.setParameters(p); 
     cam.startPreview(); 
     flashlightOn = true; 
    } else { 
     cam.stopPreview(); 
     cam.release(); 
     flashlightOn=false; 
    } 
} 
    }); 
} 
} 

, но теперь я получаю java.lang.RuntimeException: Сбой подключения к службе камеры

E/AndroidRuntime(21183): FATAL EXCEPTION: main 
E/AndroidRuntime(21183): Process: app.technozed.androlighter, PID: 21183 
E/AndroidRuntime(21183): java.lang.RuntimeException: Fail to connect to camera service 
E/AndroidRuntime(21183): at android.hardware.Camera.native_setup(Native Method) 
E/AndroidRuntime(21183): at android.hardware.Camera.<init>(Camera.java:350) 
E/AndroidRuntime(21183): at android.hardware.Camera.open(Camera.java:324) 
E/AndroidRuntime(21183): at app.technozed.androlighter.MainActivity$1.onClick(MainActivity.java:27) 
E/AndroidRuntime(21183): at android.view.View.performClick(View.java:4438) 
E/AndroidRuntime(21183): at android.view.View$PerformClick.run(View.java:18422) 
E/AndroidRuntime(21183): at android.os.Handler.handleCallback(Handler.java:733) 
E/AndroidRuntime(21183): at android.os.Handler.dispatchMessage(Handler.java:95) 
E/AndroidRuntime(21183): at android.os.Looper.loop(Looper.java:136) 
E/AndroidRuntime(21183): at android.app.ActivityThread.main(ActivityThread.java:5017) 
E/AndroidRuntime(21183): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(21183): at java.lang.reflect.Method.invoke(Method.java:515) 
E/AndroidRuntime(21183): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
E/AndroidRuntime(21183): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
E/AndroidRuntime(21183): at dalvik.system.NativeStart.main(Native Method) 

мой Manifest:

<!-- Allows access to the flashlight --> 
    <permission android:name="android.permission.FLASHLIGHT" 
     android:permissionGroup="android.permission-group.HARDWARE_CONTROLS" 
     android:protectionLevel="normal" /> 

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

что неправильно Вот? Раньше у меня была эта ошибка, и речь шла о разрешении Manifest ... но что теперь?

ответ

2

В классе

private boolean mIsOn; 

А внутри OnCreate

onoff.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if (mIsOn) { 
       processOffClick(); 
       mIsOn = false; 
      } else { 
       processOnClick(); 
       mIsOn = true; 
      } 

     } 
    }); 
+0

Избили меня несколько минут;) +1 от меня – Melquiades

+0

Благодарности Melquiades я получил вы охвачены;) –

1
  1. Установить глобальный флаг, который будет указывать ли вспышка включена или выключена, говорят:

    private boolean flashIsOn; 
    
  2. Если успешно enab во главе со вспышкой установите флаг правда, где-то в processOnClick()

    flashIsOn = true; 
    
  3. Если успешно отключена вспышка, установите флаг в ложь, где-то в processOffClick()

    flashIsOn = false; 
    
  4. Теперь назначьте OnClickListener к кнопке и вызвать соответствующую функцию на основе состояния флага:

    onoff.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         if (flashIsOn) { 
          processOffClick(); 
         } else { 
          processOnClick(); 
         } 
        } 
    }); 
    
0

Я бы порекомендовал вам использовать ваш код этой

onoff.setOnClickListener(new OnClickListener() 

{ 
    @Override 
    public void onClick(View v) 
    { 

    //here you write the code 

    } 
}); 

для Вас, чтобы сделать его легче понять и писать я рекомендую вам написать, если заявление, что я имею в виду то, что вы пишете, если заявление что просто проверяет, включен ли светодиод ---> выключите его, и если светодиодный индикатор горит ---> выключите его, и этот код должен быть записан в методе onClick().

Надеется, что я мог бы помочь :)

Если бы я, пожалуйста, дайте мне знать :)

+0

эй, так теперь я использую вашу концепцию, но у меня ошибка времени выполнения, можете ли вы взглянуть, пожалуйста. Спасибо –

+0

Ваша ошибка не имеет ничего общего с созданной вами кнопкой: «Не удалось подключиться к службе камеры» ошибка объясняет это самостоятельно, вы тестируете приложение через свой телефон или через Android Virtual Device? – Owehbeh

+0

Телефон со светодиодной лампой –

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