2016-03-13 28 views
6

Sau khi thực hiện một số tài nguyên và câu hỏi, tôi vẫn gặp phải sự cố khi phát hiện tin nhắn SMS đến.BroadcastReceiver SMS_Received không hoạt động trên các thiết bị mới

Đoạn code dưới đây cho thấy những điều cơ bản:

Broadcast lớp nhận hiển thị bánh mì nướng onReceive

public class IncomingSms extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "something received", Toast.LENGTH_SHORT).show(); 
    } 
} 

Simple Manifest với đăng ký nhận và cho phép

<application 
    <receiver 
     android:name=".IncomingSms" 
     android:permission="android.permission.BROADCAST_SMS" 
     android:exported="true"> 

     <intent-filter android:priority="2147483647" > 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 

</application> 

<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
<uses-permission android:name="android.permission.READ_SMS" /> 
<uses-permission android:name="android.permission.SEND_SMS" /> 

Đoạn mã trên khai báo và đăng ký người nhận và đã quảng cáo quyền r. Ngoài ra, mức độ ưu tiên được đặt thành MAX_INT hoặc 2147483647.

Thiết bị của tôi là Nexus 6P, với ứng dụng Messenger mặc định được cài đặt (Tôi cũng đã thử Hangouts). Các ứng dụng vẫn không hiển thị bánh mì nướng của tôi. Sau khi thử trên một thiết bị Samsung cũ, bánh mì nướng được in đúng cách.

vấn đề ưu tiên

tôi cài đặt trên 6P một ứng dụng gọi là Manifest Viewer, cho phép tôi để xem manifest.xml các ứng dụng cài đặt trên điện thoại của tôi. Tôi đã kiểm tra các tệp kê khai của cả Messenger và Hangouts, đối với người nhận thẻ SMS và nhận thấy cả hai đều chỉ định mức độ ưu tiên là 2147483647. Có vẻ như cả hai ứng dụng nhắn tin đều có mức độ ưu tiên cao nhất và khi họ sử dụng thông điệp, họ không cho phép các ứng dụng khác can thiệp. Lưu ý rằng đây là các ứng dụng của Google và không phải bên thứ ba.

Tại thời điểm này, tôi khá bối rối là:

  • tại sao họ sẽ làm điều này?
  • cách bỏ qua?

Thanks a lot

Trả lời

13

OK vấn đề đã được giải quyết. Sự cố không tồn tại với các mức độ ưu tiên, nhưng với điện thoại của tôi là Nexus 6P (a.k.a. API 23).

Chỉ cấp quyền trong tệp manifest.xml là không đủ và tôi phải thêm mã cho yêu cầu cấp phép thời gian chạy.Xem Android documentation for runtime permissions

Thêm mã này để MainActiviy của bạn:

ActivityCompat.requestPermissions(this, 
      new String[]{Manifest.permission.RECEIVE_SMS}, 
      MY_PERMISSIONS_REQUEST_SMS_RECEIVE); 

Xác định này ở phía trên cùng của MainActivity Class:

private int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10; 

Và cũng thêm ghi đè này:

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if (requestCode == MY_PERMISSIONS_REQUEST_SMS_RECEIVE) { 
     // YES!! 
     Log.i("TAG", "MY_PERMISSIONS_REQUEST_SMS_RECEIVE --> YES"); 
    } 
} 
+0

Cũng có Nexus 6P. Cảm ơn những gì tôi cần! Cảm ơn bạn – RJB

+2

Cảm ơn bạn, bài đăng tuyệt vời, rất hữu ích. Mặc dù tôi có ấn tượng rằng vấn đề có liên quan nhiều hơn đến cấp độ 23 và không phải là thiết bị Nexus. Và có lẽ bạn nên lưu ý rằng ghi đè cuối cùng là không thực sự cần thiết, chỉ cho các mã sao chép zombie như tôi ra khỏi đó ;-) – anhoppe

0

Xin chắc chắn thực hiện của bạn là như thế này.

SMS Receiver lớp

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(); 
       } 
      } 
     } 
    } 

manifest.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 
      // your activity 
     </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> 

Hãy chắc chắn rằng bạn sử dụng gói được xác định riêng bạn. gói được định nghĩa ở đây là giả.

+0

tôi sẽ như trước tiên, hãy đảm bảo tôi phát hiện bất kỳ điều gì trong "onReceive" trước khi tiến hành triển khai chi tiết hơn . Tôi đã thử đoạn trích của bạn chỉ để xác nhận, và vẫn không có đầu ra. Tôi vẫn tin rằng nó có liên quan đến ưu tiên được đặt trên ứng dụng kho của Nexus. – Khorkhe

+0

Kiểm tra hướng dẫn này nếu bạn có nếu nó có thể giúp bạn. http://androidexample.com/Incomming_SMS_Broadcast_Receiver_-_Android_Example/index.php?view=article_discription&aid=62&aaid=87 –

+0

ahh thật đáng buồn là tôi đã thử tài nguyên này ... – Khorkhe

Các vấn đề liên quan