我正在開發一個商業短信應用程序。在此應用程序中,如果收到的郵件來自特定號碼(例如999999999),它應該轉到應用程序的收件箱,而不是默認的本機收件箱。所有其他消息應該發送到手機的本機收件箱。我該怎麼做呢?如何防止SMS進入Android的收件箱?
回答
當短信被Android系統接收到的,它廣播一個ordered broadcastIntent
用行動"android.provider.Telephony.SMS_RECEIVED"
更多信息。包括系統默認SMS應用程序在內的所有已註冊的接收器按priority
的順序接收到,該順序在其intent-filter
中設置。未指定具有相同優先級的廣播接收者的訂單。任何BroadcastReceiver
都可以阻止任何其他註冊的廣播接收機使用abortBroadcast()
接收廣播。
所以,你需要的一切是廣播接收機是這樣的:
public class SmsFilter extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
Bundle extras = intent.getExtras();
if (extras != null) {
Object[] pdus = (Object[])extras.get("pdus");
if (pdus.length < 1) return; // Invalid SMS. Not sure that it's possible.
StringBuilder sb = new StringBuilder();
String sender = null;
for (int i = 0; i < pdus.length; i++) {
SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[i]);
if (sender == null) sender = message.getOriginatingAddress();
String text = message.getMessageBody();
if (text != null) sb.append(text);
}
if (sender != null && sender.equals("999999999")) {
// Process our sms...
abortBroadcast();
}
return;
}
}
// ...
}
}
貌似系統默認的業務處理應用程序使用的0
優先級,所以你可以嘗試1
您的應用程序,在它之前。這些行添加到您的AndroidManifest.xml
:
<receiver android:name=".SmsFilter">
<intent-filter android:priority="1">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
不要忘了必要的權限:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
順便說一句,你可以找到所有已註冊的接收器和它們的優先級使用此代碼:
Intent smsRecvIntent = new Intent("android.provider.Telephony.SMS_RECEIVED");
List<ResolveInfo> infos = context.getPackageManager().queryBroadcastReceivers(smsRecvIntent, 0);
for (ResolveInfo info : infos) {
System.out.println("Receiver: " + info.activityInfo.name + ", priority=" + info.priority);
}
更新:由於FantasticJamieBurn said below,從Android 4.4開始,唯一可以攔截的應用程序短信(如果需要,可以阻止)是默認的短信應用程序(由用戶選擇)。如果默認的短信應用沒有阻止,所有其他應用只能收聽短信。
請參閱Android 4.4 API中的SMS Provider。
絕對出色的答案,很好的解釋,爲我工作。謝謝。 – 2014-02-14 10:30:31
這似乎不適用於Android操作系統> = 4.3 – 2014-03-27 13:35:13
是這是可以做到
public void onReceive(Context context, Intent intent)
{
Bundle bundle=intent.getExtras();
Object[] messages=(Object[])bundle.get("pdus");
SmsMessage[] sms=new SmsMessage[messages.length];
Toast.makeText(context, "Hello", 1).show();
for(int n=0;n<messages.length;n++){
sms[n]=SmsMessage.createFromPdu((byte[]) messages[n]);
}
for(SmsMessage msg:sms){
if(msg.getOriginatingAddress().endsWith(number))
{
SMS.updateMessageBox("\nFrom: "+msg.getOriginatingAddress()+"\n"+
"Message: "+msg.getMessageBody()+"\n");
/*((SMS) context).delete();*/
abortBroadcast();
}
}
}
只是使用abortbroadcast()接收應用
藉助Android 4.4奇巧(API級19),以阻止一個SMS選項的釋放後消息並阻止其傳遞到默認的SMS應用程序已被刪除。非默認短信應用程序可能會在收到短信時觀察到短信,但任何中止廣播的嘗試都將被Android 4.4+忽略。
如果您有一個依賴於中止SMS消息廣播的現有應用程序,那麼您可能需要考慮當用戶升級到Android 4.4+時,這種行爲變化的影響。
http://android-developers.blogspot.co.uk/2013/10/getting-your-sms-apps-ready-for-kitkat.html
我也發現這不適用於4.3。 – 2014-03-27 13:34:21
檢查發件人數等於你的短信發送手機的手機號碼。
取代先生「腐敗的機器人」
if (sender != null && sender.equals("999999999")) {
到
if (sender != null && sender.equals("YOUR SMS SENDING MOBILE NUMBER HERE")) {
進一步的下面的代碼行越多,你能給的設置用戶手動添加短信發送號碼,如果他想改變它。
- 1. android SMS收件箱
- 2. 如何刪除Android中SMS收件箱中的所有消息?
- 3. 當手機斷開連接時,SMS進入收件箱
- 4. 如何計算固定日期收件箱SMS在Android
- 5. 如何創建SMS收件箱並將信息寫入SMS標頭
- 6. 如何防止用戶訪問收件箱中的郵件
- 7. 如何檢索/顯示最後收到的SMS從收件箱中的Android
- 8. 將C2DM發送到SMS收件箱
- 9. 如何使用j2me(midp2.0)從收件箱中讀取郵件(SMS)
- 10. 如何使用cordova打開手機默認SMS收件箱?
- 11. 如何在iPhone中以編程方式閱讀SMS收件箱?
- 12. 如何防止進入空的空間?
- 13. 限制短信進入收件箱
- 14. 如何防止git接收
- 15. 停止SMS接收器
- 16. 訪問沒有內容的郵件收件箱UrI(content //:sms)
- 17. 如何在Android上模擬SMS接收?
- 18. 如何防止slidy進入點擊
- 19. 如何防止重新進入節點
- 20. 防止點擊進入事件的JavaScript
- 21. 我可以將我的SMS收件箱的內容放入數組中嗎?
- 22. Android Widget限制(不適用於收件箱中的10 000條SMS消息)
- 23. 如何防止郵件進入垃圾郵件?
- 24. 防止沙箱的Java
- 25. 如何在應用程序內的SMS收件箱中搜索單詞?
- 26. 如何以編程方式打開默認的SMS收件箱活動?
- 27. 如何防止或阻止拒絕收入攻擊?
- 28. 短信收件箱Android 4.4
- 29. Android訪問收件箱
- 30. 在閱讀新的收到的SMS或收件箱SMS後是否可以發送回覆?
http://stackoverflow.com/questions/9123125/class-0-sms-flash-sms-on-android/9123172#9123172 – xDragonZ 2012-02-07 12:31:22
@Tom Medely。謝謝。 – nsm 2012-02-07 20:06:14
可能[重複](http://stackoverflow.com/q/1741628/1050058) – 2012-10-06 10:35:32