如果文件附件失败,通过ACTION_SEND共享文本

问题描述:

我在使用共享意向共享文本和文件时遇到问题。
当我选择Gmail共享时,它同时使用文本和文件,但正如我们所知,我们无法通过Whatsapp共享文件。所以我想要的是如果文件附件失败,那么只有文本应该分享,但它没有发生。
我使用下面的代码:如果文件附件失败,通过ACTION_SEND共享文本

 Intent intent = new Intent(); 
     intent.setAction(android.content.Intent.ACTION_SEND_MULTIPLE); 
     intent.setType("*/*"); 
     intent.putExtra(
       android.content.Intent.EXTRA_TEXT, 
       "Test Messge"); 
     intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); 
     startActivity(intent); 

请建议一些。

+0

请了解有关从其他应用程序接收简单数据,您将得到您的答案http://developer.android.com/training/sharing/receive.html – 2014-10-07 10:17:35

就像其他人所说的,你不能让Whatsapp做你想做的或者行为的。如果Whatsapp不处理文本和Uri,并且选择忽略它,那么我们就无法做到这一点。

但是,这取决于你想有多严重这优雅地工作,您可以:

方法1:

  1. 通过使用你的意图相匹配的包获取列表:
PackageManager packageManager = context.getPackageManager(); 
List<ResolveInfo>  resolvedInfoList = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 

这里,

resolvedInfoList[i].activityInfo.packageName 

给你包的名称。

  1. 用这些应用程序的列表显示您自己的UI。当用户选择应用程序时,您将知道用户选择了哪个应用程序。

  2. 现在,如果选择的应用程序属于应用程序列表,您知道不能使用文本处理文件Uri(在您的情况下是WhatsApp),请仅使用EXTRA_TEXT创建一个意图。

  3. 调用startActivity并显式选择包。

根据您的需要,您可以省略EXTRA_TEXT或EXTRA_STREAM以处理不同时处理的应用程序。

警告:这意味着您需要维护自己的用户界面。用户体验会与您看到的选择器不同,如果startActivity是以隐式意图调用的。大多数制造商以及平台都会自定义选择器的活动。因此,如果您需要符合本地体验,则不应采用此方法。

方法2:

反向工程WhatsApp的代码插入到使用ApkTool smali代码,以了解更多它是如何处理你的意图时,都EXTRA_TEXT和Intent.EXTRA_STREAM在里面。您可以打开活动smali文件并按照onCreate()代码。如果你可以在你身边做任何事情,这将有希望给出一些想法。

免责声明:逆向工程应用程序和代码是合法的灰色地带。据我所知,不要直接使用代码来获得商业利益。为了个人理解,大多数都很好。

+0

谢谢@Rohan ...问题解决了:) – Sonali8890 2014-10-10 13:39:53

+0

@ Sonali8890太棒了。知道你究竟是如何解决这个问题将会很有趣。 – Rohan 2014-10-10 18:47:15

+0

很好的答案!但我对第一种方法有疑问。如果在EXTRA_TEXT和EXTRA_STREAM共享应用程序的列表中已经显示whatsapp,那么使用你的解决方案,它不应该显示同一列表中的whatsapp? – berserk 2014-10-11 06:10:22

这是不可能的。你无法知道用户将选择哪个应用程序。

我建议让用户选择共享为“电子邮件”或“文本”,并根据该选项创建您的意图。

+0

感谢您的快速回复,但我的要求不是这样。我正在研究一个共享应用程序,它与一些额外的文本共享文件,我不能给用户提供他想发送的选项,因为他认为他只发送文件。 – Sonali8890 2014-10-10 06:02:24

我想你想要的是你发送的数据将基于应用程序。就像whatsapp不接受文件并仅接收文本。但正如@丹利比哈里所说,这是不可能的。

只要逻辑思考。应用程序接收到的数据基于他们为接收ACTION_SEND而创建的活动。你不能选择他们必须接受的。并且可以有任何数量的应用程序,所以你不能分辨哪个应用程序接收哪些内容。

+0

我同意你的看法,但是从开发者网站上我们可以为意图设置一些标准的附加内容,如果接收应用程序不是为了使用它们而设计的,它就会忽略它们。所以根据上面的行如果我把一个文件的意图然后whatsapp会忽略额外的但它应该除了Intent.EXTRA_TEXT文本。 – Sonali8890 2014-10-10 05:57:40

+0

@ Sonali8890正是!完全正确!所以你想要什么? – berserk 2014-10-10 06:11:41

+0

我想如果像whatsapp这样的应用程序不是除了文件,那么它应该忽略文件和文本只。 – Sonali8890 2014-10-10 06:15:41