2013-08-05 52 views
1

我正在創建一個接收SMS文本消息的應用程序,我創建了一個擴展BroadcastReceiver以在應用程序內的祝酒中接收和顯示SMS消息的類。我也添加了權限,我的清單以及接收者的聲明。問題是它似乎仍然沒有顯示消息。它只會顯示在頂欄上作爲通知。希望有人能夠看到我出錯的地方。爲了顯示消息,我必須在主要活動中使用一些代碼嗎?或者它應該顯示在我的所有活動中,直接從接收器中獲取?下面的代碼:在我的應用程序中接收SMS消息

UPDATE
我結束了我的刪除接收機和重建的一切,現在它似乎做工精細
SmsReceiver.java:

public class SmsReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
    Bundle extras = intent.getExtras(); 


    if (extras ==null) 
     return; 
    //toast 
    Toast.makeText(context, "Received", Toast.LENGTH_LONG).show(); 

    Object[] pdus = (Object[]) extras.get("pdus"); 

    for (int i = 0; i < pdus.length; i++) { 
     SmsMessage SMessage = SmsMessage.createFromPdu((byte[]) pdus[i]); 
     String sender = SMessage.getOriginatingAddress(); 
     String body = SMessage.getMessageBody().toString(); 

     Intent in = new Intent("SmsMessage.intent.MAIN").putExtra("get_msg", sender+":"+body); 

     context.sendBroadcast(in); 
     this.abortBroadcast(); 

    } 
} 
} 
+0

任何日誌? – njzk2

+0

烘烤通常不能從BroadcastReceiver中顯示(除非它是一個流程的一部分,它也恰好具有可見的活動)。改用通知。 – 323go

+1

那麼它可以將消息放入一個全局變量然後顯示在我的主要活動? –

回答

2

的問題是它似乎仍然沒有顯示消息。它只會作爲通知出現在頂欄上

你知道什麼是 - Ordered Broadcast

萬一你不知道 - 這是一個廣播,它是由所有註冊此廣播的接收器同步(一個接一個地)接收的。您可以在清單接收器中設置減速度a priority,並且每個接收器都可以控制廣播是否將通過使用aboartBroadcast()方法在優先級鏈中傳遞到其他已註冊的接收器。

這是什麼和接收短信? - 當SMS收到時,系統發送有序廣播。如果您的接收者優先級低於「默認的短信應用」優先級 - 那麼通常會發生的情況是,首先獲得廣播的應用將取消廣播,並且您永遠不會收到廣播。

要在默認SMS應用程序之前獲得廣播,您必須聲明具有高優先級的接收器(提供優先級= 1000應該有所訣竅)。

沒有提供優先級 - 它會自動設置爲零。

你可以在這個例子來看看 - How Can i INTERCEPT an Incoming SMS With A specific Text

也確保你宣佈清單

+1

啊我看到所以添加這應該使它工作?

+0

是的,你還必須在onHandleIntent()方法的末尾中止廣播。請確保SMSReceiver類位於應用程序的java文件根包名稱中。這就是你在清單中聲明的​​方式。 –

+0

哦,我以爲你有意圖過濾清單。下次閱讀Android文檔以防止出現此類問題。 –

0
@Override 
public void onReceive(Context context, Intent arg1) { 
     SmsMessage msgs[] = getMessagesFromIntent(arg1); 
     for (int i = 0; i < msgs.length; i++) { 
       SmsMessage mesg = msgs[i]; 
       Toast toast = Toast.makeText(context, mesg.getDisplayMessageBody(), Toast.LENGTH_LONG); 
       toast.show(); 
     } 
} 
+1

仍然不會顯示:我是否需要我的主要活動中的代碼才能從接收器或其他東西中獲取消息? –

1

到RECEIVE_SMS嘗試重新啓動和設置您的接收器,像這樣的權限....

public class SmsReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
    Bundle extras = intent.getExtras(); 


    if (extras ==null) 
     return; 
    //toast 
    Toast.makeText(context, "Received", Toast.LENGTH_LONG).show(); 

    Object[] pdus = (Object[]) extras.get("pdus"); 

    for (int i = 0; i < pdus.length; i++) { 
     SmsMessage SMessage = SmsMessage.createFromPdu((byte[]) pdus[i]); 
     String sender = SMessage.getOriginatingAddress(); 
     String body = SMessage.getMessageBody().toString(); 

     Intent in = new Intent("SmsMessage.intent.MAIN").putExtra("get_msg", sender+":"+body); 

     context.sendBroadcast(in); 
     this.abortBroadcast(); 

    } 
} 
} 
0
public class SmsReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
    Bundle extras = intent.getExtras(); 
    SmsMessage[] msgs = null; 
    String str = ""; 
    // retrieve the SMS message received :: 
    Object[] pdus = (Object[]) extras.get("pdus"); 
    msgs = new SmsMessage[pdus.length]; 
    for (int i = 0; i < msgs.length; i++) { 
    msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
    str += "SMS from : " + msgs[i].getOriginatingAddress(); 
     str += " :"; 
     str += msgs[i].getMessageBody().toString(); 
     str += "\n"; 
    // Toast to display SMS :: 
    Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); 

    // Send SMS :: 
    SmsManager sms = SmsManager.getDefault(); 
    sms.sendTextMessage("put your phoneNumber(emulatorPort)", null, str, null, null); 

    } 
} 
} 

- 有NIC e時間! 不要忘記添加權限!

相關問題