【问题标题】:Unable to instantiate receiver in BroadcastReceiver SMS无法在 BroadcastReceiver SMS 中实例化接收器
【发布时间】:2017-09-25 16:02:14
【问题描述】:

为什么会出现这个错误:

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 并出现该错误..

【问题讨论】:

    标签: android sms broadcastreceiver


    【解决方案1】:

    您的清单声称您有一个名为 com.android.GPS21.SmsReceiver 的类,而 Android 找不到它。

    【讨论】:

    • com.android.GPS21.SmsReceiver 是 onReceiver 所在的类。我认为这不是问题..
    • @fadli wdt:我告诉你,这就是你的错误所说的。如果这不是您的错误,那么我们无法帮助您。尽管我应该指出,如果您缺少超类(例如,找不到您的 com.android.GPS21.SmsReceiver 的超类),您将收到相同的错误消息——我认为。此外,由于您不为 Google 工作,请不要使用 com.android 命名空间。根据您拥有的域名使用一个。
    • 对不起命名空间。我只是按照教程说的。
    • 请注意,即使您的项目包含com.android.GPS21.SmsReceiver,该类也必须扩展BroadcastReceiver。例如,如果您定义了onReceive,但没有将其声明为@Override(没有扩展),您不会收到错误,但您会在运行时收到上述异常。
    【解决方案2】:

    这是一个老问题,我不确定这是你的问题,但我刚刚遇到了这个问题。在 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 类找不到,你会得到错误。

    正确

    正确的做法是,在正确的命名空间中获取包是右键单击 com.example.my.program 并在那里创建它。请注意,My Program/src/com.example.my.program.Broadcast 现在正确地位于同一命名空间中。

    这将被具有上述相同清单代码的应用程序找到。

    【讨论】:

    • 我知道这篇文章发布已经有一段时间了,但我想感谢@Kirk 提供的详细信息。由于它的彻底性,它帮助我解决了我自己的问题。
    【解决方案3】:

    例如,您的 broadcastReceiver 类必须是公共类

    公共类 ReceptorLlamadas 扩展 BroadcastReceiver

    【讨论】:

      【解决方案4】:

      你必须写下你的 broadcastReceiver 的完整路径,我的意思是,如果在你的清单文件中你是 jave package="com.myapp",但你的 MySmsBroadcast.java 并不完全在 myapp 包下(它在 myapp.smsStuff 上。例如,MySmsBroadcast),在

      【讨论】:

        【解决方案5】:

        我也遇到了同样的问题。就我而言,我的虚拟设备已损坏。

        尝试创建一个新的并运行它。为我工作!

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            提供完全限定的类名,这对我有用

            像这样: *

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

            *

            【讨论】:

              【解决方案8】:

              我遇到了同样的错误。 像这样修改“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)
              

              【讨论】:

              • 你的 AndroidManifest 有什么不同?
              【解决方案9】:

              确保您有一个不带参数的公共构造函数。 例如,我有自己的 BroadcastReceiver 实现,它接收构造函数的一些属性。在我添加了一个公共默认(不带参数)构造函数后,它可以完美运行。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-06-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-04
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多