Java kitkat设备中的手电筒应用程序未关闭。完美地处理棉花糖

Java kitkat设备中的手电筒应用程序未关闭。完美地处理棉花糖,java,android,android-studio,Java,Android,Android Studio,这是我的手电筒应用程序的代码,它完全可以在我的牛轧糖和棉花糖设备上运行。但当我在kitkat设备上测试它时,手电筒完全打开了,但没有关闭。 我在这段代码中犯了什么错误?你能帮我找到它吗。。 我在网上没有找到任何解决办法。请帮忙 import android.Manifest; import android.annotation.TargetApi; import android.content.Context; import android.content.pm.PackageManager;

这是我的手电筒应用程序的代码,它完全可以在我的牛轧糖和棉花糖设备上运行。但当我在kitkat设备上测试它时,手电筒完全打开了,但没有关闭。 我在这段代码中犯了什么错误?你能帮我找到它吗。。 我在网上没有找到任何解决办法。请帮忙

import android.Manifest;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraManager;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;



public class MainActivity extends AppCompatActivity {


    Button btnSwitch;
    private Camera camera;
    private boolean isFlashOn;
    private boolean hasFlash;
    Camera.Parameters params;
    MediaPlayer mp;
    private static final String TAG = MainActivity.class.getSimpleName();
    private Camera mCamera;
    private Camera.Parameters parameters;
    private CameraManager camManager;
    private Context context;


    ImageView imageFlashlight;
    private static final int CAMERA_REQUEST = 50;
    private boolean flashLightStatus = false;

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

        imageFlashlight = (ImageView) findViewById(R.id.imageFlashlight);



        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setIcon(R.mipmap.ic_launcher);

        // First check if device is supporting flashlight or not
        hasFlash = getApplicationContext().getPackageManager()
                .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);


        final boolean hasCameraFlash = getPackageManager().
                hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
        boolean isEnabled = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                == PackageManager.PERMISSION_GRANTED;

        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setIcon(R.mipmap.ic_launcher);

        // get the camera


        // displaying button image


        imageFlashlight.setEnabled(isEnabled);

        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST);



        imageFlashlight.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View view) {
                if (hasCameraFlash) {

                    if (flashLightStatus) {
                        turnOffFlash();
                    } else

                        turnOnFlash();
                } else {
                    Toast.makeText(MainActivity.this, "No flash available on your device",
                            Toast.LENGTH_SHORT).show();
                }
            }


        });


    }



    @TargetApi(Build.VERSION_CODES.M)
    private void turnOnFlash() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

            try {
                String cameraId = cameraManager.getCameraIdList()[0];
                cameraManager.setTorchMode(cameraId, true);
                flashLightStatus = true;
                imageFlashlight.setImageResource(R.drawable.poweron);
            } catch (CameraAccessException e) {
            }
        } else {


            imageFlashlight.setImageResource(R.drawable.poweron);

            getCamera();
            params = camera.getParameters();
            params = camera.getParameters();
            params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
            camera.setParameters(params);
            camera.startPreview();
            isFlashOn = true;

        }
    }

    // Get the camera
    private void getCamera() {
        if (camera == null) {
            try {
                camera = Camera.open();
                params = camera.getParameters();
            } catch (RuntimeException e) {
                Log.e("Camera Error. ", e.getMessage());
            }
        }
    }


    @TargetApi(Build.VERSION_CODES.M)
    private void turnOffFlash() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

            try {
                String cameraId = cameraManager.getCameraIdList()[0];
                cameraManager.setTorchMode(cameraId, false);
                flashLightStatus = false;
                imageFlashlight.setImageResource(R.drawable.poweroff);
            } catch (CameraAccessException e) {
            }
        } else {
getCamera();
            if (flashLightStatus) {
                if (isFlashOn = true) {
                    return;
                }

                params = camera.getParameters();
                params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                camera.setParameters(params);
                camera.stopPreview();
                isFlashOn = false;
            }
        }


    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case CAMERA_REQUEST:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    imageFlashlight.setEnabled(true);
                } else {
                    Toast.makeText(MainActivity.this, "Permission Denied for the Camera", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
}
问题在于flashLightStatus,因为您没有在turnOnFlash方法的其他部分以及稍后在turnOffFlash中设置它

将永远不会为真,因此控制将永远不会达到关灯的程度,所以请这样做

@TargetApi(Build.VERSION_CODES.M)
private void turnOnFlash() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

        try {
            String cameraId = cameraManager.getCameraIdList()[0];
            cameraManager.setTorchMode(cameraId, true);
            imageFlashlight.setImageResource(R.drawable.poweron);
        } catch (CameraAccessException e) {
        }
    } else {


        imageFlashlight.setImageResource(R.drawable.poweron);

        getCamera();
        params = camera.getParameters();
        params = camera.getParameters();
        params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        camera.setParameters(params);
        camera.startPreview();

    }
       isFlashOn = true;
       flashLightStatus = true;
}
并且还使用

if (!isFlashOn) {
     return;
}
而不是

if (isFlashOn = true) {
    return;
}

当闪光灯不亮时返回控制

O上帝!非常感谢你,先生,你救了我。谢谢。请再问一个问题,我在这个叫做红色主题的主要活动上添加了一个按钮,它是蓝色的。当用户单击按钮时,他们将转到另一个活动,将出现与主活动相同的内容。只需点击颜色就会改变。我已经做了,活动得到了改变,但当我点击闪烁按钮时,它崩溃了。我是否需要更改第二个活动的任何方法来打开flash???@Adam只需按照左下角logcat视图中的崩溃错误详细信息查看原因并解决问题,然后在第二个活动中打开flash,您需要相同的设置,并且可能希望在“暂停”中关闭前一个活动的flash控制,rest取决于实现,您可以使用服务等
if (isFlashOn = true) {
    return;
}