Не удалось создать экземпляр приемника в BroadcastReceiver

Это моя первая попытка сделать приложение для Android. Это простой прослушиватель SMS, который затем отображает SMS как тост.

public class SmsReciever extends BroadcastReceiver {

String msgBody = null;
@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    if(intent.getAction().equals("android.provider.Telephony.SMS_RECIEVED")){
        Bundle bundle = intent.getExtras();
        SmsMessage[] msg = null;
        String msg_from;
        if(bundle != null)
        {
            try{
                Object[] pdus = (Object[]) bundle.get("pdus");
            msg = new SmsMessage[pdus.length];
            for(int i=0;i<msg.length;i++)
            {
                msg[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
                msg_from = msg[i].getOriginatingAddress();
                msgBody += msg[i].getMessageBody();
            }
            }catch(Exception e)
            {
                Log.d("Exception caught",e.getMessage());
            }
            Toast.makeText(context, msgBody, Toast.LENGTH_SHORT).show();
        }

    }
}}

Я получаю следующую ошибку:

java.lang.RuntimeException: Unable to instantiate receiver com.example.droid.SmsReceiver: java.lang.ClassNotFoundException: com.example.droid.SmsReceiver

Уверяю вас, что SmsReciever.java находится в droid/src. Я провел целую ночь, исследуя эту проблему. Пожалуйста помоги.

РЕДАКТИРОВАТЬ: это XML-файл манифеста, который вы просили.

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS" /> 

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" android:permission="android.permission.RECEIVE_SMS">
    <activity
        android:name=".JarvisActivity"
        android:label="@string/title_activity_jarvis" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".SecureMessagesActivity" 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" android:exported="false" >
        <intent-filter android:priority="1000">
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
</receiver>
</application>
</manifest>

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

РЕДАКТИРОВАТЬ: Хорошо, поэтому я удалил часть SecureMessageActivity из моего файла манифеста, и я думаю, что это устранило ошибку. Теперь я получаю это сообщение об отказе в разрешении:

Permission Denial: receiving Intent { act=android.provider.Telephony.SMS_RECEIVED  flg=0x10 (has extras) } to net.learn2develop.SMSMessaging requires android.permission.RECEIVE_SMS due to sender com.android.phone (uid 1001)

Также я использовал активность net.learn2develop.SMSMessaging в попытке скопировать другой код для той же цели, но теперь я удалил весь проект и много раз очищал свой собственный проект. Тем не менее, эта активность продолжает появляться снова и снова. редактировать Блин, скоро я начну сначала... Спасибо за ваш вклад.


person Community    schedule 23.09.2012    source источник
comment
Нет, чувак... Все перепробовал...   -  person    schedule 01.10.2012


Ответы (3)


У вас есть приемник в манифесте Adnroid? Если да, предоставьте также файл AndroidManifest.xml. Вы также можете проверить следующие связанные вопросы: Android – получатель SMS-рассылок, Приемник Android SMS не работает, BroadcastReceiver + SMS_RECEIVED.

ИЗМЕНИТЬ:

Попробуйте добавить android:exported="true" к вашему BroadcastReceiver. Этот приемник работает для меня:

<receiver android:name=".SmsBroadcastReceiver"
          android:enabled="true"
          android:exported="true">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

Теперь у вас есть android:exported="false", который в основном сообщает Android, что ваш BroadcastReceiver не может получать сообщения из источников вне вашего приложения. Подробнее об этом теге здесь: http://developer.android.com/guide/topics/manifest/receiver-element.html.

person Nikolai Samteladze    schedule 25.09.2012
comment
Привет, я добавил файл манифеста. Не могли бы вы взглянуть на это еще раз? - person ; 29.09.2012
comment
Отредактировал мой ответ. Измените тег android:exported на true. Это должно помочь. - person Nikolai Samteladze; 29.09.2012

попробуйте изменить свой приемник следующим образом в манифесте:

<receiver android:name="com.example.droid.SmsReceiver" >
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
</receiver>
person Naresh J    schedule 28.09.2012
comment
Все еще получаю ту же ошибку.. :( ... Может ли быть проблема с моим программным обеспечением Eclipse или SDK, который я установил... Я действительно становлюсь беспомощным здесь. - person ; 29.09.2012
comment
Я также реализовал такую ​​​​вещь. любой код, который вы предоставили, идеален. попробуйте очистить свой проект через eclipse. а затем проверьте. - person Naresh J; 29.09.2012

У меня есть идея, которая может вам помочь: давайте попробуем этот код:

<receiver android:name="com.example.droid.SmsReceiver" 
        android:exported="true" 
        android:enabled="true">
        <intent-filter android:priority="2147483647">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            <action android:name="android.provider.Telephony.GSM_SMS_RECEIVED" />
            <action android:name="android.provider.Telephony.SMS_RECEIVED2" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter android:priority="2147483647">
            <action android:name="android.intent.action.DATA_SMS_RECEIVED" />
            <data android:scheme="sms" />
            <data android:host="localhost" />
        </intent-filter>
</receiver>

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

person Michał Rowicki    schedule 13.05.2013