AndroidのSettingsにない設定画面に遷移させる方法
開発中に仕様として特定の設定画面に遷移してほしいと言われたけど、通常設定画面への遷移で利用するSettings
クラスに定義が無くて、Intentのaction
がわからないということは無いでしょうか?
自分の場合だとStackOverflowで回答を見つけて遷移できたらラッキーぐらいにずっと思っていたのですが、今実装中の施策である特定の設定画面に遷移できないか探していた時にたまたま方法を発見したのでご紹介します。
やり方はシンプル
ご存じの方もいるかと思いますが、設定画面もAndroid OS内ではアプリになっています。そして、Android OSはOSSです。
ということは、設定画面はActivityやFragmentで構成されていますし、そのActivityやFragmentが公開されているAndroidManifest.xmlにも記載されています。AndroidManifest.xmlにはその他のアプリと同様にintent-filterが記載されていて、action名も記載されています。
なので、ご紹介しますといいつつも大変ではなく、LogcatでActivity/Fragmentを特定して、あとはAndroid OSのリポジトリからaction名を探すという至ってシンプルな方法です。
では、より具体的にご説明していきます。
Activity/Fragmentを特定する
設定画面を開いたあとにLogcatを確認すると設定画面に紐づいているActivity名やFragment名をを見つけることができます。
Logcatを確認する際はフィルターにpackage:com.android.settings Launch
を指定するとわかりやすいです。
例えば、これは設定の「ディスプレイとタップ」→「画面自動消灯」を確認した際のログです。
「ディスプレイとタップ」がcom.android.settings.DisplaySettings
、「画面自動消灯」がcom.android.settings.display.ScreenTimeoutSettings
ですね。
AndroidManifest.xmlからaction名を調べる
検索するとAndroidManifest.xmlは様々なところで公開されていますが、ひとまず今回はAndroid Code SearchにあるAndroidManifest.xmlから探してみます。
なお、今回は設定画面なので、apps/Settings
を見ていますが他のデフォルトアプリもapps
配下にあるので、デフォルトのアプリで遷移してみたい先があるのであれば見てみると良いかもしれません。
探すのも簡単で先ほど見つけたFragment名を文字列検索するだけです。
「ディスプレイとタップ」の場合はこちらですし、「画面自動消灯」の場合はこちらですね。
各々、<activity>
が紐づいており、action名がcom.android.settings.DISPLAY_SETTINGS
やandroid.settings.SCREEN_TIMEOUT_SETTINGS
であることがわかりますね。
遷移する
上記で調べたaction名を通常通りIntentで指定して、遷移するだけです。
以下は「ディスプレイとタップ」に遷移したい場合の例です。
val intent = Intent("com.android.settings.DISPLAY_SETTINGS")
activity.startActivity(intent)
まとめ
この手順であれば少なくともAndroidManifest.xmlに記載があれば対応することが可能です。すべての画面にactionが紐づいているかまでは見ていないので、もしかすると遷移できない画面もあるかもしれませんが、この手順であれば遷移できないかもきちんと説明できる情報が取得できるのも良い点です。
ただ、例えば、Activity名が出力される場合のログもあるようなので、もっと手軽な方法があるかもしれません(契機がわからなかったので今回の手順では使いませんでした)。また、Android OSのソースがあるわけなので、きちんとソースを追ってActivityを見つけたり、AIに探させても良いかもしれませんね。
番外編
最後のまとめを書いていて、AIに探してもらえばよいのではと思ったので、実際にGemini 2.5 Proを使って探してみましたが、残念ながら見つけることはできませんでした。
ただし、DisplaySettings
やScreenTimeoutPreferenceController
に紐づいていることまではわかったようなので、プロンプト次第では見つけられるかもしれません。
Discussion