Как установить мое приложение в качестве приложения для SMS по умолчанию?

Я следую этому руководству при установке моего приложения в качестве приложения SMS по умолчанию, но по какой-то причине мое приложение не отображается в списке доступных параметров. Я пытался исследовать это как можно больше, но все указывает на тот же учебник или устарело. Мне тоже нужен <receiver>? Может кто-нибудь объяснить, что я делаю неправильно?

Код:

@Override
protected void onResume()
{
    super.onResume();
    Log.i("MainAcitvity", "On Resume Called");
    // Only do these checks/changes on KitKat+, the "mSetDefaultSmsLayout" has its visibility
    // set to "gone" in the xml layout so it won't show at all on earlier Android versions.
    final String myPackageName = getPackageName();

    if (Utility.hasKitKat())
    {
        if (Utility.isDefaultSmsApp(this))
        {
            // This app is the default, remove the "make this app the default" layout and
            // enable message sending components.
            mSetDefaultSmsLayout.setVisibility(View.GONE);
        }
        else
        {
            Log.i("MainActivity", "Not Default App");
            // Not the default, show the "make this app the default" layout and disable
            // message sending components.
            mSetDefaultSmsLayout.setVisibility(View.VISIBLE);

            Button button = (Button) findViewById(R.id.set_default_sms_button);
            button.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View view)
                {                        
                    Log.i("MainActivity", "Button Pushed");
                    //Utility.setDefaultSmsApp(MainActivity.this);
                    Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
                    intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, myPackageName);
                    startActivity(intent);
                }
            });
        }
    }
}

Манифест:

<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" />
        <action android:name="android.intent.action.SEND" />
        <action android:name="android.intent.action.SENDTO" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="sms" />
        <data android:scheme="smsto" />
        <data android:scheme="mms" />
        <data android:scheme="mmsto" />
    </intent-filter>
</activity>

person Jayce    schedule 08.05.2015    source источник


Ответы (1)


Чтобы ваше приложение могло быть выбрано в качестве приложения для обмена сообщениями по умолчанию (с точки зрения системы), в его манифесте должен быть указан каждый из четырех компонентов, как описано в этом сообщении в блоге, независимо от того, действительно ли классы этих компонентов присутствуют. и функционально, или нет. Имена классов могут быть любыми допустимыми именами, которые вам нравятся, но остальная часть каждого компонента должна быть примерно такой, как показано:

<manifest>
    ...
    <application>
        <!-- BroadcastReceiver that listens for incoming SMS messages -->
        <receiver
            android:name=".SmsReceiver"
            android:permission="android.permission.BROADCAST_SMS">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_DELIVER" />
            </intent-filter>
        </receiver>

        <!-- BroadcastReceiver that listens for incoming MMS messages -->
        <receiver
            android:name=".MmsReceiver"
            android:permission="android.permission.BROADCAST_WAP_PUSH">
            <intent-filter>
                <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
                <data android:mimeType="application/vnd.wap.mms-message" />
            </intent-filter>
        </receiver>

        <!-- Activity that allows the user to send new SMS/MMS messages -->
        <activity android:name=".ComposeSmsActivity">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <action android:name="android.intent.action.SENDTO" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="sms" />
                <data android:scheme="smsto" />
                <data android:scheme="mms" />
                <data android:scheme="mmsto" />
            </intent-filter>
        </activity>

        <!-- Service that delivers messages from the phone "quick response" -->
        <service
            android:name=".HeadlessSmsSendService"
            android:exported="true"
            android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE">
            <intent-filter>
                <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="sms" />
                <data android:scheme="smsto" />
                <data android:scheme="mms" />
                <data android:scheme="mmsto" />
            </intent-filter>
        </service>
    </application>
</manifest>

Поскольку система только проверяет манифест приложения, чтобы определить, может ли оно действовать как приложение для обмена сообщениями по умолчанию, вам на самом деле не нужны какие-либо из этих классов, хотя вам, возможно, придется подавить некоторые предупреждения/ошибки или предоставить классы-заглушки, чтобы ваш ЯД доволен.

Очевидно, что если ваше приложение должно действовать как клиент обмена сообщениями пользователя по умолчанию, оно должно полностью реализовать все указанные компоненты. Однако неполная реализация, безусловно, может быть полезной; например, во время обучения и тестирования или в приложениях, которым временно требуется только частичный доступ, например приложения для резервного копирования и восстановления сообщений.

Если вы намерены выполнять какие-либо задачи, связанные с SMS/MMS, вам также потребуются соответствующие разрешения. Хотя система, по-видимому, не проверяет их при определении подходящих приложений-кандидатов по умолчанию, для их соответствующих операций необходимы следующие разрешения:

<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.RECEIVE_MMS" />

SecurityException будет выброшено, если вы пропустите соответствующее разрешение для данной операции, когда это произойдет, хотя некоторые из них можно легко пропустить; например, если разрешение RECEIVE_SMS отсутствует, когда система пытается доставить входящее SMS получателю, зарегистрированному в манифесте. Обязательно проверьте свои журналы, если вы заметите неожиданное поведение, даже если явного сбоя нет.

person Mike M.    schedule 08.05.2015
comment
M: является ли «HeadlessSmsSendService» классом службы Android? - person Vineesh TP; 15.06.2017
comment
@VineeshTP Да. Любой компонент с элементом <service> будет подклассом Service. - person Mike M.; 15.06.2017
comment
@МайкМ. если я ничего не сделаю, входящие сообщения никогда не появятся в папке «Входящие» моего обычного приложения для смс? как бы они просто исчезли? Потому что я хочу нормально видеть SMS в приложении по умолчанию, но использую свое приложение, потому что хочу реализовать SMS-шлюз. - person DivinesLight; 19.10.2017
comment
@BlackDivine Я не уверен, понимаю ли я, о чем ты спрашиваешь. Если ваше приложение является приложением для обмена сообщениями по умолчанию, оно отвечает за сохранение входящих SMS. Если нет, то да, они практически исчезают. - person Mike M.; 19.10.2017
comment
Как я могу получить выбранный номер из приложения «Контакты», когда я нажимаю, чтобы отправить сообщение, а мои приложения для SMS установлены по умолчанию? - person alex samsung; 15.11.2018
comment
@alexsamsung Ты имеешь в виду вот так? stackoverflow.com/q/42676866 - person Mike M.; 15.11.2018
comment
@МайкМ. зачем помещать ежедневный журнал выбора в onResume? Мне не нужно, чтобы мои отправленные и полученные смс сохранялись в папке «Входящие» по умолчанию, как этого добиться?? - person EL TEGANI MOHAMED HAMAD GABIR; 29.06.2019
comment
@МайкМ. Привет, спасибо за ваш пост. У меня есть вопрос -› google play заблокировал мое приложение, потому что я добавил разрешение android.permission.READ_CALL_LOG, но мое приложение не является SMS по умолчанию -› так что, если я поставлю это, google play обнаружит мое приложение как SMS по умолчанию? - person Serg Burlaka; 04.10.2019
comment
@SergBurlaka Понятия не имею. Извини. Я никогда не публиковал такие приложения в Google Play и не знаком с их правилами и политиками в этом отношении. - person Mike M.; 10.11.2019