Приложение не получает MMS-сообщения

Я разрабатываю систему обмена сообщениями SMS / MMS, и мне нужно приложение для получения как SMS-, так и MMS-сообщений. Он отлично принимает SMS-сообщения. Тестирую на реальном телефоне (Galaxy S7 Edge 7.01).

Приложение не принимает MMS-сообщения. Согласно этому сообщению, мой манифест верен:

    <receiver android:name="com.webnation.text2email.receivers.MMSBroadcastReceiver"
        android:enabled="true"
        android:permission="android.permission.BROADCAST_WAP_PUSH"
        android:exported="true">
        <intent-filter>
            <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />

            <data android:mimeType="application/vnd.wap.mms-message" />
        </intent-filter>
    </receiver>

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

    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.RECEIVE_MMS"/>
<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH"/>
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="com.android.vending.BILLING" />

Мой радиоприемник:

public class MMSBroadcastReceiver extends BroadcastReceiver {

  private static final String ACTION_MMS_RECEIVED = "android.provider.Telephony.WAP_PUSH_DELIVER";
  private static final String MMS_DATA_TYPE = "application/vnd.wap.mms-message";

  // Retrieve MMS
  public void onReceive(Context context, Intent intent) {

    this.context = context; <------- break point set here. 
    String action = intent.getAction();
    String type = intent.getType();
    int typeMessage = -1;
    byte[] pushData;
    GenericPdu pdu = null;
    Toast.makeText(context, "MMS received", Toast.LENGTH_LONG).show();

    if (action.equals(ACTION_MMS_RECEIVED) && type.equals(MMS_DATA_TYPE)) {

        Bundle bundle = intent.getExtras();

        Timber.d("bundle " + bundle);
        if (bundle != null) {
            pushData = intent.getByteArrayExtra("data");
            PduParser parser = new PduParser(pushData);
            pdu = parser.parse();
            PduHeaders headers = pdu.getPduHeaders();

            Timber.d("buffer " + pushData);
            String incomingNumber = new String(pushData);
            int indx = incomingNumber.indexOf("/TYPE"); // not used, parse the number in MMUtils.getAddress instead
            if (indx > 0 && (indx - 15) > 0) {
                int newIndx = indx - 15;
                incomingNumber = incomingNumber.substring(newIndx, indx);
                char[] characters = incomingNumber.toCharArray();
                int index = 0;
                for (int i=0;i<characters.length;i++) {
                    if (Character.isDigit(characters[i]) ){


                        index = i;
                        break;
                    }
                }
                //indx = incomingNumber.indexOf("+");
                if (index > 0) {
                    incomingNumber = incomingNumber.substring(index);
                    TelephonyManager tm = (TelephonyManager)context.getSystemService(context.getApplicationContext().TELEPHONY_SERVICE);
                    String countryCode = tm.getNetworkCountryIso().toUpperCase();
                    try {
                        String prefix = CountryToPhonePrefix.prefixFor(countryCode).replace("+", "");
                        int indexOfBaseNumber = incomingNumber.indexOf(prefix);
                        if (indexOfBaseNumber > -1) {

                            if (indexOfBaseNumber == 0) {
                                int lengthPrefix = prefix.length();
                                indexOfBaseNumber = indexOfBaseNumber + lengthPrefix;
                            }
                            incomingNumber = incomingNumber.substring(indexOfBaseNumber);
                        }

                    } catch (IllegalArgumentException ie) {
                        Timber.e(ie);
                    } catch (IndexOutOfBoundsException ie) {
                        Timber.e(ie);;
                    }
                    Timber.d("Mobile Number: " + incomingNumber);
                }
            }

            int transactionId = bundle.getInt("transactionId", -1);
            Timber.d("transactionId " + transactionId);

            int pduType = bundle.getInt("pduType", -1);
            Timber.d("pduType " + pduType);

            byte[] buffer2 = bundle.getByteArray("header");

            if (buffer2 != null) {
                String header = new String(buffer2);
                Timber.d("header " + header);
            }
            List<MMSMessage> textMessages = MMSUtils.getMessagesFrom(context, intent); //meat of onReceive()
            sendMessages(textMessages);

        } else {
            Timber.e("Invalid PUSH data");
        }

    }


}
}

Что я делаю неправильно?


person Kristy Welsh    schedule 12.04.2018    source источник
comment
@MikeM. Я действительно пробовал с WAP_PUSH_RECEIVED, и это не сработало.   -  person Kristy Welsh    schedule 12.04.2018
comment
Что ж, что вы изменили с тех пор: stackoverflow.com/questions/49039151/?   -  person Mike M.    schedule 12.04.2018
comment
@MikeM. Абсолютно ничего, кроме WAP_PUSH_RECEIVED.   -  person Kristy Welsh    schedule 12.04.2018
comment
Думаю, я здесь не слежу. Вы говорите, что это никогда не работало? Или на этом устройстве не работает? Или он перестал работать при обновлении версий? Или что-то другое?   -  person Mike M.    schedule 12.04.2018
comment
Он не работает на моем устройстве - не уверен, будет ли он работать на других устройствах. Он работал некоторое время после добавления правильного разрешения в отладку, затем не работал, когда не находился в отладке. Затем я попытался добавить WAP_PUSH_DELIVER, но он все еще не работает.   -  person Kristy Welsh    schedule 12.04.2018
comment
Кроме того, уверены ли вы, что полученные сообщения действительно являются MMS? Могут ли они быть RCS? Если это так, ваш Ресивер вообще не сработает.   -  person Mike M.    schedule 12.04.2018
comment
Да, конечно, это MMS-сообщения. Мое приложение для обмена сообщениями помечает их как сообщения MMS.   -  person Kristy Welsh    schedule 12.04.2018
comment
Хорошо, хотя я бы не стал слепо доверять этому. :-) В любом случае, у меня S7 на 7.0, так что я сам проведу несколько тестов позже, когда у меня будет возможность, и сообщу, если найду что-нибудь полезное.   -  person Mike M.    schedule 12.04.2018
comment
Да, и просто к вашему сведению, я предложил награду за свой предыдущий вопрос. Огромное спасибо!!!!   -  person Kristy Welsh    schedule 12.04.2018
comment
Что ж, у меня (в конце концов) не было проблем с получением MMS, даже если это не по умолчанию, как в отладочной, так и в выпускной сборках. Сначала у меня был включен расширенный обмен сообщениями (еще один термин для RCS; есть несколько разных названий для него), и я был немного озадачен, пока не забыл отключить его. После этого все работает как положено. Кто ваш оператор сотовой связи? Можете ли вы получить, когда вы по умолчанию, с WAP_PUSH_DELIVER? Вы действительно уверены, что это сообщения MMS? Вы можете попробовать сделать ContentResolver#query(), чтобы убедиться.   -  person Mike M.    schedule 13.04.2018
comment
Помимо этого, единственное, о чем я могу сейчас думать, - это проверить, есть ли на вашем устройстве дополнительные средства безопасности, которые могут помешать сторонним приложениям получать MMS, хотя я предполагаю, что это также заблокирует SMS.   -  person Mike M.    schedule 13.04.2018
comment
@MikeM. Мой провайдер - Sprint. Я также пробовал отправлять себе MMS-сообщения, используя шлюз по умолчанию, отправляя по электронной почте ‹mynumber› @ pm.sprint.com. Так что почти уверен, что я отправляю сообщения в MMS.   -  person Kristy Welsh    schedule 13.04.2018


Ответы (1)


Добавление следующего к моей основной деятельности в Манифесте, похоже, решило проблему:

    <activity
        android:name="com.webnation.text2email.main.SMSEmailActivity"
        android:label="@string/app_name"
        >
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <action android:name="android.intent.action.SENDTO" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data android:scheme="sms" />
            <data android:scheme="smsto" />
            <data android:scheme="mms" />
            <data android:scheme="mmsto" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
person Kristy Welsh    schedule 13.04.2018