1

Я был озадачен этим недавно, до 2.3.5 это, похоже, отлично работает (на устройствах моих коллег). Однако по моему это сейчас никогда не срабатывает.SMS_RECEIVED onReceive android 2.3.5 не запускается

Я удалил код обратно и сделал очень простое тестовое приложение, чтобы посмотреть, что происходит. В основном код onReceive никогда не появляется, даже если adb/logcat действительно показывает, что регистр BroadcastReveiver действительно имеет место.

Вот простой код, который я пошел на:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.broadcasttech.testsmsreceive" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="9" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:label="@string/app_name" 
     android:name=".TestSMSReceiveActivity" > 
     <intent-filter > 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <receiver android:name=".mysmstestcall"> 
    <intent-filter> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED"></action> 
    </intent-filter> 
</receiver> 
</application> 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> 
</manifest> 

Тогда:

package com.broadcasttech.testsmsreceive; 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.util.Log; 

public class TestSMSReceiveActivity extends Activity { 
private BroadcastReceiver receiver; 
private static final String TAG = "TestSMSApp"; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Log.i(TAG, " App has started up"); 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction("android.provider.Telephony.SMS_RECEIVED"); 
    Log.i(TAG, " Filter SMS_RECEIVED has been added"); 
    //Extends BroadcastReceiver 
    receiver = new mysmstestcall(); 
    registerReceiver(receiver,filter); 
    Log.i(TAG, " registerReceiver sorted"); 
} 

//Also, to save headaches later 
@Override 
protected void onDestroy() { 
    Log.i(TAG, " unregistering Receiver"); 
    unregisterReceiver(receiver); 
    Log.i(TAG, " done"); 
} 
} 

И наконец

package com.broadcasttech.testsmsreceive; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class mysmstestcall extends BroadcastReceiver { 

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

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.i(TAG, "Intent recieved: " + intent.getAction()); 
    if (intent.getAction() == SMS_RECEIVED) { 
     //any action you want here.. 
     Log.i(TAG, "SMS received has triggered"); 
    } 
} 
} 

Так что это довольно простое приложение, которое нужно просто войти и скажите мне, когда запущен BroadcastReceiver, но он просто не срабатывает вообще.

Может кто-нибудь предложить что-то не так, я проверил различные учебники, проверял, как я знаю, IceCreamSandwich отличается, но также пытался включить эти исправления, и это тоже не имеет значения.

Заранее благодарен!

+0

В вашем манифестке отсутствует «использование-разрешение», необходимое для приема полученной трансляции SMS Кроме того, вы установили какие-либо SMS-приложения из Android Market (или в другие места) - некоторые из них заблокируют другие приложения (только для shits and higgles) от получения ** заказанного вещания **, зарегистрировавшись на очень высоком уровне приоритет и отмена намерения трансляции. – Jens

+0

К сожалению, это был редактор, удаляющий использование-разрешение. Я исправил это, спасибо за хедз-ап (у моего приложения есть это, чтобы это не было ключом). «Handcent SMS» установлен, поэтому я задаюсь вопросом, может ли это делать упорядоченная трансляция. Есть ли способ обойти это? – Andyb

+0

Снимите ручку и снова проверьте. Регистрация выполняется с первого взгляда (в случае, когда два приемника зарегистрированы для одного и того же приоритета - если я правильно помню), если разработчики Handcent SMS делают глупые и безответственные вещи. Вы всегда можете показать предупреждение в своем приложении о том, что у пользователя установлено вредоносное ПО, которое может помешать работе этого приложения (например, Handcent), если это так. – Jens

ответ

0

Есть ли причина, по которой у вас есть два приемника? У вас есть programatic слушателя и у вас есть XML слушатель

Programatic:

filter.addAction("android.provider.Telephony.SMS_RECEIVED"); 
Log.i(TAG, " Filter SMS_RECEIVED has been added"); 
//Extends BroadcastReceiver 
receiver = new mysmstestcall(); 

XML Слушатель:

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

Вы уверены, что вы хотите, эти два ? Если у вас есть два вы получите один широковещательные 2 раза ...

Что касается других ВЫПУСКА, что я вижу, эта линия

if (intent.getAction() == SMS_RECEIVED) 

При сравнении строк вы DO NOT сравнить их как это вместо того, чтобы вы бы что-то вроде этого:

if (intent.getAction().equalsIgnoreCase(SMS_RECEIVED)) 
+0

Это связано с тем, что в новой ОС, выпущенной (IceCreamSandwich) и т. Д., Рекомендуется делать это таким образом. AFAIK не будет регистрировать один и тот же объект дважды, поэтому не будет вызывать два предупреждения. – Andyb

+0

приятно знать, спасибо. – JoxTraex

2

Основная проблема заключается в том, что эта линия в «mysmstestcall» является неправильным:

if (intent.getAction() == SMS_RECEIVED)

должен быть изменен на это:

if (intent.getAction().equals(SMS_RECEIVED)) 
0

У меня один раз. Это может быть проблема сети. Это были мои question and answer. Вы можете добавить намерение отправки и уловить код результата. В моем случае это было RESULT_ERROR_GENERIC_FAILURE.Я пытался найти другие решения в течение нескольких месяцев, но мне не повезло, поэтому я согласился с тем, что, хотя я не хочу :-(

0
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.telephony.SmsMessage; 
import android.widget.Toast; 

public class SmsBroadcastReceiver extends BroadcastReceiver{ 
    public static final String SMS_BUNDLE = "pdus"; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Bundle intentExtras = intent.getExtras(); 
     if (intentExtras != null) { 
      Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE); 
      String smsMessageStr = ""; 
      for (int i = 0; i < sms.length; ++i) { 
       SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]); 

       String smsBody = smsMessage.getMessageBody().toString(); 
       String address = smsMessage.getOriginatingAddress(); 

       smsMessageStr += "SMS From: " + address + "\n"; 
       smsMessageStr += smsBody + "\n"; 
      } 
      Toast.makeText(context, "A new message is added to the SMS List!!!\n"+smsMessageStr, Toast.LENGTH_SHORT).show(); 

      //this will update the UI with message 
      InboxMain inst = InboxMain.instance(); 
      inst.updateList(smsMessageStr); 

    } 

} 
} 


manifest:: 
<receiver android:name=".SmsBroadcastReceiver" 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> 

permission:: 
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission> 
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> 
<uses-permission android:name="android.permission.VIBRATE"/> 
<uses-permission android:name="android.permission.WRITE_SMS" /> 
    <uses-permission android:name="android.permission.READ_SMS" /> 
    <uses-permission android:name="android.permission.RECEIVE_SMS" /> 
Смежные вопросы