2012-07-11 41 views
7

tôi đã làm theo hướng dẫn để nhận SMS trên ứng dụng của tôi và đọc nó để chuyển SMS sang Toast. là lớp Người nhận.Nhận SMS trên Ứng dụng Android

public class SmsReciever extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent){ 
     Bundle bundle= intent.getExtras(); 
     SmsMessage[] msgs= null; 
     String str=""; 
     if(bundle != null){ 
      Object [] pdus=(Object[]) bundle.get("pdus"); 
      msgs=new SmsMessage[pdus.length]; 
      for(int i=0; i< msgs.length;i++){ 
       msgs[i]= SmsMessage.createFromPdu((byte[])pdus[i]); 
       str+= msgs[i].getMessageBody(); 

      } 
      Toast.makeText(context, str, Toast.LENGTH_LONG).show(); 
     } 
     } 

    } 

file manifest

<receiver android:name="com.msoft.masrooq.SmsReciever"> 
    <intent-filter> 
    <action android:name="android.provider.telephony.SMS_RECIEVED"></action> 
    </intent-filter> 
    </receiver> 
     <uses-permission android:name="android.permission.RECEIVE_SMS"/> 
      <uses-permission android:name="android.permission.READ_SMS" /> 

ứng dụng khởi động tốt nhưng nó không đáp ứng với nhận sms nó không làm gì cả.

+0

Tôi đang làm điều gì đó tương tự TẠI ĐÂY !!! http://stackoverflow.com/questions/14452808/sending-and-receiving-mms-in-android – toobsco42

+0

kiểm tra hướng dẫn đơn giản này http://tech-papers.org/receive_sms_from_android_app/ –

Trả lời

19

Đây là triển khai của tôi khi nhận tin nhắn sms. Tin nhắn SMS có thể được chia thành nhiều, thông báo cách xử lý. Đồng thời kiểm tra thuộc tính android:priority.

public class SmsReceiver extends BroadcastReceiver { 

    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(SMS_RECEIVED)) { 
      Bundle bundle = intent.getExtras(); 
      if (bundle != null) { 
       // get sms objects 
       Object[] pdus = (Object[]) bundle.get("pdus"); 
       if (pdus.length == 0) { 
        return; 
       } 
       // large message might be broken into many 
       SmsMessage[] messages = new SmsMessage[pdus.length]; 
       StringBuilder sb = new StringBuilder(); 
       for (int i = 0; i < pdus.length; i++) { 
        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
        sb.append(messages[i].getMessageBody()); 
       } 
       String sender = messages[0].getOriginatingAddress(); 
       String message = sb.toString(); 
       Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 
       // prevent any other broadcast receivers from receiving broadcast 
       // abortBroadcast(); 
      } 
     } 
    } 
} 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.smsreceiver" 
    android:versionCode="1" 
    android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="4" /> 
    <uses-permission android:name="android.permission.RECEIVE_SMS" /> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity 
      android:name=".SmsLoggerActivity" 
      android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <receiver android:name="com.example.smsreceiver.SmsReceiver" android:enabled="true"> 
      <intent-filter android:priority="2147483647"> 
       <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 

vài lưu ý: Nếu bạn khai báo thu của bạn trong xml hơn hệ thống có thể sử dụng máy thu của bạn bất kể ứng dụng của bạn đã từng đưa ra. Kể từ khi thông báo trên Android nhận được tin nhắn sms được phân phối dưới dạng chương trình phát sóng theo thứ tự, bạn có thể sử dụng thuộc tính android:priority của <intent-filter> để thông báo cho hệ thống gửi sms đầu tiên đến ứng dụng của bạn (bạn cũng có thể gọi abortBroadcast() để các ứng dụng khác không nhận được tin nhắn , ví dụ như ứng dụng sms gốc). Đừng quên người nhận phát sóng có khoảng 10 giây để thực hiện hoạt động của nó, nếu không nó có thể được kết thúc sớm trước khi hoàn thành công việc của mình.

+0

+1 Chỉ cần đứng lên, android. permission.SEND_SMS và android.permission.RECEIVE_SMS khác nhau. Và trong hoạt động chính của bạn chỉ cần tạo một đối tượng SmsReceiver(). – Sydwell

+0

Làm cách nào để thực hiện điều này cho MMS? – Arya

2

Các chương trình phát sóng phân biệt chữ hoa chữ thường. Sử dụng "android.provider điện thoại .SMS_RECEIVED." Chứ không phải "android.provider điện thoại .SMS_RECEIVED."

Ngoài ra, tôi cũng có một bộ thể loại, nhưng tôi không chắc chắn đó là bắt buộc:

<intent-filter> 
    <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
Các vấn đề liên quan