Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接收android 2.3.5未触发时收到SMS__Java_Android_Broadcastreceiver_Telephony_Android 2.3 Gingerbread - Fatal编程技术网

Java 接收android 2.3.5未触发时收到SMS_

Java 接收android 2.3.5未触发时收到SMS_,java,android,broadcastreceiver,telephony,android-2.3-gingerbread,Java,Android,Broadcastreceiver,Telephony,Android 2.3 Gingerbread,最近,在2.3.5版本之前,我一直对这个问题感到困惑,它似乎工作得很好(在我同事的设备上)。然而在我的身上,它现在从不触发 我已经将代码剥离回来,并制作了一个非常简单的测试应用程序,以查看发生了什么。基本上,onReceive代码似乎从未触发过,即使adb/logcat确实显示了BroadcastReveiver的寄存器确实发生过 以下是我所追求的简单代码: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:andro

最近,在2.3.5版本之前,我一直对这个问题感到困惑,它似乎工作得很好(在我同事的设备上)。然而在我的身上,它现在从不触发

我已经将代码剥离回来,并制作了一个非常简单的测试应用程序,以查看发生了什么。基本上,onReceive代码似乎从未触发过,即使adb/logcat确实显示了BroadcastReveiver的寄存器确实发生过

以下是我所追求的简单代码:

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

<uses-sdk android:minSdkVersion="9" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:label="@string/app_name"
        android:name=".TestSMSReceiveActivity" >
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <receiver android:name=".mysmstestcall">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
    </intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
</manifest>
最后

package com.broadcasttech.testsmsreceive;

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

public class mysmstestcall extends BroadcastReceiver {

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

@Override
public void onReceive(Context context, Intent intent) {
     Log.i(TAG, "Intent recieved: " + intent.getAction());
     if (intent.getAction() == SMS_RECEIVED) {
         //any action you want here..
         Log.i(TAG, "SMS received has triggered");
     }
}
}
因此,这是一个相当简单的应用程序,只需记录并告诉我何时触发BroadcastReceiver,但它根本不会启动

有谁能告诉我哪里出了问题吗?我查阅了各种教程,我知道冰淇淋三明治是不同的,但我也尝试了将这些修复方法结合起来,这也没有什么区别


提前谢谢

你有两个接受者是有原因的吗?您有一个编程侦听器和一个XML侦听器

可编程的

filter.addAction("android.provider.Telephony.SMS_RECEIVED");
Log.i(TAG, " Filter SMS_RECEIVED has been added");
//Extends BroadcastReceiver
receiver = new mysmstestcall();
<receiver android:name=".mysmstestcall">
<intent-filter>
    <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
</intent-filter>
XML侦听器

filter.addAction("android.provider.Telephony.SMS_RECEIVED");
Log.i(TAG, " Filter SMS_RECEIVED has been added");
//Extends BroadcastReceiver
receiver = new mysmstestcall();
<receiver android:name=".mysmstestcall">
<intent-filter>
    <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
</intent-filter>
当比较字符串时,您不要像这样比较它们,相反,您会得到如下结果:

if (intent.getAction().equalsIgnoreCase(SMS_RECEIVED))

主要问题是“mysmstestcall”中的这一行是错误的:

if(intent.getAction()==SMS\u已收到)

应改为:

if (intent.getAction().equals(SMS_RECEIVED)) 

我有过一次。这可能是网络的问题。这些是我的。您可以添加发送意图并捕获结果代码。就我而言,是这样的。几个月来,我一直试图找到其他解决方案,但运气不佳,所以我接受了,尽管我不想:(

导入android.content.BroadcastReceiver;
导入android.content.Context;
导入android.content.Intent;
导入android.os.Bundle;
导入android.telephony.sms消息;
导入android.widget.Toast;
公共类SmsBroadcastReceiver扩展广播接收器{
公共静态最终字符串SMS_BUNDLE=“PDU”;
@凌驾
公共void onReceive(上下文、意图){
Bundle intentExtras=intent.getExtras();
if(intentExtras!=null){
Object[]sms=(Object[])intentExtras.get(sms_BUNDLE);
字符串SMSMessagester=“”;
对于(int i=0;i
您的清单缺少捕获接收到的短信广播所需的
使用权限
。除此之外,您是否从Android Market(或其他地方)安装了任何短信应用程序-其中一些应用程序会阻止其他应用程序(只是为了拉屎和咯咯笑)通过以非常高的优先级注册并取消广播意图来接收已订购的广播。哦,这是编辑器删除了使用权限。我已经纠正了这一点,感谢提醒(我的应用程序确实有,所以这不是关键)。但是,我确实安装了“Handcent SMS”,因此我想知道这是否可以进行有序广播。有什么方法可以解决此问题吗?卸载Handcent并再次测试。注册是先到先得(如果两个接收器注册的优先级相同-如果我没记错的话)如果Handcent SMS的开发人员正在做愚蠢和不负责任的事情。您可以在应用程序中始终显示警告,说明用户安装了可能干扰此应用程序(即Handcent)运行的恶意软件如果是这种情况,应用程序不太可能更改系统级广播的顺序。它无法模拟,因此无法更改。系统级广播受到保护,无法复制。如果一个应用程序可以阻止另一个应用程序接收广播,这将是使用st可能不是这样。你已经在Jens上找到了它。我没有卸载Handcent(现在我想起来了,我还有其他一些通过短信的远程控制软件也可以做到这一点)。所以我只是将我的应用程序改为使用:果然,它工作得很好。这是因为在发布的较新操作系统(IceCreamSandwich)中,等等,建议这样做。否则它不会两次注册同一实体,因此不会导致两次警报。
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;

public class SmsBroadcastReceiver extends BroadcastReceiver{
    public static final String SMS_BUNDLE = "pdus";
    @Override
    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]);

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

                smsMessageStr += "SMS From: " + address + "\n";
                smsMessageStr += smsBody + "\n";
            }
            Toast.makeText(context, "A new message is added to the SMS List!!!\n"+smsMessageStr, Toast.LENGTH_SHORT).show();

            //this will update the UI with message
            InboxMain inst = InboxMain.instance();
            inst.updateList(smsMessageStr);

    }

}
}


manifest::
<receiver android:name=".SmsBroadcastReceiver" android:permission="android.permission.BROADCAST_SMS" android:exported="true">
    <intent-filter android:priority="2147483647" >
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
 </receiver>

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