我查看了官方文件,也爬了各种论坛,作了很多种测试,但就是没办法跳出「成为短信预设处理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 應用");
}
}
}
}