Как отправить изображение по MMS в Android?

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


person Sanjay    schedule 04.06.2010    source источник
comment


Ответы (4)


MMS - это просто запрос htttp-post. Вы должны выполнить запрос, используя дополнительную сетевую функцию:

final ConnectivityManager connMgr = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
final int result = connMgr.startUsingNetworkFeature( ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_MMS);

Если вы получили результат со значением Phone.APN_REQUEST_STARTED, вам нужно дождаться правильного состояния. Зарегистрируйте BroadCastReciver и дождитесь появления Phone.APN_ALREADY_ACTIVE:

final IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(reciver, filter);

Если фон подключения готов, создайте контент и выполните запрос. Если вы хотите сделать это с помощью внутреннего кода Android, используйте это:

final SendReq sendRequest = new SendReq();
    final EncodedStringValue[] sub = EncodedStringValue.extract(subject);
    if (sub != null && sub.length > 0) {
        sendRequest.setSubject(sub[0]);
    }
    final EncodedStringValue[] phoneNumbers = EncodedStringValue
            .extract(recipient);
    if (phoneNumbers != null && phoneNumbers.length > 0) {
        sendRequest.addTo(phoneNumbers[0]);
    }

    final PduBody pduBody = new PduBody();

    if (parts != null) {
        for (MMSPart part : parts) {
            final PduPart partPdu = new PduPart();
            partPdu.setName(part.Name.getBytes());
            partPdu.setContentType(part.MimeType.getBytes());
            partPdu.setData(part.Data);
            pduBody.addPart(partPdu);
        }
    }

    sendRequest.setBody(pduBody);

    final PduComposer composer = new PduComposer(this.context, sendRequest);
    final byte[] bytesToSend = composer.make();

    HttpUtils.httpConnection(context, 4444L, MMSCenterUrl,
            bytesToSendFromPDU, HttpUtils.HTTP_POST_METHOD, !TextUtils
                    .isEmpty(MMSProxy), MMSProxy, port);

MMSCenterUrl: url из MMS-APN, MMSProxy: прокси из MMS-APN, порт: порт из MMS-APN

Обратите внимание, что некоторые классы взяты из внутренних пакетов. Требуется загрузка с android git.

Запрос должен быть выполнен с url-адресом из пользовательского apn-space ... code ..:

public class APNHelper {

public class APN {
    public String MMSCenterUrl = "";
    public String MMSPort = "";
    public String MMSProxy = ""; 
}

public APNHelper(final Context context) {
    this.context = context;
}   

public List<APN> getMMSApns() {     
    final Cursor apnCursor = this.context.getContentResolver().query(Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current"), null, null, null, null);
if ( apnCursor == null ) {
        return Collections.EMPTY_LIST;
    } else {
        final List<APN> results = new ArrayList<APN>(); 
            if ( apnCursor.moveToFirst() ) {
        do {
            final String type = apnCursor.getString(apnCursor.getColumnIndex(Telephony.Carriers.TYPE));
            if ( !TextUtils.isEmpty(type) && ( type.equalsIgnoreCase(Phone.APN_TYPE_ALL) || type.equalsIgnoreCase(Phone.APN_TYPE_MMS) ) ) {
                final String mmsc = apnCursor.getString(apnCursor.getColumnIndex(Telephony.Carriers.MMSC));
                final String mmsProxy = apnCursor.getString(apnCursor.getColumnIndex(Telephony.Carriers.MMSPROXY));
                final String port = apnCursor.getString(apnCursor.getColumnIndex(Telephony.Carriers.MMSPORT));                  
                final APN apn = new APN();
                apn.MMSCenterUrl = mmsc;
                apn.MMSProxy = mmsProxy;
                apn.MMSPort = port;
                results.add(apn);
            }
        } while ( apnCursor.moveToNext() ); 
             }              
        apnCursor.close();
        return results;
    }
}

private Context context;

}
person Damian Kołakowski    schedule 04.06.2010
comment
Может ли кто-нибудь объяснить, как правильно получить весь указанный код в Eclipse (например, класс SendReq и т. Д.)? У меня есть git и репо, источник Android и сам проект MMS, настроенный в Eclipse (я нашел его в SDK по адресу / packages / apps / MMS). Однако он ссылается на множество других частей системы Android, и я не знаю, как получить все эти ссылки в моем проекте в Eclipse, не копируя файлы вручную в каталог src моего проекта и соответствующие подкаталоги, что является огромным трудом. - person Tyler Collier; 16.03.2011
comment
Многие из этих классов, похоже, происходят из непубличных API Google (см. Приложение Mms). Не думаю, что их можно использовать «из коробки». - person ddewaele; 27.03.2011
comment
полностью работает! большая честь! (Также по какой-то причине мне пришлось изменить AndroidHttpClient на DefaultHttpClient в HttpUtils) - person njzk2; 22.11.2011
comment
Пожалуйста, проясните реализацию, я хочу программно отправлять MMS в моем проекте, но не могу использовать ваш показанный код. - person Arpit Garg; 18.01.2012
comment
это единственный способ отправить MMS? это полный код? Спасибо - person Maha; 30.03.2012
comment
Я получаю эту ошибку: java.lang.SecurityException: нет разрешения на запись настроек APN: ни у пользователя 10099, ни у текущего процесса нет android.permission.WRITE_APN_SETTINGS. Ошибка возникает после запроса Carriers ContentProvider в методе getMMSApns () класса APNHelper. конечный курсор apnCursor = this.context.getContentResolver (). query (Uri.withAppendedPath (Carriers.CONTENT_URI, current), null, null, null, null); Я тестирую Nexus 4 на Android v4.2.2. Кто-нибудь еще получает эту ошибку? - person toobsco42; 09.03.2013
comment
final int result = connMgr.startUsingNetworkFeature (ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_MMS); Это не активирует APN в первый раз .. он возвращает значение 2. как только я отправляю MMS из мессагера по умолчанию, кажется, что приведенный выше код работает ... пожалуйста, не могли бы вы предложить мне правильный подход .. - person kamal_tech_view; 29.03.2013
comment
Одна из проблем, с которыми я столкнулся, касалась безопасности со стороны перевозчика. Я не могу найти DNS для MMSC, если я не подключен к мобильной сети - он не работает с Wi-Fi - я нашел код с функцией forceMobileConnectionForAddress, которая отлично работала. - person JavaCoderEx; 10.06.2013
comment
этот сайт объясняет это намного лучше: forum.xda-developers.com/showthread.php ? t = 2222703 - person Sam Adamsh; 24.06.2013
comment
@SamAdams Я реализовал этот код, но у меня истекло время соединения для HTTP-запроса, я также пробовал использовать разные сети, но без изменений. Можете ли вы опубликовать рабочий код. - person Jaldip Katre; 10.12.2013
comment
Уважаемые Дамиан и @ njzk2 Не могли бы вы объяснить, как я могу использовать этот код? Я здесь новичок, пожалуйста, помогите мне. - person Nauman Zubair; 03.01.2015
comment
Мы не можем использовать эти методы SmsManager.sendMultimediaMessage (Context context, Uri contentUri, String locationUrl, Bundle configOverrides, PendingIntent sentIntent) описать на сайте Android для отправки ммс. если мы можем тогда как-нибудь определить отправку с SIM-карты 1 или 2? [developer.android.com/reference/android/telephony / - person Sohail Zahid; 26.05.2016


Если вам нужно отправить MMS с любым изображением с помощью намерения, используйте этот код.

Intent sendIntent = new Intent(Intent.ACTION_SEND); 
sendIntent.setClassName("com.android.mms", "com.android.mms.ui.ComposeMessageActivity");
sendIntent.putExtra("sms_body", "some text"); 
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/image_4.png"));
sendIntent.setType("image/png");
startActivity(sendIntent);;

OR

Если вам нужно отправить MMS с аудио или видео файлом с помощью Intent, используйте это.

Intent sendIntent = new Intent(Intent.ACTION_SEND); 
sendIntent.setClassName("com.android.mms", "com.android.mms.ui.ComposeMessageActivity");
sendIntent.putExtra("address", "1213123123");
sendIntent.putExtra("sms_body", "if you are sending text");   
final File file1 = new File(mFileName);
if(file1.exists()){
  System.out.println("file is exist");
}
Uri uri = Uri.fromFile(file1);
sendIntent.putExtra(Intent.EXTRA_STREAM, uri);
sendIntent.setType("video/*");
startActivity(sendIntent);

дайте мне знать, если это поможет вам.

person swiftBoy    schedule 15.01.2013
comment
Это вызывает собственное приложение обмена сообщениями. Но есть ли способ отправить MMS в вашем собственном приложении и зарегистрировать прослушивание входящих сообщений MMS с BroadcastReceiver аналогично тому, как это реализовано для сообщений SMS. - person toobsco42; 22.01.2013
comment
Я считаю, что это правильно работает с изображениями, но не с аудио / видео (ваш второй пример кода). - person dadude999; 22.05.2015

Ответ с помощником APN не будет работать после android 4.0. Чтобы получить настройки mms apn на Android 4.0 и более поздних версиях, просмотрите этот ответ: Просмотреть mms apn

person Sam Adamsh    schedule 19.07.2013