SMS Broadcast Receiver не получает текстовое сообщение - PullRequest
5 голосов
/ 25 октября 2011

Что я сделал


Здравствуйте, ребята, я сейчас создаю приемник SMS-трансляций, я только что создал его с помощью этого урока: Broadcasttutorial .После того, как я сделал код, я обновил свой манифест.После этого я отправил смс с другого телефона на мой телефон, но это не сработало.Я не получил никакого вывода.

Вопрос


Что мне нужно изменить, чтобы я мог получать эти SMS.Пожалуйста, дайте мне подробный ответ, что я могу выучить его, хороший учебник также будет отличным!

Код


SMSBroadcastReceiver (находится в пакете .services)

package de.retowaelchli.filterit.services;

import de.retowaelchli.filterit.R;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;


public class SmileySmsReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        //---get the SMS message passed in---
        Log.d("SmileySmsReceiver", "Yes it calls the onReceive");
        Bundle bundle = intent.getExtras();        
        SmsMessage[] msgs = null;
        String str = "";            
        if (bundle != null)
        {
            //---retrieve the SMS message received---
            Object[] pdus = (Object[]) bundle.get("pdus");
            msgs = new SmsMessage[pdus.length];            
            for (int i=0; i<msgs.length; i++){
                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                
                str += "SMS from " + msgs[i].getOriginatingAddress();                     
                str += " :";
                str += msgs[i].getMessageBody().toString();
                str += "\n";        
            }
            //---display the new SMS message---
            Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
        }                         
    }
}

Это мой AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="de.retowaelchli.filterit"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="10" />

    <!--  User Permission -->
    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>  

    <application android:icon="@drawable/icon"
                 android:label="@string/app_name"
                 android:debuggable="true"
                 android:screenOrientation="sensor"
                 android:theme="@style/FilterIt.Theme"> 

        <activity android:name=".SplashScreenActivity"
                  android:label="@string/app_name">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

     <!-- Receiver -->
        <receiver android:name="de.retowaelchli.filterit.services.SmileySmsReceiver" android:enabled="true"> 
            <intent-filter> 
                <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
            </intent-filter> 
        </receiver>     



        <!--  Startseite -->
        <activity android:name=".StartseiteActivity"></activity>

        <!-- Von Startseite ausgehende Activitys -->   
        <activity android:name=".SmileyActivity"></activity>
        <activity android:name=".ADeleteActivity"></activity>
        <activity android:name=".StatsActivity"></activity>
        <activity android:name=".HelpMenuActivity"></activity>


        <!-- Von Stats ausgehende Activitys -->
        <activity android:name=".stats.ADFilterStats"></activity>
        <activity android:name=".stats.SFilterStats"></activity>
        <activity android:name=".stats.CreatedADFilters"></activity>
        <activity android:name=".stats.CreatedSFilters"></activity>

        <!-- Von ADeleteActivity ausgehende Activitys -->
        <activity android:name=".ADFilterConfigActivity"></activity>

        <!--  Von SmileyActivity ausgehende Activitys -->
        <activity android:name=".SFilterConfigActivity"></activity>

    </application>
</manifest>

Ответы [ 3 ]

6 голосов
/ 25 октября 2011

Поместите <uses-permission android:name="android.permission.RECEIVE_SMS" /> вне тега <application>:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="de.retowaelchli.filterit"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="10" />

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

    <application android:icon="@drawable/icon"
                 android:label="@string/app_name"
                 android:debuggable="true"
                 android:screenOrientation="sensor"
                 android:theme="@style/FilterIt.Theme"> 

    <!-- Receiver -->
        <receiver android:name="de.retowaelchli.filterit.services.SmileySMSBroadcastReceiver"> 
            <intent-filter android:priority="999"> 
                <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
            </intent-filter> 
        </receiver>
       …
       …
    </application>
</manifest>

ОБНОВЛЕНИЕ

Оказалось, что @safari использует приложение "Handcent SMS" на своемтелефон, который перехватывает входящие SMS (это возможно, потому что SMS_RECEIVED является заказанной трансляцией и может быть отменена высокоприоритетными широковещательными приемниками, подробности см. в этой теме ).
Чтобы обойти эту проблему, нужнонеобходимо установить вещательный приемник с более высоким приоритетом, чем «Handcent SMS».@safari использовал самый высокий приоритет, допустимый для приложений в Android: 999 , и это сработало для него.
Чтобы указать приоритет приемника вещания, добавьте атрибут android:priority к соответствующему элементу <intent-filter>:

<receiver android:name="YourSmsBroadcastReceiver">
    <intent-filter android:priority="999"> 
        <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    </intent-filter>
</receiver>
0 голосов
/ 03 января 2014

gauglerb указал мне правильное направление здесь со своим комментарием для принятого ответа, и я думаю, что я должен поделиться своими выводами.

Handcent действительно был плохим парнем и не позволяет другим приложениям получать сообщения, когдаон установлен.

К счастью, есть простое решение, если вы не хотите удалять Handcent:
В настройках приложения Handcent есть возможность сделать Handcent приложением для обмена сообщениями по умолчанию.Если это отключено, сообщения могут поступать другим получателям.

0 голосов
/ 25 октября 2011
for (int i=0; i<pdus.length; i++)

вместо msgs.length, pdus содержит реальные смс-сообщения.

...