当应用程序使用Intent.ACTION_SEND时处理手机之间的差异

时间:2011-01-08 18:49:48

标签: java android sms mms

我有一个允许用户发送图片的应用程序。这张照片可以通过多种不同的方式发送,如g-mail,facebook,flickr,以及我感兴趣的那些,短信。运行以下代码时,会弹出一个对话框,其中包含许多可用选项。

       Uri uri = Uri.fromFile(new File(externalDirectory + FILE_DIRECTORY + fileName));      
        Intent intent = new Intent(Intent.ACTION_SEND); 
        intent.putExtra(Intent.EXTRA_STREAM, uri);
        intent.setType("image/png"); 
        startActivity(intent);

在我的Droid X上,会显示短信选项,此代码会将图片完美地添加到彩信中。

在模拟器上,会自动选择短信(因为没有其他选项),而且它再次运行良好。

在我的Droid Incredible上,没有短信选项。但是,我可以手动调出内置的文本消息实用程序,添加图片然后发送它。我还从市场上下载了一个短信/彩信应用程序,然后从列表中可以选择使用这个第三方程序发送图片。

那么,为什么文本消息传递不是Droid Incredible的可用选项?我需要做些什么来使它成为一个选项,如何使用我无法访问的手机类型来评估这个问题(或者解决问题)?

2 个答案:

答案 0 :(得分:2)

  

那么,为什么文本消息传递不是Droid Incredible的可用选项?

因为他们选择不提供它。

  

我需要做些什么来使它成为一个选项

在摘要中,你不能。

引用Android Compatibility Definition Document

  

Android上游项目定义了许多核心应用程序,例如电话拨号器,日历,通讯录,音乐播放器等。设备   实施者可以用替代版本替换这些应用程序。

     

但是,任何此类替代版本必须遵守上游项目提供的相同Intent模式。例如,如果设备包含   替代音乐播放器,它仍然必须尊重第三方应用程序发出的Intent模式来挑选歌曲。

问题是,Messenger应用程序不被Google视为“核心应用程序”。因此,欢迎设备制造商使用自己的Intent过滤器添加自己的SMS客户端。对于HTC Incredible,显然他们没有通过image/png ACTION_SEND Intent支持MMS。

现在,恕我直言,Messenger可能应该是一个核心应用程序。但是,你的观点和我的观点并没有像现在这样改变现实。

  

如何使用我无法访问的手机类型评估此问题(或未知问题)

您重新定义了应用程序,使其不是“问题”。您无法保证可以通过这种方式发送彩信,就像您无法保证用户安装了Facebook应用一样。

我对MMS知之甚少,并且不确定是否有ACTION_SEND以外的方式发送彩信。您可以考虑将源代码戳到Messenger应用程序,看看它是如何做到的。然后,将功能直接烘焙到您的应用中。这需要一些额外的权限(SEND_SMS,可能还需要READ_CONTACTS),并且写入会很烦人,但它更有可能跨设备工作。

答案 1 :(得分:2)

由于其他一些关于SO的问题的帮助,我确实设法解决了这个问题。

基本上关键是确定HTC使用的意图,HTC似乎是唯一一家(当前)修改了android.intent.action.SEND Intent的公司。以下是将选项添加到列表中的代码。

Uri uri = Uri.fromFile(new File(mFile));  
Intent intent = new Intent(Intent.ACTION_SEND); 
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setType("image/png"); 

Intent htcIntent = new Intent("android.intent.action.SEND_MSG");
htcIntent.setType("image/png");
htcIntent.putExtra(Intent.EXTRA_STREAM, uri);

Intent chooser = Intent.createChooser(intent, "Send Method");
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { htcIntent });
startActivity(chooser);