【问题标题】:SMS Broadcast Receiver works in debug only with emulatorSMS Broadcast Receiver 只能在模拟器中调试
【发布时间】:2011-12-25 08:49:54
【问题描述】:

我有一个应用程序尝试从特定发件人那里捕获 SMS 消息,然后开始一个新活动。当使用 Debug As 在 Eclipse 中运行并使用我的 BroadcastReceiver 模拟器时,它工作得很好,它按预期命中断点。当我在 Eclipse 中使用 Run As 在模拟器中启动时,SMS 消息永远不会被捕获。由于缺少日志输出,似乎从未调用过 BroadcastReceiver。在我的手机上运行时,短信也不会被捕获。任何想法为什么它以一种方式工作而不是另一种?

我的手机上只有很少的应用程序,我所知道的唯一一个可以捕捉短信的是内置的信使。

<receiver android:name=".sms.ConfirmationResponder">
  <intent-filter android:priority="100">
    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  </intent-filter>
</receiver>

...

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

接收者:

public class ConfirmationResponder extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.i("SMS", "############################ Confirmation being read");
        // More stuff after this but I don't even get the log message
    }
}

【问题讨论】:

  • 如何在发布和调试模式下构建?
  • 我只是在模拟器和手机上使用 Eclipse 中的运行命令。
  • 因此,您是指模拟器中的调试模式和真机中的发布模式?也许,在真正的手机上,您已经订购了 SMS 接收的意图,而标准接收器具有更高的优先级。尝试增加优先级(将其设置为 999)。也许这会有所帮助。
  • 我的意思是在 Eclipse 中同时运行调试和运行。当我执行 Debug As... 时,它会调用接收器。当我运行时......它没有。将澄清我的帖子。尝试增加优先级无济于事。内置的 Messenger 应用在​​处理短信后会停止广播吗?
  • 根据我的经验 - 不。但我想,也许你在真实设备上运行你的应用程序,可能会有一些特殊性。

标签: android sms broadcastreceiver


【解决方案1】:

这是我的程序:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;

public class SMSBroadcastReceiver extends BroadcastReceiver {

        private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
        private static final String TAG = "SMSBroadcastReceiver";

        @Override
        public void onReceive(Context context, Intent intent) {
             Log.i(TAG, "Intent recieved: " + intent.getAction());

                if (intent.getAction() == SMS_RECEIVED) {
                    Bundle bundle = intent.getExtras();
                    if (bundle != null) {
                        Object[] pdus = (Object[])bundle.get("pdus");
                        final SmsMessage[] messages = new SmsMessage[pdus.length];
                        for (int i = 0; i < pdus.length; i++) {
                            messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
                        }
                        if (messages.length > -1) {
                            Log.i(TAG, "Message recieved: " + messages[0].getMessageBody());
                        }
                    }
                }
           }
    }

还有清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="Technicaljar.SMSBroadcastReceiver"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true" >
        <receiver android:name=".SMSBroadcastReceiver">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
            </intent-filter>
        </receiver>

    </application>
    <uses-sdk android:minSdkVersion="7" />
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
</manifest> 

希望对你有帮助

【讨论】:

    【解决方案2】:

    我认为它可以工作,但是当“运行为”模式并且不显示 logcat 信息时,eclipse 没有连接到设备。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 2011-03-12
      • 2023-01-10
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多