0

我在 SO 上看到 @Commonsware 声明接收 SMS 所需的只是广播接收器(即,使用服务)。我想采用这种方法,因为它对我来说很有意义。不幸的是,在我的广播接收器中似乎没有接收/处理 SMS。apk 已成功安装,但在我发送测试 SMS 时未生成任何日志条目。我究竟做错了什么?

这是清单:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.oheller.pete2"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="17" />

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/icon_broadcastreceiver"
        android:label="@string/sms_broadcastreceiver"
        android:theme="@style/Theme.eagleeyeactionbar" >

        <receiver android:name=".SMSReceiver_Test" >
            <intent-filter android:priority="999">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

        <provider
            android:name=".contentprovider.GPSTrackerContentProvider"
            android:authorities="net.oheller.pete2.contentprovider"
            android:grantUriPermissions="true"
            android:multiprocess="true"
            android:permission="true" >
        </provider>
    </application>

</manifest>

这是短信接收器代码。它的目的是通过 SMS 收集数据并将每个记录写入内容提供者(SQLite 数据库)。

public class SMSReceiver_Test extends BroadcastReceiver { 
TelephonyManager telephonyManager;
String deviceCountryCode = "";

@Override
public void onReceive(Context context, Intent intent) {
    //Get the SMS message passed in from the intent
    Bundle SMSmessageContent = intent.getExtras();
    SmsMessage[] receivedSMS = null;
    String returnStr = "";
    Long current_time_stamp = Calendar.getInstance().getTimeInMillis();
    String curTimeString = getFormattedDate(current_time_stamp, "dd-MMM-yy h:mma");     

    telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);       

    String incoming_SMSphone_number = "";
    String SMSmsgText = "";
    long timeStamp = current_time_stamp;

    if (SMSmessageContent != null) {  // [IF valid SMS]
        //Retrieve the SMS message info
        Object[] pdus = (Object[]) SMSmessageContent.get("pdus");
        receivedSMS = new SmsMessage[pdus.length];
        for (int i=0; i<receivedSMS.length; i++) {  // [FOR get SMS content]
            receivedSMS[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
            incoming_SMSphone_number = receivedSMS[i].getOriginatingAddress().toString().trim();
            SMSmsgText = receivedSMS[i].getMessageBody().toString();
            returnStr += curTimeString +"\n";

Log.d("EagleEye", String.format("SMSReciever: SMS=\"%s\"", SMSmsgText))  ;  ///DEBUG
        }  // [ENDFOR get SMS content]

            ///////////////////////////
            // prepare values for insertion into the SQLite DB
                ContentValues GPSTrackValues = new ContentValues();
                GPSTrackValues.put(GPSTrackerTable.COLUMN_PHONE_NUMBER, incoming_SMSphone_number);
                GPSTrackValues.put(GPSTrackerTable.COLUMN_TIME_STAMP, timeStamp);

 //// Prepare access to content provider
                Uri GPSuri = GPSTrackerContentProvider.CONTENT_URI_GPS_Tracks; //specify the content provider location
                ContentResolver GPSTrackCR = context.getContentResolver();          

                // Insert new entry into DB
                Uri insertURI = GPSTrackCR.insert(GPSuri, GPSTrackValues);      
Log.d("EagleEye", "DB insert results="+insertURI)  ;  ////////DEBUG

    }  // [ENDIF Valid SMS] 
}  // [END onReceive]
   }  // [END SMSReceiver]
4

4 回答 4

3

代码在我看来是正确的。您可以尝试通过将优先级提高 max ..

 <intent-filter android:priority="2147483647">

在某些情况下,当其他接收者在您之前收到短信并中止它们时。

于 2013-01-18T09:45:02.127 回答
1

您的优先级可能不够好,请尝试将其设置为 2147483647。

    <receiver android:name=".SMSReceiver_Test" >
        <intent-filter android:priority="2147483647">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

之后,尝试在调试模式下启动它,并在 onReceive 方法中设置断点,或者创建一个Log.i("BroadcastSMSReceiver", "Received something in SMSRECEIVERTEST"):)

编辑,将优先级设置为高数字而不是 1,只需读取高数字等于更高的优先级。

于 2013-01-18T09:43:30.040 回答
0

基于android开发者文档必须是-1000>priority<1000,因此intent-filter的最高优先级是999

于 2013-12-09T17:02:15.313 回答
0

移除android:priority属性

于 2013-01-18T09:48:43.470 回答