android studio 如何成为「短信预设处理APP」?

我查看了官方文件,也爬了各种论坛,作了很多种测试,但就是没办法跳出「成为短信预设处理app」的视窗,「设定」中自己选择也没有出现我这个app 的选项。是哪个物件没有宣告到,还是哪个权限没有使用到吗?有劳各位帮我看一下,是哪个环节出了错,感谢感谢

我也用过三四个ai 去重写或重构我的程序,依旧没办法
也有在其他的论坛问过,官方的sdk 文件也看过,也看过其他人在github 上面的 AndroidManifest.xml
似乎都没问题呀,是不是哪个权限多了还是程式哪里没定义到?

AndroidManifest.xml

 

 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
 
    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.SMS.NoActionBar"
        android:usesCleartextTraffic="true"
        android:networkSecurityConfig="@xml/network_security_config"
        tools:targetApi="30">
        <meta-data
            android:name="android.telephony.default_sms_handler"
            android:value="true" />
        <activity android:name=".MainActivity" android:exported="true">
            <intent-filter>
                <!-- 啟動 APP -->
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
 
            <intent-filter>
                <!-- 發送 SMS -->
                <action android:name="android.intent.action.SENDTO"/>
                <data android:scheme="smsto"/>
                <data android:scheme="sms"/>
            </intent-filter>
 
            <intent-filter>
                <!-- 接收 SMS 訊息 -->
                <action android:name="android.provider.Telephony.SMS_DELIVER"/>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
 
        </activity>
 
        <!-- ConversationListActivity 可以打開短訊對話 -->
        <activity
            android:name=".ConversationListActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <action android:name="android.intent.action.SENDTO"/>
                <action android:name="android.provider.Telephony.SMS_DELIVER"/>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
                <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>
 
        <!-- 其他必要的 Activity -->
        <activity android:name=".EmptyActivity"/>
        <activity android:name=".ChatActivity"
            android:windowSoftInputMode="adjustResize"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <action android:name="android.intent.action.SENDTO" />
                <action android:name="android.provider.Telephony.SMS_DELIVER"/>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
                <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>
            <intent-filter>
                <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:mimeType="application/vnd.wap.mms-message"/>
            </intent-filter>
        </activity>
 
        <activity android:name=".NewMessageActivity" android:windowSoftInputMode="adjustResize"/>
 
        <!-- 短信前台服務 -->
        <service
            android:name=".SmsForegroundService"
            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>
 
 
        <!-- 開機後重新啟動服務 -->
        <receiver
            android:name=".BootReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
 
        <!-- 監聽 SMS 收到 -->
        <receiver
            android:name=".SmsReceiver"
            android:permission="android.permission.BROADCAST_SMS"
            android:exported="true">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_DELIVER"/>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>
 
        <!-- 監聽 MMS 收到 -->
        <receiver
            android:name=".MmsReceiver"
            android:permission="android.permission.BROADCAST_WAP_PUSH"
            android:exported="true">
            <intent-filter>
                <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED"/>
                <data android:mimeType="application/vnd.wap.mms-message"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>
 
    </application>
 
 
    <queries>
        <intent>
            <action android:name="android.provider.Telephony.SMS_DELIVER" />
        </intent>
        <intent>
            <action android:name="android.intent.action.SENDTO"/>
            <data android:scheme="smsto"/>
        </intent>
        <package android:name="com.android.messaging"/>
    </queries>
 
    <!-- 必要的權限 -->
    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>
 
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.RECEIVE_MMS" />
 
    <uses-permission android:name="android.permission.WRITE_SMS"/>
    <uses-permission android:name="android.permission.RESPOND_VIA_MESSAGE" />
    <uses-permission android:name="android.permission.WAP_PUSH_DELIVER" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
 
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-feature android:name="android.hardware.telephony" android:required="true"/>
 
</manifest>
 
public class MainActivity extends AppCompatActivity {
   private static final int REQUEST_ROLE_SMS = 2310;
    private static final int REQUEST_READ_SMS = 1001;
    private static final int REQUEST_READ_CONTACTS = 100;
    private static final int REQUEST_PERMISSIONS = 1001;
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        if (!isDefaultSmsApp()) {
            Log.d("test", "onCreate:1111 ");
            requestSetDefaultSmsApp();
        }
            // 確保權限請求
            Log.d("test", "onCreate:22222!! ");
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED ||
                    ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
                Log.d("test", "onCreate:33333!! ");
                ActivityCompat.requestPermissions(
                        this,
                        new String[]{Manifest.permission.READ_SMS, Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_CONTACTS},
                        1001
                );
            } else {
                // 權限已獲得,執行後續動作
                Log.d("test", "onCreate:44444!! ");
                executeAfterPermissionGranted();
            }
 
 
 
 
 
   }
   private boolean isDefaultSmsApp() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            RoleManager roleManager = (RoleManager) getSystemService(ROLE_SERVICE);
            if (roleManager != null) {
                boolean isRoleAvailable = roleManager.isRoleAvailable(RoleManager.ROLE_SMS);
                boolean isRoleHeld = roleManager.isRoleHeld(RoleManager.ROLE_SMS);
 
                Log.d("SMS_ROLE", "Role available: " + isRoleAvailable);
                Log.d("SMS_ROLE", "Role held: " + isRoleHeld);
 
                return isRoleHeld;
            } else {
                Log.e("SMS_ROLE", "⚠️ 無法取得 RoleManager,回傳 false");
                return false;
            }
        } else {
            String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(this);
            return getPackageName().equals(defaultSmsApp);
        }
    }
   private void requestSetDefaultSmsApp() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            RoleManager roleManager = (RoleManager) getSystemService(ROLE_SERVICE);
            if (roleManager != null && roleManager.isRoleAvailable(RoleManager.ROLE_SMS)) {
                if (!roleManager.isRoleHeld(RoleManager.ROLE_SMS)) {
                    Log.d("SMS_ROLE1", "請求系統設置為預設 SMS 應用...");
                    Intent intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_SMS);
                    if (intent == null) {
                        Log.e("SMS_ROLE", "無法創建請求角色的 Intent");
                        return;
                    }
                    startActivityForResult(intent, REQUEST_ROLE_SMS);   ** //這行一直執行不了,沒有畫面**
                } else {
                    Log.d("SMS_ROLE2", "已經是預設 SMS 應用");
                }
            }
        } else {
            // Android Q 以下版本處理
            String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(this);
            if (!getPackageName().equals(defaultSmsApp)) {
                Log.d("SMS_ROLE3", "請求設置為預設 SMS 應用...");
                Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
                intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, getPackageName());
                startActivityForResult(intent, REQUEST_ROLE_SMS);
            } else {
                Log.d("SMS_ROLE4", "已經是預設 SMS 應用");
            }
        }
    }
 
}
 
阅读 240
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进