2010-06-04 13 views
43

Sto lavorando a un'applicazione multimediale. Sto catturando un'immagine attraverso la fotocamera e voglio inviare quell'immagine con un testo ad un altro numero. Ma non ricevo come inviare l'immagine tramite l'MMS.Come inviare un'immagine tramite MMS in Android?

+0

Sto facendo qualcosa di simile QUI !!! http://stackoverflow.com/questions/14452808/sending-and-receiving-mms-in-android – toobsco42

risposta

9

Questo sembra essere risolta nel post: Sending MMS with Android

linee fondamentali dell'essere codice:

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

qualcosa da tenere a mente è l'immagine dovrebbe essere su storage esterno o come fornire contenuto. i dati delle app di solito interni non sono accessibili da altre app. quindi devi temporaneamente scrivere l'immagine sull'archivio esterno e quindi passare il percorso a 'Uri.parse' – Shubhank

+0

questo non funziona più poiché scegliere l'attività del messaggio nel telefono fa sì che il messaggio contenga solo l'immagine, senza il testo – peresisUser

39

MMS è solo una richiesta htttp-post. Si dovrebbe eseguire la richiesta utilizzando funzione rete in più:

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

Se si ottiene risultato con valore Phone.APN_REQUEST_STARTED, bisogna aspettare per stato corretto. Registrati BroadCastReciver e attendere che venga visualizzato Phone.APN_ALREADY_ACTIVE:

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

Se sfondo connessione è pronta, a costruire i contenuti ed eseguire richiesta. Se si vuole fare che utilizzando il codice interno di Android, si prega di utilizzare questo:

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 da MMS-APN, MMSProxy: delega da MMS-APN, Porta: porta da MMS-APN

Nota che alcune classi provengono da pacchetti interni. È necessario scaricare da Android Git.

La richiesta dovrebbe essere fatto con l'URL da APN-spazio dell'utente ... codice ..:

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

Qualcuno può spiegare come ottenere correttamente tutti i codici di riferimento in Eclipse (ad es. la classe SendReq, ecc.)? Ho git e repo e ho la sorgente Android e ho il progetto MMS stesso impostato in Eclipse (l'ho trovato nell'SDK su/packages/apps/MMS).Tuttavia, fa riferimento a molte altre parti del sistema Android e non so come ottenere tutti quei riferimenti nel mio progetto in Eclipse senza copiare i file nella directory src del mio progetto e nelle sottodirectory appropriate a mano, il che è schiacciante. –

+1

Molte di queste classi sembrano provenire dalle API google non pubbliche (cfr: applicazione Mms). Non penso che possano essere usati fuori dalla scatola. – ddewaele

+0

questo codice richiama l'app MMS incorporata? – Vijaya

9

Se dovete inviare MMS con qualsiasi immagine utilizzando Intent quindi utilizzare questo codice.

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

O

Se dovete inviare MMS con Audio o Video file usando Intent quindi utilizzare questo.

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

fammi sapere se questo ti aiuta.

+3

Invoca l'applicazione di messaggistica nativa. Ma c'è un modo per inviare MMS all'interno della propria applicazione e registrarsi ascoltando i messaggi in arrivo ** MMS ** con un 'BroadcastReceiver' in modo simile a come questo è implementato per ** messaggi SMS **. – toobsco42

+0

Trovo che funzioni correttamente con le immagini, ma non con audio/video (il tuo secondo esempio di codice). – dadude999

1

La risposta con l'helper APN non funzionerà dopo Android 4.0. Per ottenere le impostazioni apn di mms su Android 4.0 e sopra, visualizza questa risposta: View mms apn