无法在广播接收器中实例化接收器SMS

10

为什么会出现这个错误:

ERROR/AndroidRuntime(854): Uncaught handler: thread main exiting due to uncaught exception
ERROR/AndroidRuntime(854): java.lang.RuntimeException: Unable to instantiate receiver com.android.GPS21.SmsReceiver: java.lang.ClassNotFoundException: com.android.GPS21.SmsReceiver in loader dalvik.system.PathClassLoader@43d02ef0
ERROR/AndroidRuntime(854): Caused by: java.lang.ClassNotFoundException: com.android.GPS21.SmsReceiver in loader dalvik.system.PathClassLoader@43d02ef0

这是我的 onReceive 事件:

public void onReceive(Context context, Intent intent) {
  // TODO Auto-generated method stub
  Log.i(LOG_TAG, "Recieved a message");
  if (intent.getAction().equals(ACTION)) {
   // if(message starts with SMStretcher recognize BYTE)
   StringBuilder sb = new StringBuilder();

   // The SMS-Messages are 'hiding' within the extras of the Intent.
   Bundle bundle = intent.getExtras();
   if (bundle != null) {

    // Get all messages contained in the Intent
    // Telephony.Sms.Intents.getMessagesFromIntent(intent) does not
    // work anymore hence the below changes

    Object[] pduObj = (Object[]) bundle.get("pdus");
    SmsMessage[] messages = new SmsMessage[pduObj.length];
    for (int i = 0; i < pduObj.length; i++)
     messages[i] = SmsMessage.createFromPdu((byte[]) pduObj[i]);
    // Feed the StringBuilder with all Messages found.
    for (SmsMessage currentMessage : messages) {
     sb.append("SMS Received From: ");
     // Sender-Number
     sb.append(currentMessage.getDisplayOriginatingAddress());
     sb.append("\nMessage : ");
     // Actual Message-Content
     sb.append(currentMessage.getDisplayMessageBody());
    }
   }
   // Logger Debug-Output
   Log.i(LOG_TAG, "[SMSApp] onReceive: " + sb);

   // Show the Notification containing the Message.
   Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();
  }

在调试中,onReceive() 函数出错。

我刚刚创建了一个 BroadcastReceiver 来接收短信并在通知 Toast 中显示。

我尝试从 DDMS 发送 SMS,但出现了错误。

9个回答

13

你的清单文件(manifest)声称你有一个名为 com.android.GPS21.SmsReceiver 的类,但是 Android 找不到它。


1
com.android.GPS21.SmsReceiver是位于onReceiver的类。我认为这不是问题。 - fadli wdt
@fadli wdt:我告诉你这就是你的错误信息。如果这不是你的错误,那么我们无法帮助你。但我应该指出,如果你缺少超类(例如,com.android.GPS21.SmsReceiver 的超类找不到),你将会得到相同的错误消息。此外,由于你不是 Google 的员工,请不要使用 com.android 命名空间。请使用基于你拥有的域名的命名空间。 - CommonsWare
对于命名空间我很抱歉,我只是按照教程上的说法去做的。 - fadli wdt
请注意,即使您的项目包含 com.android.GPS21.SmsReceiver,该类也必须扩展 BroadcastReceiver。例如,如果您定义了 onReceive,但未将其声明为 @Override(不进行扩展),则不会出现错误,但在运行时会出现上述异常。 - Michael

5
这是一个旧问题,我不确定这是否是你遇到的问题,但我刚刚遇到了这个问题。在Eclipse中,我在错误的位置创建了文件夹(实际上是一个包)。例如:
不正确的方式
原因在于Broadcast文件夹/包不在命名空间中,这与您的期望不符。如果您右键单击My Program/src并在那里创建包,就会出现这种情况。请注意,My Program/src/Broadcast是错误的。
原因是SmsReceiver类不在您的命名空间中。在这种情况下,您的清单中可能有类似以下内容的东西。
<receiver android:name=".Broadcast.SmsReceiver">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

当这个被触发时,SmsReceiver类找不到,你会收到错误信息。 正确做法 enter image description here 正确的方法是右键点击 com.example.my.program 并在此处创建。请注意,现在位于相同命名空间的是 My Program/src/com.example.my.program.Broadcast
应用程序将通过上面相同的清单代码找到它。

1
我知道这篇文章已经发布有一段时间了,但我想感谢@Kirk提供的详细信息。由于它的全面性,它帮助我解决了自己的问题。 - AndroidDev

4
您的广播接收器类必须是一个公共类,例如:

public class ReceptorLlamadas extends BroadcastReceiver


2

您需要编写广播接收器的完整路径,我是指,如果在您的清单文件中,包名为“com.myapp”,但是您的MySmsBroadcast.java文件不在myapp包下(例如,它位于myapp.smsStuff.MySmsBroadcast下),则需要在清单文件中写出完整路径。


1
提供完全限定的类名,这对我有用。
像这样: *
<receiver android:name="com.zolipe.communitycensus.util.CensusReceiver">
     <intent-filter>
          <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
          <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
     </intent-filter>
</receiver>

*


1

您可以将接收器写为“static”。 在程序my.sample中,应该写接收器“static SimpleSmsReceiver”


1

我也遇到了同样的问题。在我的情况下,我的虚拟设备已经损坏了。

尝试创建一个新的虚拟设备并运行它。这对我有用!


0

我遇到了同样的错误。 在我修改了 "AndroidManifest.xml" 文件后,错误得到了解决。

receiver android:name=".SimpleSmsReceiver"

->

receiver android:name=".SimpleSMSReceiver"

错误信息如下。

...
01-13 10:23:10.787: ERROR/AndroidRuntime(378): java.lang.RuntimeException: Unable to instantiate receiver my.sample.SimpleSmsReceiver: java.lang.ClassNotFoundException: my.sample.SimpleSmsReceiver in loader dalvik.system.PathClassLoader[/data/app/my.sample-2.apk]
01-13 10:23:10.787: ERROR/AndroidRuntime(378):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2789)
01-13 10:23:10.787: ERROR/AndroidRuntime(378):     at android.app.ActivityThread.access$3200(ActivityThread.java:125)
01-13 10:23:10.787: ERROR/AndroidRuntime(378):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2083)

5
你的 AndroidManifest 有何不同? - fadli wdt

0

请确保您有一个没有参数的公共构造函数。 例如,我有自己的BroadcastReceiver实现,它在构造函数中接收一些属性。在我添加了一个公共默认(无参数)构造函数之后,它完美地工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接