手电筒片段 Android Studio

Posted

技术标签:

【中文标题】手电筒片段 Android Studio【英文标题】:Flashlight Fragment Android Studio 【发布时间】:2020-01-12 12:17:12 【问题描述】:

我已经为我的应用程序创建了一个手电筒片段,并且我已经实现了此代码并打开手电筒工作,但我无法将其关闭。

我试着用一个按钮打开和关闭灯,或者现在用两个按钮打开和关闭灯,但没有任何区别。

当我切换片段时,灯会熄灭。

我希望有人知道该怎么做。 谢谢

 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_
    android:layout_
    tools:context=".Flashlight">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_
        android:layout_>

        <SurfaceView
            android:id="@+id/PREVIEW"
            android:layout_
            android:layout_
            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_
            android:layout_
            android:orientation="vertical">

            <Button
                android:id="@+id/button_On"
                android:layout_
                android:layout_
                android:text="on" />

            <Button
                android:id="@+id/button_Off"
                android:layout_
                android:layout_
                android:text="off" />

        </LinearLayout>


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

【问题讨论】:

【参考方案1】:

好的,更新清单文件中的权限如下:

<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

【讨论】:

不,我希望在切换片段时关闭灯。问题是我无法通过关闭按钮将其关闭。 这是什么 android:description="@string/permdesc_flashlight"?我该如何实现? @P.Trenkle 你可以跳过这行。 可以接受这个 cam.release();有用!多谢!现在,当我打开而不是关闭并尝试再次打开它时,应用程序会关闭。你知道为什么吗? @P.Trenkle 在此处发布您的 logcat【参考方案2】:

在哪一行?

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");

        
    

【讨论】:

@Muazzam abbas 我尝试了多种变体,最好的是灯打开而不是关闭,当我尝试再次打开它时,按钮文本发生变化,但灯不能正常切换

以上是关于手电筒片段 Android Studio的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio:关闭时手电筒崩溃

Android 以编程方式打开手电筒按钮

在 zxing 片段库中打开/关闭手电筒

如何制作Windows手机的led手电筒/手电筒应用程序(Visual Studio)

Android如何知道手电筒是不是打开

Android开启手电筒功能(完美适配Android4x,5x,6x)