Отправка ммс в андроид 4.4

Я пытаюсь отправить ммс только из своего приложения. Я сделал его приложением для обмена сообщениями по умолчанию с помощью руководства для разработчиков Android (http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html).

Мой манифест:

BroadcastReceiver, который прослушивает входящие SMS-сообщения:

   <receiver android:name="com.test.SmsReceiver"
        android:permission="android.permission.BROADCAST_SMS">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_DELIVER" />
        </intent-filter>
    </receiver>

BroadcastReceiver, который прослушивает входящие сообщения MMS

 <receiver android:name="com.test.MmsReceiver"
        android:permission="android.permission.BROADCAST_WAP_PUSH">
        <intent-filter>
            <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
            <data android:mimeType="application/vnd.wap.mms-message" />
        </intent-filter>
    </receiver>

Сервис доставки сообщений с телефона быстрого ответа

<service android:name="com.test.HeadlessSmsSendService"
        android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"
        android:exported="true" >
        <intent-filter>
            <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="sms" />
            <data android:scheme="smsto" />
            <data android:scheme="mms" />
            <data android:scheme="mmsto" />
        </intent-filter>
    </service>

NewMmsActivity Действие, позволяющее пользователю отправлять новые SMS/MMS-сообщения:

 <activity android:name="com.test.NewMmsActivity"
        android:configChanges="keyboard|keyboardHidden|locale|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
        android:label="@string/app_name"
        android:launchMode="singleTop"
        android:screenOrientation="portrait">
        <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>
    </activity>

Но когда я пытаюсь в NewMmsActivity отправить ммс, это не работает, и вместо этого диалоговое окно открывается следующим образом:

введите здесь описание изображения

КОД:

  Intent mmsIntent = new Intent(Intent.ACTION_SEND);
  mmsIntent.putExtra("sms_body", "text");
  mmsIntent.putExtra("address", "99999999");
  mmsIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(fileString)));
  mmsIntent.setType("image/jpeg");
  startActivity(mmsIntent);

Если я использую Intent.ACTION_SENDTO, ничего не происходит. Intent запускается без проблем, но ничего не происходит.

Что мне не хватает?


person Ado    schedule 23.09.2014    source источник
comment
Не могли бы вы расширить не работает. Вы получаете ошибки? Изображение не появляется?   -  person RyPope    schedule 23.09.2014
comment
@RyPope: ничего не происходит. Намерение начинается, но ничего не отправляется.   -  person Ado    schedule 23.09.2014
comment
Хорошо, попробуй мой ответ   -  person RyPope    schedule 23.09.2014


Ответы (3)


Как приложение по умолчанию, ваше отвечает за отправку самого MMS, а не за открытие другого приложения для этого, что и делает ваш код. В настоящее время в Android нет простого API для MMS, как для SMS. Кроме того, это очень плохо документированный аспект фреймворка, а объем кода и пояснений, необходимых для его реализации, выходит за рамки Stack Overflow. Вы можете ознакомиться с исходным кодом собственного приложения для получения рекомендаций, но имейте в виду, что это нетривиальная задача, поскольку приложение по умолчанию отвечает за все необходимое для обработки MMS, включая отправку, получение и транзакции поставщика контента.

person Mike M.    schedule 23.09.2014
comment
Но зачем схемы типа mmsto: и т.д., если это невозможно? - person Ado; 23.09.2014
comment
Я не говорил, что это невозможно, просто это не тривиально, и ваше приложение должно с этим справиться, поэтому ваш NewMmsActivity включает эту схему в свой <intent-filter>. - person Mike M.; 23.09.2014
comment
Эта страница блога (на которую ссылаются почти все, пытаясь обновить SMS-приложения для KitKat) вводит в заблуждение, поскольку в ней не упоминается, что операции MMS никогда не были легко реализованы в Android, хотя любое приложение, предназначенное для использования по умолчанию, должно их обрабатывать. . - person Mike M.; 23.09.2014

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

mmsIntent.setType("*/*");
person RyPope    schedule 23.09.2014
comment
Не работает. Я также попытался изменить ACTION_SEND на ACTION_SENDTO, потому что ACTION_SEND открывает диалоговое окно выбора, и ничего не происходит. - person Ado; 23.09.2014
comment
Как в диалоге ничего не появляется? - person RyPope; 23.09.2014

Самый простой способ, который я нашел для отправки ммс, - это библиотека android-smsmms, найденная здесь: https://github.com/klinker41/android-smsmms

Для получения mmsc, прокси и порта я использовал:

 final Cursor apnCursor = SqliteWrapper.query(mContext, this.mContext.getContentResolver(),
                Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current"), APN_PROJECTION, null, null, null);
        String type = null;
        if (apnCursor.moveToFirst()) {
            do {
                type = apnCursor.getString(3);
                if(type.equals("default,supl,mms") ||
                        type.equals("mms")) {
                    mmsc = apnCursor.getString(0);
                    proxy = apnCursor.getString(1);
                    port = apnCursor.getString(2);
}while (apnCursor.moveToNext());

В цикле if я проверяю, есть ли у APN данные MMS, которые мне нужны, иначе я перейду к следующему.

person Ado    schedule 26.09.2014
comment
Как получить Mmsc, порт и прокси с андроида? - person Mariusz; 14.11.2014
comment
как получить доступ к скрытому классу SqlliteWrapper? я пытаюсь сделать это с помощью ContentResolver, но только я получаю Вызвано: java.lang.SecurityException: нет разрешения на запись настроек APN: ни пользователь 10656, ни текущий процесс не имеют android.permission.WRITE_APN_SETTINGS. - person Mariusz; 17.11.2014
comment
Вы можете найти эти файлы в библиотеке smsmms, которую я разместил выше (или получить их самостоятельно из исходного кода Android). Поэтому, когда вы создаете объект SqlliteWrapper, убедитесь, что это библиотека smsmms one. - person Ado; 17.11.2014
comment
после того, как я изменил его на sqliteWrapper из android soucre из git, я все еще получаю это исключение, это разрешение является системным разрешением, поэтому я не могу его получить - person Mariusz; 17.11.2014
comment
Может быть, попробовать установить ваше приложение в качестве приложения для обмена сообщениями по умолчанию? - person Ado; 17.11.2014
comment
извините, что не ответил, у меня много дел, приложение настроено на смс по умолчанию, все еще прием, на сайте lib git добавьте образец, я попробую запустить его - person Mariusz; 19.11.2014
comment
образец из них git может получить некоторые данные apn, но он все равно не может их отправить, я сейчас пойду на git - person Mariusz; 19.11.2014
comment
Для отправки mms библиотека, которую я предоставил по ссылке, у меня тоже не работала мгновенно. Мне пришлось удалить несколько строк в библиотеке, чтобы она заработала. - person Ado; 19.11.2014
comment
я наконец нашел проблему и решение с помощью разработчика библиотеки github.com/klinker41/android-smsmms /вопросы/23 - person Mariusz; 01.12.2014