📌  相关文章
📜  如何构建一个简单的Flashlight TorchLight Android应用程序?(1)

📅  最后修改于: 2023-12-03 15:09:10.766000             🧑  作者: Mango

如何构建一个简单的Flashlight TorchLight Android应用程序?

制作一个简单的Flashlight TorchLight Android应用程序很简单,只需要遵循以下步骤:

步骤1:准备工作

要制作这个应用程序,您需要了解一些基本的Java和Android开发知识,以及以下工具:

  • Android Studio
  • JDK
步骤2:创建一个新的Android项目
  1. 启动Android Studio并创建一个新项目。
  2. 输入项目名称和包名称,然后选择"空模板"作为项目模板。
  3. 单击"下一步"。
  4. 在"目标设备"下,选择"手机和平板电脑"。
  5. 选择最低SDK版本。推荐选择API 21或更高版本。
  6. 单击"完成"。
步骤3:设计用户界面
  1. 打开"activity_main.xml"文件,这是应用程序的用户界面文件。
  2. 在文件中添加一个"ToggleButton"控件,用于打开和关闭手电筒。
  3. 添加一个ImageView控件,用于显示照片。
  4. 根据需要进行布局和样式的调整。
步骤4:打开/关闭手电筒
  1. 在MainActivity.java文件中,声明一个Camera对象和一个布尔变量。
private Camera camera;
private boolean isFlashOn;
  1. 在onCreate方法中,获取Camera对象并将isFlashOn变量设为false。
camera = Camera.open();
isFlashOn = false;
  1. 在ToggleButton的onClick事件中,根据isFlashOn变量状态打开或关闭手电筒。
toggleButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (isFlashOn) {
                    turnOffFlash();
                    isFlashOn = false;
                } else {
                    turnOnFlash();
                    isFlashOn = true;
                }
            }
        });
  1. 实现turnOnFlash方法和turnOffFlash方法,用于打开和关闭手电筒。
private void turnOnFlash() {
        Camera.Parameters params = camera.getParameters();
        params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        camera.setParameters(params);
        camera.startPreview();
    }

    private void turnOffFlash() {
        Camera.Parameters params = camera.getParameters();
        params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        camera.setParameters(params);
        camera.stopPreview();
    }
步骤5:添加权限和功能
  1. 在AndroidManifest.xml文件中,添加打开相机权限和使用相机权限。
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
  1. 添加对应的功能。
<uses-feature android:name="android.hardware.camera.flash" />
步骤6:运行应用程序

您可以运行应用程序并测试它是否正常工作。手电筒应该在用户开启开关之后点亮,并在关闭之后关闭。

完整代码
public class MainActivity extends AppCompatActivity {

    private Camera camera;
    private boolean isFlashOn;
    private boolean hasFlash;
    Parameters params;
    ImageButton btnOnOff;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // initialize camera
        hasFlash = getApplicationContext().getPackageManager()
                .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);

        if (!hasFlash) {
            // redirecting to MainActivity screen because flashlight not supported
            Toast.makeText(MainActivity.this, "Flash not supported on your Camera", Toast.LENGTH_LONG).show();
            finish();
        }
        getCamera();

        // Switch button click event handle
        btnOnOff.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (isFlashOn) {
                    // turn off flash
                    turnOffFlash();
                } else {
                    // turn on flash
                    turnOnFlash();
                }
            }
        });
    }

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

    /**
     * Turning On flash
     */
    private void turnOnFlash() {
        if (!isFlashOn) {
            if (camera == null || params == null) {
                return;
            }
            // play sound
            playSound();

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

            // changing button/switch image
            toggleButtonImage();
        }

    }

    /**
     * Turning Off flash
     */
    private void turnOffFlash() {
        if (isFlashOn) {
            if (camera == null || params == null) {
                return;
            }
            // play sound
            playSound();

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

            // changing button/switch image
            toggleButtonImage();
        }
    }

    /**
     * Playing sound
     * will play button toggle sound on flash on / off
     * */
    private void playSound(){
        if(isFlashOn){
            mp = MediaPlayer.create(MainActivity.this, R.raw.flash_off);
        }else{
            mp = MediaPlayer.create(MainActivity.this, R.raw.flash_on);
        }
        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub
                mp.release();
            }
        });
        mp.start();
    }


    /*
     * Toggle switch button images
     * changing image states to on / off
     * */
    private void toggleButtonImage(){
        if(isFlashOn){
            btnOnOff.setImageResource(R.drawable.btn_switch_on);
        }else{
            btnOnOff.setImageResource(R.drawable.btn_switch_off);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    @Override
    protected void onPause() {
        super.onPause();

        // on pause turn off the flash
        turnOffFlash();
    }

    @Override
    protected void onRestart() {
        super.onRestart();
    }

    @Override
    protected void onResume() {
        super.onResume();

        // on resume turn on the flash
        if(hasFlash)
            turnOnFlash();
    }

    @Override
    protected void onStart() {
        super.onStart();

        // on starting the app get the camera params
        getCamera();
    }

    @Override
    protected void onStop() {
        super.onStop();

        // on stop release the camera
        if (camera != null) {
            camera.release();
            camera = null;
        }
    }

}