Перехват текстовых сообщений: проблемы отладки - PullRequest
0 голосов
/ 03 февраля 2011

Я использую простой метод BroadcastReceiver и onReceive для перехвата текстовых сообщений по мере их поступления. Почему-то каждый раз, когда я отправляю текстовое сообщение: приложение вылетает. Когда я пытаюсь отладить приложение: я отправляю текстовое сообщение, и приложение все еще падает, но вместо того, чтобы перевести меня в класс Receiver, оно приостанавливается внутри «ActivityThreadhandleReceiver (ActivityThread, ActivityThreadReceiverData)». Окно отладки просто говорит для потока: «(Приостановлено (исключение RuntimeException))».

Как я должен выяснить, почему происходит сбой моего приложения, если оно не позволяет мне перебирать код.

Вот мой класс приемника:

public class FinderReciever extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent)
{
Bundle bundle = intent.getExtras();
SmsMessage[ ] msgs = null;
String str = "";
if (bundle != null)
{
//---retrieve the received message here ---
Object[ ] pdus = (Object[ ]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i<msgs.length; i++){
msgs[i] = SmsMessage.createFromPdu((byte[ ])pdus[i]);
str += "SMS from " + msgs[i].getOriginatingAddress();
str += " :";
str += msgs[i].getMessageBody().toString();
str += "\n";
}
// ........first show sms here.....
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
} 

А вот и мой манифест:

<?xml version="1.0" encoding="utf-8"?>

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

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

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

Любая помощь будет высоко ценится. Спасибо!

РЕДАКТИРОВАТЬ: Даже после переформатирования метода для запуска в моей основной деятельности я получаю точно такой же результат. Точно такой же метод работает при отправке текстов. Намерение:

        String SENT = "SMS_SENT";
    String DELIVERED = "SMS_DELIVERED";
    String RECEIVED = "SMS_RECEIVED";


    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
        new Intent(SENT), 0);

    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
        new Intent(DELIVERED), 0);

    PendingIntent receivedPI = PendingIntent.getBroadcast(this, 0, new Intent(RECEIVED), 0);

    //---when the SMS has been sent---
    registerReceiver(new BroadcastReceiver(){
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode())
            {
                case Activity.RESULT_OK:
                    Toast.makeText(getBaseContext(), "FRIGGEN SMS!", 
                            Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    Toast.makeText(getBaseContext(), "Generic failure", 
                            Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE:
                    Toast.makeText(getBaseContext(), "No service", 
                            Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU:
                    Toast.makeText(getBaseContext(), "Null PDU", 
                            Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF:
                    Toast.makeText(getBaseContext(), "Radio off", 
                            Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }, new IntentFilter(RECEIVED));

1 Ответ

0 голосов
/ 04 февраля 2011

В вашем файле манифеста есть ошибка - имя получателя должно совпадать с именем класса. Таким образом, для вашего класса FinderReciever, описанного выше, вам нужно:

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

Вы также можете убедиться, что это проблема, посмотрев logcat. Вы должны увидеть что-то вроде:

ERROR/AndroidRuntime(1708): FATAL EXCEPTION: main
ERROR/AndroidRuntime(1708): java.lang.RuntimeException: Unable to instantiate receiver xxx.xxxx.SmsReceiver: java.lang.ClassNotFoundException: ....
...