3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

1タップでライトをON/OFFする

Last updated at Posted at 2020-06-05

はじめに

所謂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スイッチを付けてあります。

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 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>
<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 以降)

3
4
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?