如何在Android中通过彩信发送图像?

问题描述:

我正在研究多媒体应用程序。我通过相机拍摄了一张图像,并希望将该图像以文本发送给其他号码。但我不知道如何通过MMS发送图像。如何在Android中通过彩信发送图像?

+0

我正在做类似的事情! http://*.com/questions/14452808/sending-and-receiving-mms-in-android – toobsco42 2013-01-22 06:33:48

这似乎在低位回答:Sending MMS with Android

代码存在的主要线路:

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

要记住的是图像应该在外部存储或作为内容提供。通常内部应用程序数据不能被其他应用程序访问。所以你必须暂时写图像到外部存储器,然后将路径传递到'Uri.parse' – Shubhank 2013-05-08 13:18:28

+0

这不再起作用了,因为在手机中选择消息活动会使消息仅包含图片,而不包含文本 – peresisUser 2018-01-31 13:31:46

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:从MMS-的APN,端口代理:从MMS-的APN,MMSProxy URL端口从MMS-APN的

注有些类来自内部包。从android git下载是必需的。

的请求应该从用户的APN空间网址...代码来完成..:

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

有人可以解释如何正确地将所有引用的代码导入到Eclipse中(例如SendReq类等)?我有git和repo,并且拥有android源代码,并且在Eclipse中设置了MMS项目(我在SDK中找到了它/ packages/apps/MMS)。但是,它引用了Android系统的很多其他部分,我不知道如何在Eclipse中将所有这些引用放到我的项目中,而无需手动将文件复制到我的项目的src目录和适当的子目录中,这是非常困难的。 – 2011-03-16 02:27:27

+1

很多这些类似乎来自非公开的Google API(cfr:Mms应用程序)。我不认为它们可以用于开箱即用。 – ddewaele 2011-03-27 10:19:17

+0

这段代码是否调用内置的MMS应用程序? – Vijaya 2011-06-29 11:06:10

如果你有发送彩信使用意图,然后使用该代码的任何图片

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

如果必须使用意图文件,然后使用该发送彩信与音频或视频。

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

让我知道这是否对您有帮助。

+3

这将调用本地消息传送应用程序。但是有没有一种方法可以在你自己的应用程序中发送彩信,并以类似于如何实现** SMS **消息的方式注册收听带有“BroadcastReceiver”的传入** MMS **消息。 – toobsco42 2013-01-22 05:28:46

+0

我发现这可以正常使用图像,但不是音频/视频(您的第二个代码示例)。 – dadude999 2015-05-22 04:17:26

在Android 4.0之后,APN助手的答案将不起作用。要获得Android 4.0及以上版本的mms apn设置,请参阅此答案:View mms apn