无法在BroadcastReceiver中实例化接收器

时间:2012-09-23 23:04:58

标签: java android sms broadcastreceiver instantiationexception

这是我制作Android应用的第一步。它是一个简单的SMS侦听器,然后将SMS显示为Toast。

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部分,我猜它删除了错误。现在我收到了Permisssion拒绝消息:

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 活动尝试复制另一个代码用于相同的目的,但现在我删除了整个项目并多次清理了我自己的项目。这项活动仍然一次又一次地出现。 的修改 Chuck it我将很快重新开始...感谢所有的投入。

3 个答案:

答案 0 :(得分:1)

你的Adnroid清单中有接收器吗?如果是,请提供AndroidManifest.xml。您可能还想查看以下相关问题:Android - SMS Broadcast receiverAndroid SMS receiver not workingBroadcastReceiver + 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

答案 1 :(得分:0)

尝试在清单中更改您的接收器:

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

答案 2 :(得分:0)

我知道哪些可以帮到你:让我们试试这段代码:

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

不同类型的设备可以使用自己的操作名称,而不是标准。