スマホの電源ボタンが取れた話
長年愛用していZENFONE6ですが、ついに物理的に電源ボタンが取れてしまいました。
カメラが液晶部分にないのが非常に気に入っています。
代わりに、インカメラとアウトカメラは共有でアプリの機能でカメラの向きを機械的に切り替えるんですが
衝撃があると、ぐらぐらするんですよね。(ちょっと怖い)
結構気に入っていたので、延命措置としてボタンをテープで取れないようにだましだまし使っていましたがついに、ボタンのスイッチの押す部分の突起が欠けてしまい万事休すです。
ボタンの交換を検討
ボタンパーツがあれば、何とかできないかと思ったのでパーツ売りしていないか調べてみましたが、私の端末用のものは売られていな様子です。
DIY
拡張機能に、持ち上げるとスリープ解除はありますが持つだけで電源つくのもあれなので保留です。
他に、何か良い方法はないかと調べていたら電源は指紋認証にすれば自動的にスリープ解除されるようです。(認証も出来ていい感じです。現在はPINコード認証)
であれば、後はスイッチを使わず消せれば…。
電源を消す方法もいくつかありましたが、消したい時に消せないのは論外なので未使用時自動オフは却下です。
タップジェスチャーなる機能で、スクリーンをダブルタップするとスリープにできる機能があるようなので試してみましたがどうも感度が悪いのです。
ふと思ったのですが、アプリでスリープ出来れば…と思ってみることにしました。
package com.chaftta.poweroff
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.provider.Settings
import android.widget.Toast
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// アクセシビリティサービスが有効かチェック
if (isAccessibilityServiceEnabled()) {
// サービスが有効なら画面をロック
lockScreen()
} else {
// サービスが無効ならアクセシビリティ設定画面を開く
openAccessibilitySettings()
}
}
private fun isAccessibilityServiceEnabled(): Boolean {
val service = "${packageName}/${ScreenLockService::class.java.canonicalName}"
val enabledServices = Settings.Secure.getString(
contentResolver,
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
)
return enabledServices?.contains(service) == true
}
private fun lockScreen() {
val service = ScreenLockService.getInstance()
if (service != null) {
service.lockScreen()
finish()
} else {
Toast.makeText(this, "アクセシビリティサービスが起動していません", Toast.LENGTH_SHORT).show()
openAccessibilitySettings()
}
}
private fun openAccessibilitySettings() {
Toast.makeText(
this,
"アクセシビリティ設定で「Screen Lock」サービスを有効にしてください",
Toast.LENGTH_LONG
).show()
try {
val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)
startActivity(intent)
} catch (e: Exception) {
Toast.makeText(this, "設定画面を開けませんでした: ${e.message}", Toast.LENGTH_LONG).show()
}
finish()
}
}
package com.chaftta.poweroff
import android.accessibilityservice.AccessibilityService
import android.view.accessibility.AccessibilityEvent
class ScreenLockService : AccessibilityService() {
override fun onAccessibilityEvent(event: AccessibilityEvent?) {
// このサービスではイベント処理は不要
}
override fun onInterrupt() {
// サービスが中断された時の処理
}
override fun onServiceConnected() {
super.onServiceConnected()
// サービスが接続された時の処理
}
companion object {
private var instance: ScreenLockService? = null
fun getInstance(): ScreenLockService? = instance
fun isServiceEnabled(): Boolean = instance != null
}
override fun onCreate() {
super.onCreate()
instance = this
}
override fun onDestroy() {
super.onDestroy()
instance = null
}
fun lockScreen() {
// アクセシビリティサービスのグローバルアクションを使用して画面をロック
performGlobalAction(GLOBAL_ACTION_LOCK_SCREEN)
}
}
使ってみた
初回は、アプリを起動すると管理権限の機能使うけどみたいな感じで権限をオンにする必要がありますが、以降はアプリを起動するだけでスリープするようになりました。
押しやすい場所にアプリのショートカットを配置してタップするだけでスリープになるようになりました。
感想
電源ボタン >>> 超えられない壁 >>> ソフト電源ボタン >>> タイムアウトで電源
言い訳
ケチっているなぁと思われると思いますが、しっかり新しい端末は買いましたよ!
まあ、でもほら古いOSの実機確認する時にあれば使えるかなと思ったので使える状態にしておこうかなとかそんな感じです!!