2015-07-16 7 views
1

Я написал ниже метод для чтения входящего sms-текста. Этот код отлично работает в Android 4.04, когда клиент SMS по умолчанию является родным клиентом SMS, но когда клиент SMS является Hangout, метод не работает.Чтение SMS не работает

Тот же метод работает в Android 5 с Hangouts в качестве клиента SMS, проблема только в Android 4.04 с Hangouts в качестве клиента SMS. Пожалуйста, дайте мне знать, если я ничего не пропущу.

static boolean readSMS(Intent intent, int code) { 
    try { 
     Bundle bundle = intent.getExtras(); 
     if (bundle != null) { 
      Object[] pdusObj = (Object[]) bundle.get("pdus"); 
      for (int i = 0; i < pdusObj.length; i++) { 
       SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]); 
       String message = currentMessage.getDisplayMessageBody(); 
       if (message.contains(String.valueOf(code))) 
        return true; 
      } 
     } 
    } catch (Exception e) { 
     return false; 
    } 
    return false; 
} 

Метод вызывается из кода Java в BroadCastReceiver.

 receiver = new BroadcastReceiver() { 
       @Override 
       public void onReceive(Context context, Intent intent) { 
        Bundle bundle = intent.getExtras(); 
        if (bundle != null) { 
        if (readSMS(intent, code)) { 
        ------------------ 
        } 
       } 

BroadCastReceiver вызывается как:

context.registerReceiver(receiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED")); 

Manifest.xml

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

ответ

2

Входящее SMS является Broadcast transmission, который вы можете зарегистрировать receiver, чтобы слушать и отвечать согласно вашей логике. Вы можете зарегистрировать несколько приемников для трансляции SMS, и все они получат SMS, один за другим, по определенному заказу.
Как мы можем узнать заказ? Каждый приемник имеет priority, а ОС отправляет SMS из приемника с более высоким приоритетом в нижние.
Upto Android 4.4 (за исключением), вы могли бы использовать инструкцию abortBroadcast();, которая прекратила бы отправку. Допустим, у нас есть два приложения - A и B с SMS-приемниками. Если A имеет более высокий приоритет, чем B, а A использует оператор abort, то приложение B никогда не получит SMS. От Android 4.4 и дальше вы больше не можете прерывать передачу SMS.
С вашего вопроса это похоже на то, что при использовании Android 4.0.4 клиент Hangouts имеет более высокий приоритет от вашего приложения и прерывает широковещательную передачу, тогда как клиент по умолчанию не отменяет его (или имеет более низкий приоритет). Когда вы переключаетесь на Android 5, Hangouts не может прервать SMS, поэтому ваше приложение работает так, как должно.
Что касается приоритетов - documentation утверждает, что «Значение должно быть целым числом, например« 100 ». Более высокие номера имеют более высокий приоритет. Значение по умолчанию равно 0. Значение должно быть больше -1000 и меньше, чем 1000. ".
Вы можете добавить в свой menifanifest линии

<intent-filter android:priority="999"> 

и надеемся, что приоритетом HANGOUT является ниже.

+0

Приоритет может быть установлен намного выше этого значения, вплоть до максимальных значений Integer в Java. Кроме того, вы можете просто посмотреть, какой приоритет Hangouts установлен для их получателя - это будет в их манифесте. –

+0

@ TheoLassonder Есть ли способ проверить манифест Hangouts? Я думал, что нет способа сделать это – Psypher

+0

@ ɥʇᴉɾuɐɹ Я проверил его, он зашифрован. Но попробуйте добавить строку «priority» в ваш манифест и проверить ее с разными значениями, вам нечего терять. – TDG