我的手电筒第一次工作,强制关闭下一个

时间:2013-08-15 05:59:40

标签: java android

我有一个火炬课,当我使用ledon()我的手电筒开启时。 当我使用ledoff()时,它会关闭。 但是如果我再次尝试重新开启它,我会收紧力量。 然后,如果我尝试,它会再次打开。

部队关闭的原因是什么?

import android.hardware.Camera;
import android.util.Log;

import static android.hardware.Camera.*;

/**
* Created by tyler on 8/13/13.
*/
public class Torch {
    private static final String TAG = "Light";
    private static Camera mCamera;
    private static Camera.Parameters mParameters;

    public static Camera getCameraInstance() {
        Camera c = null;
        try {
            c = open();
        } catch (Exception e) {
        }
        return c;
    }

    public static void ledon()
    {
        mCamera = getCameraInstance();
        mParameters = mCamera.getParameters();
        mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        mCamera.setParameters(mParameters);
        Log.d(TAG, "Turn On");
    }

    public static void ledoff(MainActivity activity) {       
        String flashMode = mParameters.getFlashMode();

        if (Camera.Parameters.FLASH_MODE_OFF.equals(flashMode)) {
            mCamera = getCameraInstance();
        }

        mParameters = mCamera.getParameters();
        mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        mCamera.setParameters(mParameters);
        Log.d(TAG, "Turn Off");
    }
}
编辑:这是我更新的代码,它会关闭并打开我想要的所有代码,但是当我打开然后再打开时,它会强制关闭。 Logcat下面的代码。

import android.hardware.Camera;
import android.util.Log;

/**
* Created by tyler on 8/13/13.
*/
public class Torch {

private static final String TAG =  "Light";
private static Camera mCamera;
private static Camera.Parameters mParameters;
public static Camera getCameraInstance() {
    Camera c = null;
        try {
            c = mCamera.open();
        } catch (Exception e) {
    }
    return c;

}


public static void ledon() {

        mCamera = getCameraInstance();
        mParameters = mCamera.getParameters();
        String flashMode = mParameters.getFlashMode();
            if (! flashMode.equals(Camera.Parameters.FLASH_MODE_TORCH)) {
            mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
            mCamera.setParameters(mParameters);
            Log.d(TAG, "Turn On"); 
        }
    }
public static void ledoff() {
        String flashMode = mParameters.getFlashMode();
            if (! flashMode.equals(Camera.Parameters.FLASH_MODE_OFF)) {
            mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
            mCamera.setParameters(mParameters);
            mCamera.release();
            Log.d(TAG, "Turn Off");
        }

    }
}

logcat的:

08-15 12:01:10.502 25951-25951 / com.tyler.myapp W / dalvikvm:threadid = 1:线程退出,未捕获异常(group = 0x4170f898) 08-15 12:01:10.522 25951-25951 / com.tyler.myapp E / AndroidRuntime:FATAL EXCEPTION:main         显示java.lang.NullPointerException         在com.tyler.myapp.Torch.ledon(Torch.java:28)

2 个答案:

答案 0 :(得分:3)

我不确定,因为我没有检查它,但我认为因为你正在更新ledOff中的mParameters。

尝试这种方法

public static void ledSwitch() {

            mCamera = getCameraInstance();
            mParameters = mCamera.getParameters();
            String flashMode = mParameters.getFlashMode();
            if (Camera.Parameters.FLASH_MODE_OFF.equals(flashMode)) {
                mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                Log.d(TAG, "Turn On");  
            } else {
                mCamera.release()
                mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                Log.d(TAG, "Turn Off");
            }
}

这种方法会检查它是否会关闭,如果它关闭则会启用它。

我从Levente Kurusa那里拿走了.release():D

已更新 -

尝试这个,作为HTC用户,我在阅读时使用不同的相机方式,所以我在网上搜索了你。

public static Camera mCameraDevice;
private static List<String> flashModes; 
private static String currentFlashMode; 

Camera.Parameters param = mCameraDevice.getParameters();
flashModes = param.getSupportedFlashModes();

if (flashModes != null) {
    currentFlashMode = param.getFlashMode();

    if (currentFlashMode.equals(Parameters.FLASH_MODE_OFF)) {
       currentFlashMode = Parameters.FLASH_MODE_ON;
    }
    else {
       currentFlashMode = Parameters.FLASH_MODE_OFF;
    }

    param.setFlashMode(currentFlashMode);
    mCameraDevice.setParameters(param);
}

&安培;&安培;不要忘记使用这些权限

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

答案 1 :(得分:3)

没有你的logcat,没有人可以确定你的问题是什么,但我怀疑是什么。调用ledon后,您应该调用mCamera.release()告诉Android系统您不再使用相机。如果你不打电话,在下次调用ledon时,你会尝试分配一个新的Camera对象,但是一个应用程序使用id = 0的Camera,这是你的应用程序,因此它会抛出一个RuntimeException。你抓住它,然后将mCamera设置为null,然后再引用mCamera,因此我怀疑是NullPointerException