2011-12-30 52 views
22

Tôi đã xem một vài ví dụ về tin nhắn SMS và Các hoạt động thường được sử dụng để nhận SMS. Tuy nhiên, những gì tôi muốn làm là có dịch vụ nền của tôi nhận được tin nhắn SMS (dịch vụ sẽ xử lý tin nhắn và quyết định xem nó có áp dụng được cho ứng dụng hay không - sau đó thông báo cho người dùng)Có Dịch vụ nhận tin nhắn SMS

Trong tệp kê khai của tôi, dịch vụ là được định nghĩa như sau:

<service android:name=".service.myService" 
     android:enabled="true"> 
     <intent-filter> 
      <action android:name="package.com.service.myService"/> 
     </intent-filter> 
</service> 

để dịch vụ nhận SMS, công việc này có hoạt động không?

<receiver android:name=".service.myService" android:exported="true" > 
    <intent-filter android:priority="999"> 
    <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    </intent-filter> 
</receiver> 

Mẫu mã tôi đã nghiên cứu đến từ: http://www.apriorit.com/our-company/dev-blog/227-handle-sms-on-android

tôi không thể kiểm tra nó nhưng vì mô-đun phát triển của tôi không có một số điện thoại để gửi một tin nhắn SMS đến.

+0

> 2) KHÔNG cập nhật các biểu hiện với bộ lọc ý định thu! (trong đó > mọi mã mẫu trực tuyến dường như có thể làm) Bạn có thể đăng tệp AndroidManifest.xml của mình không? –

Trả lời

54

Tôi đã tìm ra giải pháp. Để có một dịch vụ nhận tin nhắn SMS:

  1. Cập nhật manifest để cung cấp cho ứng dụng của bạn cho phép để nhận SMS (WRITE_SMS, READ_SMS, RECEIVE_SMS)
  2. KHÔNG cập nhật các biểu hiện với bộ lọc ý định thu! (Mà mỗi mẫu mã dường như trực tuyến để làm)
  3. Trong dịch vụ của bạn, tạo ra một lớp BroadcastReceiver lồng nhau trong lớp dịch vụ của bạn

    private class SMSreceiver extends BroadcastReceiver 
    { 
        private final String TAG = this.getClass().getSimpleName(); 
    
        @Override 
        public void onReceive(Context context, Intent intent) 
        { 
         Bundle extras = intent.getExtras(); 
    
         String strMessage = ""; 
    
         if (extras != null) 
         { 
          Object[] smsextras = (Object[]) extras.get("pdus"); 
    
          for (int i = 0; i < smsextras.length; i++) 
          { 
           SmsMessage smsmsg = SmsMessage.createFromPdu((byte[])smsextras[i]); 
    
           String strMsgBody = smsmsg.getMessageBody().toString(); 
           String strMsgSrc = smsmsg.getOriginatingAddress(); 
    
           strMessage += "SMS from " + strMsgSrc + " : " + strMsgBody;      
    
           Log.i(TAG, strMessage); 
          } 
    
         } 
    
        } 
    
    } 
    
  4. Trong lớp dịch vụ của bạn, hãy đăng ký để nhận các bộ lọc ý định android.provider.Telephony.SMS_RECEIVED:

    public class ServiceCommunicator extends Service 
    { 
        private SMSreceiver mSMSreceiver; 
        private IntentFilter mIntentFilter; 
    
        @Override 
        public void onCreate() 
        { 
         super.onCreate(); 
    
         //SMS event receiver 
         mSMSreceiver = new SMSreceiver(); 
         mIntentFilter = new IntentFilter(); 
         mIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED"); 
         registerReceiver(mSMSreceiver, mIntentFilter); 
        } 
    
        @Override 
        public void onDestroy() 
        { 
         super.onDestroy(); 
    
         // Unregister the SMS receiver 
         unregisterReceiver(mSMSreceiver); 
        } 
    } 
    

Vậy là xong!

lưu ý: bọc bạn đang tự hỏi tại sao tôi không liên kết với dịch vụ của tôi từ bên trong một lớp BroadcastReceiver riêng biệt - nó không hoạt động vì bindService() không có sẵn.

+0

làm thế nào tôi có thể đọc sms đến trong lớp dịch vụ của tôi thông qua bộ thu phát sóng trong lớp SMSreceiver? – progNewbie

+0

@someone, bạn có thể giải thích thêm về cách tệp kê khai phải không hoặc nếu bạn có thể cung cấp bản sao? –

+0

@AboJihadBazoka, ông đã cho biết các quyền trong bước đăng bài của mình 1. Có thể là đủ. –

10

Mã của bạn có vẻ đúng. Bạn có thể kiểm tra mã của bạn bằng trình mô phỏng. Trình giả lập cũng hỗ trợ gửi tin nhắn tới thiết bị ảo. Xem thêm ảnh chụp màn hình:

Screenshot

Screen từ this answer.

0

Bạn có thể biến SmsReceiver tách biệt với Dịch vụ bằng cách sử dụng ngữ cảnh từ phương thức onReceive đến dịch vụ sao. Điều đó cho phép bạn không chạy dịch vụ mọi lúc. Hoặc thậm chí không bắt đầu hoạt động để đăng ký người nhận. Mặc dù tôi có thể nhầm lẫn.

Something như thế này:

@Override 
public void onReceive(Context context, Intent intent) { 

     if (intent.getAction().equals(SMS_RECEIVED)) { 
      Bundle bundle = intent.getExtras(); 
      if (bundle != null) { 
       Object[] pdus = (Object[]) bundle.get("pdus"); 
       if (pdus.length == 0) { 
        return; 
       } 
       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 number = messages[0].getOriginatingAddress(); 
       String messageText = sb.toString(); 


       Intent intent1 = new Intent(context, SMSreceiver.class); 
       intent1.putExtra(PHONE_NUMBER, number); 
       intent1.putExtra(SMS_TEXT, messageText); 

       context.startService(intent1); 
      } 
     } 
} 
Các vấn đề liên quan