自 Android 4.4 (KitKat) 起,系統引入「默認 SMS 應用」機制。應用若想成為默認短信應用,必須實現特定組件並在清單文件中聲明,系統才會彈出選項讓用戶選擇。本文梳理核心步驟與必需組件。
應用必須包含以下組件並設置相應 Intent Filter:
<manifest ...>
<!-- 必需權限 -->
<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" />
<application ...>
<!-- 1. 接收 SMS 的 BroadcastReceiver -->
<receiver android:name=".SmsReceiver"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter android:priority="999">
<action android:name="android.provider.Telephony.SMS_DELIVER" />
</intent-filter>
</receiver>
<!-- 2. 接收 MMS 的 BroadcastReceiver -->
<receiver android:name=".MmsReceiver"
android:permission="android.permission.BROADCAST_WAP_PUSH">
<intent-filter android:priority="999">
<action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
<data android:mimeType="application/vnd.wap.mms-message" />
</intent-filter>
</receiver>
<!-- 3. 發送 SMS/MMS 的 Service -->
<service android:name=".HeadlessSmsSendService"
android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SENDTO" />
<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>
<!-- 4. 備份/恢復 Agent (可選,但建議實現) -->
<service android:name=".BackupService"
android:permission="android.permission.BACKUP" />
</application>
</manifest>
在適當時機(如首次啟動、用戶點擊「設置為默認」按鈕)調用:
// 檢查是否已是默認
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if (!tm.getDefaultSmsPackage().equals(getPackageName())) {
// 彈出系統選擇對話框
Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, getPackageName());
startActivity(intent);
}
參考官方指南:Android SMS Provider Guide。實現上述組件並引導用戶授權,即可成為默認 SMS 應用。