Android FlashLight教程

时间:2020-02-23 14:28:55  来源:igfitidea点击:

在本教程中,我们将在应用程序中实现FlashLight功能。

Android手电筒

如今,每部智能手机都可通过相机闪光灯使用手电筒功能/手电筒。

在下一部分中,我们将使用Camera2 API切换手电筒。
自Android API 25起,不推荐使用Camera API。
此外,我们还将介绍如何创建闪烁的手电筒。

让我们开始创建一个新的Android Studio项目。

代码

下面给出了activity_main.xml布局文件的代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android"
  xmlns:app="https://schemas.android.com/apk/res-auto"
  xmlns:tools="https://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".MainActivity">

  <Button
      android:id="@+id/btnFlashLightToggle"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="FLASHLIGHT OFF"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintLeft_toLeftOf="parent"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintTop_toTopOf="parent" 

  <Button
      android:id="@+id/btnBlinkFlashLight"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginTop="24dp"
      android:text="BLINK FLASHLIGHT"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toBottomOf="@+id/btnFlashLightToggle" 

</android.support.constraint.ConstraintLayout>

将以下内容添加到列表标记中的AndroidManifest.xml文件中。

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

MainActivity.java类的代码如下:

package com.theitroad.androidflashlight;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

  Button btnFlashLight, btnBlinkFlashLight;
  private static final int CAMERA_REQUEST = 123;
  boolean hasCameraFlash = false;

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

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

      hasCameraFlash = getPackageManager().
              hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);

      btnFlashLight = findViewById(R.id.btnFlashLightToggle);
      btnBlinkFlashLight = findViewById(R.id.btnBlinkFlashLight);

      btnFlashLight.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              if (hasCameraFlash) {
                  if (btnFlashLight.getText().toString().contains("ON")) {
                      btnFlashLight.setText("FLASHLIGHT OFF");
                      btnBlinkFlashLight.setText("BLINK FLASHLIGHT OFF");
                      flashLightOff();
                  } else {
                      btnBlinkFlashLight.setText("BLINK FLASHLIGHT ON");
                      btnFlashLight.setText("FLASHLIGHT ON");
                      flashLightOn();
                  }
              } else {
                  Toast.makeText(MainActivity.this, "No flash available on your device",
                          Toast.LENGTH_SHORT).show();
              }
          }
      });

      btnBlinkFlashLight.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {

              if(btnFlashLight.getText().toString().contains("ON"))
              {
                  blinkFlash();
              }
              else{
                  Toast.makeText(MainActivity.this, "Press the above button first.",
                          Toast.LENGTH_SHORT).show();
              }

          }
      });

  }

  private void flashLightOn() {
      CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

      try {
          String cameraId = cameraManager.getCameraIdList()[0];
          cameraManager.setTorchMode(cameraId, true);
      } catch (CameraAccessException e) {
      }
  }

  private void flashLightOff() {
      CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
      try {
          String cameraId = cameraManager.getCameraIdList()[0];
          cameraManager.setTorchMode(cameraId, false);
      } catch (CameraAccessException e) {
      }
  }

  private void blinkFlash()
  {
      CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
      String myString = "0101010101";
      long blinkDelay = 50; //Delay in ms
      for (int i = 0; i < myString.length(); i++) {
          if (myString.charAt(i) == '0') {
              try {
                  String cameraId = cameraManager.getCameraIdList()[0];
                  cameraManager.setTorchMode(cameraId, true);
              } catch (CameraAccessException e) {
              }
          } else {
              try {
                  String cameraId = cameraManager.getCameraIdList()[0];
                  cameraManager.setTorchMode(cameraId, false);
              } catch (CameraAccessException e) {
              }
          }
          try {
              Thread.sleep(blinkDelay);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }
  }

  @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) {
                  hasCameraFlash = getPackageManager().
                          hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
              } else {
                  btnFlashLight.setEnabled(false);
                  btnBlinkFlashLight.setEnabled(false);
                  Toast.makeText(MainActivity.this, "Permission Denied for the Camera", Toast.LENGTH_SHORT).show();
              }
              break;
      }
  }
}

在上面的代码中,我们首先要求相机权限。

完成后,我们将检查相机闪光灯功能是否存在。

btnFlashLight用作手电筒切换按钮。

我们通过从" CameraManager"上的相机ID列表中获取第一个元素来启动手电筒。

在该ID上,我们可以将手电筒模式设置为true以启用手电筒,或者将其设置为false禁用手电筒。

如何使手电筒闪烁?

我们使用由二进制数组成的字符串。
我们遍历字符串,并在每次迭代时切换手电筒,同时使线程休眠一会儿以带来闪烁效果。

为了使其不断闪烁,请使用无限循环,该循环在某种情况下停止。

以上应用程序的输出是所需的。
由于屏幕快照是硬件中的内容,因此我们已将其省略。