冰激凌三明治版本中SMS_RECEIVED无法工作?

21

我正在尝试使用android.provider.Telephony.SMS_RECEIVED来捕获传入的短信。

我构建了一个简单的应用程序,在2.x上运行良好,但是当我在我的4.0模拟器或设备上尝试时,它无法工作。

有任何想法吗?

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.giggsey.MyFirstApp" android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name">


    <receiver android:name=".MyFirstApp">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
        </intent-filter>
    </receiver>
</application>
<uses-sdk android:minSdkVersion="9" />


<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
</manifest>

MyFirstApp.java

public class MyFirstApp extends BroadcastReceiver {

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

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

你正在使用真机还是模拟器? - rekire
@rekire 都在4.0上。也尝试了2.3的模拟器,可以工作。 - giggsey
我已经将接收器名称更改为一个不存在的类,但仍然没有任何反应(logcat中没有错误)。所以我想它甚至没有到达那一步。因此,要么它没有触发该意图(不太可能),要么它没有使用我的应用程序(很可能)。 - giggsey
没事,我没有看到Matt说的基本上和我说的一样... https://dev59.com/emsy5IYBdhLWcg3wyw-i#8421369 - rf43
2
看看这个答案,应该能解决你的问题。https://dev59.com/plvUa4cB1Zd3GeqPpxO2#7350165 - Gaurav Das
6个回答

4

请确保您实际上是在Activity或Service中创建并注册接收器,否则它将不会被调用(我认为)。

一个非常简单的例子可能是:

public class MyActivity extends Activity {

    private BroadcastReceiver receiver;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
        //Extends BroadcastReceiver
        receiver = new MyFirstApp();
        registerReceiver(receiver,filter);
    }


   //Also, to save headaches later
   @Override
   protected void onDestroy() {
        unregisterReceiver(receiver);
   }
}

我不能保证这种方法一定有效,但我相信它能修复一些问题。如果您对某些内容有疑问,请在评论区提问。您说得没错,因为您的接收器未注册到任何地方,所以它甚至没有被调用。如果您希望它在后台运行,请考虑使用服务。我真心希望这会有所帮助,祝您在您的努力中好运!


谢谢Matt,就是这个。很抱歉你没有得到赏金,我在过期之后才查看(有其他的事情要处理)。 - giggsey
2
一切都好,有趣的是,生活中不仅仅只有编程:0) - Matt
一个静态注册的接收器不需要动态注册。在上面评论中由@Gaurav链接的这篇帖子描述了这种情况下的实际问题。 - Mike M.

1
你只需要为接收者导出值true即可。
<receiver android:name=".MyFirstApp" exported="true">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
        </intent-filter>
</receiver>

0

如果您在后台尝试使用 "catch",您可以查看this post

"android.provider.Telephony.SMS_RECEIVED"服务中工作得很好。否则,只有在活动生命周期期间才能 "catch" 它。


抱歉,我应该更具体一些。“否则只有在活动生命周期期间才能“捕获”它”- 这部分是不正确的。动态注册接收器将起作用,只要注册组件在接收时处于活动状态即可。但是,接收器不需要动态注册。在清单中静态注册是有效的。在这种情况下的问题在此帖子中描述,由@Gaurav在他们对问题的评论中提到。 - Mike M.
不好意思,您提供的链接并没有描述我的问题和解决方法。静态清单接收器无法工作。 - itzhar
“静态清单接收器不起作用。” - 很抱歉,但这并不是真的。此外,无论您如何解决特定的问题,在这种情况下,应用程序处于停止状态阻止了接收器的工作。原帖需要在安装后至少运行一次活动才能启用静态注册的接收器。 - Mike M.
我修改了答案,所以只有遇到这个问题的人才能使用它。感谢您的反馈。 - itzhar
你是说在Lollipop中静态注册的接收器不起作用吗?这也不是真的。即使是平台短信应用程序也会在清单中注册其接收器(https://android.googlesource.com/platform/packages/apps/Mms/+/android-5.0.0_r1/AndroidManifest.xml)。 - Mike M.
让我们在聊天中继续这个讨论 - itzhar

0

我认为你的错误在于在包名中使用了类名。

在你的清单文件中,你写了 package="com.giggsey.MyFirstApp" 以及 <receiver android:name=".MyFirstApp"> 在你的接收器(receiver)中,这意味着你的接收器(receiver)的完整名称是 com.giggsey.MyFirstApp.MyFirstApp,但我相信它只是 com.giggsey.MyFirstApp

如果我的猜测正确,那么在你的清单(manifest)中将 com.giggsey.MyFirstApp 替换为 com.giggsey 就应该可以解决问题。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.giggsey" android:versionCode="1" android:versionName="1.0">
[...]

还有这个:

package com.giggsey;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyFirstApp extends BroadcastReceiver {
    private static final String TAG = "MyFirstApp";

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

尝试使用com.giggsey作为包名和完整路径(在接收方中为com.giggsey.MyFirstApp.MyFirstApp),但都没有成功 :( - giggsey

-1

这可能会有帮助.. 试试这个.. 在广播接收器类中

 public static final String SMS_BUNDLE = "pdus";


public void onReceive(Context context, Intent intent)
{

     Bundle intentExtras = intent.getExtras();
        if (intentExtras != null) {
            Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE);
            String smsMessageStr = "";
            for (int i = 0; i < sms.length; ++i) {
                SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]);

                smsBody = smsMessage.getMessageBody().toString();
                address = smsMessage.getOriginatingAddress();

                smsMessageStr += "SMS From: " + address + "\n";
                smsMessageStr += smsBody + "\n";
            }
            Toast.makeText(context, smsMessageStr, Toast.LENGTH_SHORT).show();
    }

-2
在 On receive 中,请尝试添加以下行。
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";

if (intent.getAction() == SMS_RECEIVED) {
    //any action you want here..
    Toast.makeText(MyClass.this, "SMS RECEIVED",Toast.LENGTH_LONG).show();
}

3
调试Toast,安卓开发中的必备特性。 - rds

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