首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 申請默認 SMS 應用:實現指南與核心組件

     編輯:程式設計綜合問答

自 Android 4.4 (KitKat) 起,系統引入「默認 SMS 應用」機制。應用若想成為默認短信應用,必須實現特定組件並在清單文件中聲明,系統才會彈出選項讓用戶選擇。本文梳理核心步驟與必需組件。

核心要求:AndroidManifest.xml 聲明

應用必須包含以下組件並設置相應 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:priority="999"`: 必須設置高優先級,確保系統優先將短信分發給您的 Receiver。
  • Headless Service: `HeadlessSmsSendService` 必須繼承 `Service` 並在 `onStartCommand` 中異步處理發送邏輯,不能阻塞主線程。
  • 運行時權限: Android 6.0+ 需動態申請 `SEND_SMS`、`READ_SMS` 等危險權限,用戶拒絕則無法工作。
  • 雙卡設備: 需處理多 SIM 卡場景,`TelephonyManager` 方法需傳入 `subId`。

參考官方指南:Android SMS Provider Guide。實現上述組件並引導用戶授權,即可成為默認 SMS 應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved