【Android】apkをインストールしたらメイン画面(アプリ一覧)にアプリが表示されないときのAndroidManifest.xmlの書き方

Railsおじさんでしたが、Androidとの殴り合いが増えてきまして、泣きながら戦っていて、インターネットにあまりにも情報が足りないと思ったので筆をとりました。

この記事の対象読者

  • apkをインストールしたらメイン画面(アプリ一覧)にアプリが表示されない人(タイトルそのまま)

developer.android.com

ここに書いてあるんですけど、 そしてここに書いてあることばっかり検索に出てくるんですけど、 やってんだよこっちは!!って思ったときにドツボにハマったので、 同じ悩みを抱える人が今後二度と現れて欲しくないので書いています。

Androidアプリがメイン画面に表示される条件

余計なのもついてるかもしれないけど、100%動いてほしいので確信がないやつも書いています。 なくてもいいだろ、関係ないだろ、というのは外しています。 かなり最低限の構成にすると以下のような感じ。

com.hogeapp.fuga とか @mipmap/ic_launcher とか @string/app_name とかはよしなにしてください。不安な人は名前まで合わせちゃうと確実に動くと思います。

name, label, Activityの指定、intent-filterにあの二つの記載をすること、が重要みたいです。

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hogeapp.fuga"
    android:versionCode="1"
    android:versionName="1.0">

    <application
        android:name=".MainApplication"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

今回詰むに至った原因

差し障りなさそうな範囲で書くと、ReactNativeで動けばええやろということで以下のような感じに書いてたんですけど、

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hogeapp.fuga"
    android:versionCode="1"
    android:versionName="1.0">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <permission
        android:name="${applicationId}.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:name=".MainApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />

                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="main"
                    android:scheme="hogeapp" />
            </intent-filter>
        </activity>
        (中略)
    </application>
</manifest>

これは詰みます。 次のように、必ずintent-filterを分けて書くことが肝要です。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hogeapp.fuga"
    android:versionCode="1"
    android:versionName="1.0">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <permission
        android:name="${applicationId}.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:name=".MainApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter> <!-- ここと -->
            <intent-filter> <!-- ここね -->
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="main"
                    android:scheme="hogeapp" />
            </intent-filter>
        </activity>
        (中略)
    </application>
</manifest>

これに気づけなくて「情報全部揃ってるだろ!」って6時間ぐらいインターネットをさまよいました。かなしい。

というわけで、皆さんも気をつけてください。よろしくお願いします。