Ответ 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:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"
android:exported="true" >
<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" />
Если вам не хватает разрешения SEND_SMS
, READ_SMS
или WRITE_SMS
при попытке выполнить данное действие, будет выбрано значение SecurityException
. Однако, если вам не хватает разрешения RECEIVE_*
, ваше приложение просто не будет доставлено соответствующие трансляции, и может показаться, что при тестировании этих функций ничего не происходит.