【问题标题】:How to assign a Button to processOnClick?如何将按钮分配给 processOnClick?
【发布时间】:2014-01-21 18:13:11
【问题描述】:

该过程的代码不是最好的,或者启用相机太复杂了。 我决定换成更简单的东西。 就是这个

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: Fail to connect to camera service

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)

我的清单:

 <!-- 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 权限的……但是现在呢?

【问题讨论】:

    标签: android process flashlight


    【解决方案1】:

    在你的课堂上

        private boolean mIsOn;
    

    在 onCreate 里面

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

    【讨论】:

    • 领先我几分钟 ;) +1 来自我
    • 感谢 melquiades 让我了解你 ;)
    【解决方案2】:
    1. 设置一个全局标志来指示闪光灯是打开还是关闭,例如:

      private boolean flashIsOn;
      
    2. 如果成功启用 flash,则在 processOnClick() 中的某处将标志设置为 true

      flashIsOn = true;
      
    3. 如果成功禁用 flash,则在 processOffClick() 中的某处将标志设置为 false

      flashIsOn = false;
      
    4. 现在,将 OnClickListener 分配给您的按钮并根据标志状态调用相应的函数:

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

    【讨论】:

      【解决方案3】:

      我建议你像这样使用你的代码

      onoff.setOnClickListener(new   OnClickListener()
      
      {
        @Override
        public   void   onClick(View   v) 
           {
      
           //here you write the code
      
           }
      }); 
      

      为了让你更容易理解和编写我建议你写一个if语句,我的意思是你写一个if语句,它只是检查led灯是否亮--->打开它关闭,如果led灯亮--->关闭它,代码应该写在onClick()方法中。

      希望我能帮上忙:)

      如果我这样做了,请告诉我:)

      【讨论】:

      • 嘿,现在我正在使用你的概念,但是我遇到了运行时错误,请你看看。谢谢
      • 您的错误与您创建的按钮无关,它显示Fail to connect to camera service 错误解释它自己,您是通过手机还是通过 Android 虚拟设备测试您的应用程序?
      • 带 LED 灯的手机
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 2014-03-02
      • 2016-02-19
      • 2013-12-28
      • 1970-01-01
      相关资源
      最近更新 更多