2010-06-04 7 views
43

Ich arbeite an einer Multimedia-Anwendung. Ich nehme ein Bild über die Kamera auf und möchte dieses Bild mit einem Text an eine andere Nummer senden. Aber ich bekomme nicht, wie man das Bild über die MMS sendet.Wie kann ich ein Bild per MMS in Android senden?

+0

Ich mache etwas ähnliches hier !!! http://stackoverflow.com/questions/14452808/sending-and-receiving-mms-in-android – toobsco42

Antwort

9

Dies scheint in der Post zu beantworten: Sending MMS with Android

Schlüsselcodezeilen Sein:

Intent sendIntent = new Intent(Intent.ACTION_SEND); 
sendIntent.putExtra("sms_body", "some text"); 
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(url)); 
sendIntent.setType("image/png"); 
+2

etwas zu beachten ist das Bild sollte auf externen Speicher oder als Inhalt zur Verfügung stellen. Normalerweise können keine internen Apps auf andere Apps zugreifen. so müssen Sie vorübergehend Bild auf externen Speicher schreiben und dann den Pfad zu 'Uri.parse' übergeben – Shubhank

+0

dies funktioniert nicht mehr seit der Wahl der Nachricht Aktivität im Telefon macht die Nachricht nur das Bild, ohne den Text – peresisUser

39

MMS ist nur eine htttp-post-Anfrage. Sie sollten die Anforderung mit zusätzlichen Netzwerkfunktion ausführen:

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

Wenn Sie mit Phone.APN_REQUEST_STARTED Wert Ergebnis erhalten, müssen Sie für die ordnungsgemäßen Zustand warten. Registrieren BroadCastReciver und warten, bis Phone.APN_ALREADY_ACTIVE erscheint:

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

Wenn Verbindung Hintergrund bereit ist, die Inhalte erstellen und ausführen Anfrage. Wenn Sie wollen, dass Android-internen Code, bitte verwenden:

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 von MMS-APNs, MMSProxy: Proxy von MMS-APNs, Port: port von MMS-APNs

Hinweis dass einige Klassen aus internen Paketen stammen. Download von Android-Git ist erforderlich.

Der Antrag sollte mit url von Benutzer-apn-Raum ... Code getan werden ..:

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; 

} 
+5

Kann jemand enthalten erklären, wie man den referenzierten Code richtig in Eclipse bekommt (zB die SendReq-Klasse, etc.)? Ich habe Git und Repo und habe die Android-Quelle und habe das MMS-Projekt selbst in Eclipse eingerichtet (ich fand es im SDK unter/packages/apps/MMS).Es verweist jedoch auf viele andere Teile des Android-Systems und ich weiß nicht, wie ich all diese Referenzen in mein Projekt in Eclipse bringen kann, ohne Dateien in das src-Verzeichnis meines Projekts und die entsprechenden Unterverzeichnisse von Hand zu kopieren, was überwältigend ist. –

+1

Viele dieser Klassen scheinen von den nicht-öffentlichen Google-APIs zu stammen (cfr: Mms-Anwendung). Ich glaube nicht, dass sie sofort einsatzbereit sind. – ddewaele

+0

ruft dieser Code die eingebaute MMS App auf? – Vijaya

9

Wenn Sie haben MMS senden mit jedem Bild Intent verwendet, dann diesen Code verwenden.

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);; 

ODER

Wenn Sie zu MMS mit Audio- oder Video-Datei mit Intent senden diese dann verwenden.

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); 

lassen Sie mich wissen, ob dies Ihnen hilft.

+3

Dadurch wird die native Messaging-Anwendung aufgerufen. Aber gibt es eine Möglichkeit, MMS innerhalb Ihrer eigenen Anwendung zu senden und sich für eingehende ** MMS ** -Nachrichten mit einem "BroadcastReceiver" zu registrieren, ähnlich wie dies für ** SMS ** -Nachrichten implementiert ist. – toobsco42

+0

Ich finde, dass dies richtig mit Bildern funktioniert, aber nicht Audio/Video (Ihr zweites Codebeispiel). – dadude999

1

Die Antwort mit dem APN-Helfer wird nach Android 4.0 nicht funktionieren. Um mms apn Einstellungen auf Android 4.0 und höher zu sehen, sehen Sie diese Antwort: View mms apn