Изпращане на mms в android 4.4

Опитвам се да изпратя mms само от моето приложение. Направих го стандартно приложение за съобщения с помощта на урок за разработчици на 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 да изпратя mms, това не работи и вместо това диалоговият прозорец се отваря така:

въведете описание на изображението тук

КОД:

  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

Най-лесният начин, който намерих за изпращане на mms, е библиотеката 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, порт и прокси от android? - 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 библиотека. - person Ado; 17.11.2014
comment
след като го променя на sqliteWrapper от android soucre от git, все още получавам това изключение, това perrmision е системно разрешение, така че не мога да го получа - person Mariusz; 17.11.2014
comment
Може би опитайте да зададете приложението си като приложение за съобщения по подразбиране? - person Ado; 17.11.2014
comment
съжалявам, че не отговарям, имам много работа, приложението е зададено на sms по подразбиране, все още има eception, на сайта на 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 /issues/23 - person Mariusz; 01.12.2014