Android端末でFirefoxをデフォルトブラウザにしていると、Chromeが嫉妬して、以下のようなダイアログが表示されます。
アプリから自分をデフォルトアプリにしてくれとリクエストすることができるのか!
ということでやり方を調べました。
RoleManager
結論からいうと、RoleManagerを使います。
https://developer.android.com/reference/android/app/role/RoleManager
API Level 29です。Android10以上で使える機能ですね。
デフォルトブラウザアプリの設定をリクエストする
Chromeと同様にブラウザアプリをつくって、自分をデフォルトアプリにしてくれるようにリクエストしてみましょう。
ブラウザアプリを作る
デフォルトブラウザをリクエストするには、当然ながらブラウザアプリを作る必要があります。
ブラウザ機能を作ろうと思うと大変ですが、「システムからブラウザアプリとして認識されるアプリ」を作るのは簡単です。
Activityに以下のintent-filterを設定します。
これだけでシステムからブラウザアプリとして認識されるようになります。
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
<data android:scheme="https" />
</intent-filter>
「設定」→「アプリと通知」→「デフォルトのアプリ」→「ブラウザアプリ」を開いてみましょう。
上記Intentを設定したアプリがブラウザアプリとしてリストされるようになっています。
デフォルトブラウザアプリの設定をリクエストする
デフォルトブラウザアプリの設定をリクエストするにはIntentを投げるのですが、startActivityForResult
を使う必要があります。
結果は、成功すればActivity.RESULT_OK
、それ以外ではActivity.RESULT_CANCELED
が返ってきます。
startActivityForResult
はDeprecatedなのでactivity result contractを使いましょう。
結果はトーストで表示するようにしておきます。
private val launcher = registerForActivityResult(StartActivityForResult()) {
val result = if (it.resultCode == Activity.RESULT_OK) "SUCCESS" else "FAILURE"
Toast.makeText(this, result, Toast.LENGTH_LONG).show()
}
RoleManagerのインスタンスはgetSystemService
で取得します。
RoleManagerのインスタンスが取得できたらcreateRequestRoleIntent
を使ってIntentを作成します。
引数にはデフォルトアプリのカテゴリーを示すROLEを指定します。
ブラウザアプリの場合はROLE_BROWSER
ですね。
他のROLEもRoleManagerに定義されています。
getSystemService<RoleManager>()
?.createRequestRoleIntent(RoleManager.ROLE_BROWSER)
?.let {
launcher.launch(it)
}
これだけです。実行すると以下のように表示されます。
デフォルトアプリとして選択されると
成功です。
なお、自身がすでにデフォルトアプリになっている場合、ダイアログが表示されず即座に成功が返ってきます。
また、他のアプリが選ばれたりすると、「次回から表示しない」チェックボックスが現れます。
当然、チェックボックス付きでキャンセルされると次からはダイアログは表示されず失敗するようになります。
デフォルトホームアプリの設定をリクエストする
今度はデフォルトホームアプリの設定をリクエストしてみましょう。
ホームアプリを作る
「システムからホームアプリとして認識されるアプリ」を作ります。
以下のintent-filterを設定するだけです。
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
「設定」→「アプリと通知」→「デフォルトのアプリ」→「ホームアプリ」に表示されるようになります。
デフォルトホームアプリの設定をリクエストする
ブラウザと同じく、今度はROLE_HOME
を指定します。
getSystemService<RoleManager>()
?.createRequestRoleIntent(RoleManager.ROLE_HOME)
?.let {
launcher.launch(it)
}
実行すると以下のように表示されます。
以上です。