1

我有一个手电筒课,当我使用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");
        }

    }
}

日志猫:

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:致命异常:com.tyler.myapp.Torch.ledon(Torch.java:28)的主要 java.lang.NullPointerException

4

2 回答 2

3

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

于 2013-08-15T06:16:46.380 回答
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" />
于 2013-08-15T06:14:03.960 回答