LoginSignup
9
3

More than 1 year has passed since last update.

Androidのデフォルトアプリ選択をリクエストする

Last updated at Posted at 2022-04-06

Android端末でFirefoxをデフォルトブラウザにしていると、Chromeが嫉妬して、以下のようなダイアログが表示されます。

アプリから自分をデフォルトアプリにしてくれとリクエストすることができるのか!
ということでやり方を調べました。

RoleManager

結論からいうと、RoleManagerを使います。
https://developer.android.com/reference/android/app/role/RoleManager

API Level 29です。Android10以上で使える機能ですね。

デフォルトブラウザアプリの設定をリクエストする

Chromeと同様にブラウザアプリをつくって、自分をデフォルトアプリにしてくれるようにリクエストしてみましょう。

ブラウザアプリを作る

デフォルトブラウザをリクエストするには、当然ながらブラウザアプリを作る必要があります。
ブラウザ機能を作ろうと思うと大変ですが、「システムからブラウザアプリとして認識されるアプリ」を作るのは簡単です。

Activityに以下のintent-filterを設定します。
これだけでシステムからブラウザアプリとして認識されるようになります。

AndroidManifest.xml
<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を設定するだけです。

AndroidManifest.xml
<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)
    }

実行すると以下のように表示されます。

以上です。

9
3
0

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
9
3