2016-03-13 17 views
6

Birkaç kaynak ve sorudan geçtikten sonra, gelen bir SMS mesajını tespit etme konusunda hala bir sorunla karşılaşıyorum.BroadcastReceiver SMS_Received yeni cihazlarda çalışma yok

aşağıdaki kod temellerini göstermektedir: görüntüler

Yayın alıcı sınıfı tost OnReceive alıcıyı ve izinleri

<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" /> 

Yukarıdaki kod kayıt ile Manifest Basit

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

Alıcıyı beyan eder, kaydeder ve provoke eder. r izinleri. Ayrıca öncelik, MAX_INT veya 2147483647 olarak ayarlanmıştır.

Cihazım varsayılan olarak Messenger uygulaması yüklü Nexus 6P'dir (ayrıca Hangouts'u denedim). Uygulama hala benim tostlarımı göstermiyor. Eski bir Samsung cihazını denedikten sonra tostlar düzgün bir şekilde basıldı.

Ben 6P'de yüklü

Öncelikli konu benim cihazda yüklü uygulamaların manifest.xml görmenizi sağlar Manifest Görüntüleyici denilen bir uygulama. Hem Messenger hem de Hangout'ların manifestolarını, SMS etiketinin alıcısı için kontrol ettim ve her ikisinin de 2147483647 önceliğini belirlediğini fark ettim. Her iki haberci uygulaması da önceliği maksimuma çıkarmış gibi görünüyor ve mesajı kullandıktan sonra diğer uygulamaların müdahale etmesine izin verme. Bunların 3. taraf değil, stok Google uygulamaları olduğunu unutmayın. Bu noktada

, ben olarak oldukça karıştı:

  • neden böyle bir şey yapsın?
  • nasıl atlanır?

Çok teşekkürler

cevap

13

Sorun çözüldü. Sorun, önceliklerle birlikte bulunmadı, ancak telefonum bir Nexus 6P (a.k.a. API 23) oldu.

Sadece manifest.xml dosyasında izinler yeterli değildi ve çalışma zamanı izni isteği için kod eklemem gerekiyordu.

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

MainActivity Sınıf üstündeki bu tanımla:

private int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10; 

Ve ayrıca bu geçersiz kılma ekleyin:

@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

Ayrıca Nexus 6P var. İhtiyacım olana teşekkürler! Teşekkürler – RJB

+2

Teşekkür ederim, harika yazı, çok yararlı. Her ne kadar problemin, Nexus cihazına değil, API 23 seviyesine daha çok bağlı olduğu izlenimine kapıldım. Ve belki de unutmamalısınız ki son geçersiz kılma gerçekten gerekli değil, sadece kod kopyalama zombileri benim için orada gibi ;-) – anhoppe

0

senin uygulama aşağıdaki gibi olduğundan emin olun.

SMS Alıcısı sınıf

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> 

emin Kendi tanımlanmış paketi kullanmak olun. Burada tanımlanan paket kukladır.

+0

isterim Android documentation for runtime permissions

sizin MainActiviy Bu kodu Bkz önce daha ayrıntılı bir uygulamaya girmeden önce "onReceive" de bir şey tespit ettiğimden emin olmak isterim. . Snippet'lerinizi yalnızca onaylamak için denedim ve hala çıkış yok. Yine de Nexus'un stok uygulamalarında belirlenen öncelik ile ilgili olduğuna inanıyorum. – Khorkhe

+0

Size yardımcı olabilir eğer bu öğretici kontrol edin. http://androidexample.com/Incomming_SMS_Broadcast_Receiver_-_Android_Example/index.php?view=article_discription&aid=62&aaid=87 –

+0

ahh ne yazık ki bu kaynağı zaten denedim ... – Khorkhe