Фрагмент фонарика Android Studio

Я создал фрагмент фонарика для своего приложения, и я реализовал этот код, и включение фонарика работает, но я не могу его выключить.

Я пробовал включать и выключать свет с одной кнопки или как сейчас с двух, но это не имело значения.

Когда я переключаю фрагмент, свет выключается.

Надеюсь, кто-нибудь знает, что делать. Спасибо




public class Flashlight extends Fragment implements SurfaceHolder.Callback {

    private View view;
    Button button_On, button_Off;

    private boolean lightIsOn = false;


    Camera camera;
    android.hardware.Camera.Parameters parameters;

    @Override
    public void onStart() {
        super.onStart();
        SurfaceView preview = (SurfaceView) getView().findViewById(R.id.PREVIEW);
        SurfaceHolder mHolder = preview.getHolder();
        mHolder.addCallback(this);
    }

    @Override
    public void onPause() {
        super.onPause();
        turnOffLight();
    }

    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
                             final Bundle savedInstanceState) {

        view = inflater.inflate(R.layout.fragment_flashlight, container, false);

        button_On = (Button) view.findViewById(R.id.button_On);
        button_Off = (Button) view.findViewById(R.id.button_Off);


        if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.CAMERA,}, PackageManager.PERMISSION_GRANTED);
        }
        if (!getActivity().getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
            Toast.makeText(getActivity(), "Device has no flashlight", Toast.LENGTH_SHORT).show();
        }


        button_On.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                    turnOnLight();

            }
        });

        button_Off.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                turnOffLight();
            }
        });

        return view;
    }

Включить/выключить свет:

    private void turnOnLight() {
        if (!lightIsOn) {
            if (camera == null || parameters == null) {
                return;
            }
            parameters = camera.getParameters();
            parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
            camera.setParameters(parameters);
            camera.startPreview();
            lightIsOn = true;
        }
    }

    private void turnOffLight() {

        if (lightIsOn) {
            if (camera == null || parameters == null) {
                return;
            }

            parameters = camera.getParameters();
            parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
            camera.setParameters(parameters);
            camera.stopPreview();
            lightIsOn = false;
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if (camera != null) {
            camera.stopPreview();
            camera.setPreviewCallback(null);
            camera.release();
            camera = null;
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        if (camera == null) {
            camera = Camera.open();
            parameters = camera.getParameters();
            try {
                camera.setPreviewDisplay(holder);
            } catch (IOException e) {
                camera.release();
                camera = null;
            }
        }
    }

}

Манифест:

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

XML:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Flashlight">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <SurfaceView
            android:id="@+id/PREVIEW"
            android:layout_width="1dp"
            android:layout_height="1dp"
            android:layout_marginBottom="730dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <Button
                android:id="@+id/button_On"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="on" />

            <Button
                android:id="@+id/button_Off"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="off" />

        </LinearLayout>


    </androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>

person P.Trenkle    schedule 10.09.2019    source источник


Ответы (2)


Хорошо, обновите разрешение в файле манифеста, как показано ниже:

<permission android:name="android.permission.FLASHLIGHT"
             android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
             android:protectionLevel="normal"
             android:label="@string/permlab_flashlight"
             android:description="@string/permdesc_flashlight" />

Попробуйте выключить свет, используя код ниже:

cam.stopPreview();
cam.release(); // Very Important line
person Muazzam A.    schedule 10.09.2019
comment
нет, я хочу, чтобы свет выключался, когда я переключаю фрагмент. проблема в том, что я не могу выключить его с кнопки выключения. - person P.Trenkle; 10.09.2019
comment
что это за android:description=@string/permdesc_flashlight? как мне это реализовать? - person P.Trenkle; 10.09.2019
comment
@P.Trenkle, вы можете пропустить эту строку. - person Muazzam A.; 10.09.2019
comment
хорошо с этим cam.release(); оно работает! большое спасибо! Теперь, когда я включаю, затем выключаю и пытаюсь снова включить, приложение закрывается. Ты знаешь почему? - person P.Trenkle; 10.09.2019
comment
@P.Trenkle разместите здесь свой логарифм - person Muazzam A.; 10.09.2019
comment
разместил логкэт ниже - person P.Trenkle; 10.09.2019

В какой строке?

private void turnOffLight() {

        if (lightIsOn) {
            if (camera == null || parameters == null) {
                return;
            }
            camera = Camera.open();

            parameters = camera.getParameters();
            parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
            camera.setParameters(parameters);
            camera.stopPreview();
            camera.release(); // Very Important line
            lightIsOn = false;
            button_OnOff.setText("On");

        }
    }
person P.Trenkle    schedule 10.09.2019
comment
@Muazzam abbas я пробовал несколько вариантов, и лучше всего то, что свет включается, а затем выключается, и когда я пытаюсь включить его снова, текст кнопки меняется, но свет не переключается нормально - person P.Trenkle; 11.09.2019