1タップでライトをＯＮ／ＯＦＦする

# はじめに

所謂Androidの懐中電灯化なんですが、アプリにライトをON/OFFするスイッチをつければできますよね。
でもそれだと、ライトを点けるために

1. アプリを起動する
2. ONボタンをタップする

と、2アクション必要になってしまいます。
これを1アクションにしたかった。というわけです。

# 開発環境

Android Studio 3.6.3
Windows 10 Pro 1909
ASUS X00RD
Android 8.0.0

# プログラム

点けたライトを消すために、画面上にもON/OFFスイッチを付けてあります。

```kotlin
package com.websarva.sings.android.lightswitch
import android.content.Context
import android.hardware.camera2.CameraAccessException
import android.hardware.camera2.CameraManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import android.widget.Button
import android.widget.TextView
import android.widget.Toast

class MainActivity : AppCompatActivity() {
    lateinit var txMessage: TextView
    lateinit var btSwitch: Button
    lateinit var manager: CameraManager
    var cameraId: String = ""
    var cameraSw = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Activityのウィジェットを取得する
        btSwitch = findViewById(R.id.btSwitch)
        txMessage = findViewById(R.id.txMessage)
        // アプリ起動時にライト状態を切り替えるためのフラグ
        var firstTime = true
        // カメラマネージャーを取得する
        manager =
            getSystemService(Context.CAMERA_SERVICE) as CameraManager
        try {
            // トーチモードのコールバックを登録する
            manager.registerTorchCallback(object : CameraManager.TorchCallback() {
                override fun onTorchModeChanged(id: String, enabled: Boolean) {
                    super.onTorchModeChanged(id, enabled)
                    // 前面カメラのみ有効
                    if(id != "0") return

                    // カメラidと状態を保存する
                    cameraId = id
                    cameraSw = enabled

                    // アプリ起動時のライトスイッチ
                    if (firstTime) {
                        switchLight()
                        firstTime = false
                    }
                }
            }, Handler())
        } catch (e: Exception) {
            Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show()
        }

        // ボタンのハンドラ登録
        btSwitch.setOnClickListener {
            try {
                // ライトのON/OFFを切り替える
                switchLight()
            } catch (e: Exception) {
                Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show()
            }
        }
    }

    /**
     * ライトのON/OFF切り替え
     */
    private fun switchLight() {
        // 消えていたらつけて、ついていたら消す
        manager.setTorchMode(cameraId, !cameraSw)
        val strSwitch = if (!cameraSw) "点けました" else "消しました"

        txMessage.setText("ライト(" + cameraId + ")を" + strSwitch)
    }
}
```

一応、画面のXMLも貼っておきます。大したものじゃないですが。。。

```xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".MainActivity">

    <TextView
        android:id="@+id/txMessage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_name"
        app:layout_constraintBottom_toTopOf="@+id/btSwitch"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btSwitch"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="97dp"
        android:text="@string/btSwitch"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/txMessage" />

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

```xml
<resources>
    <string name="app_name">LightSwitch</string>
    <string name="btSwitch">スイッチ</string>
    <string name="strOn">ON</string>
    <string name="strOff">OFF</string>
</resources>
```

以上です。

# 参考にしたサイト

・[LEDライトを点灯させる方法（Android 6 以降）](https://android-java.hatenablog.jp/entry/2017/06/04/094950)