我在使用共享意图共享文本和文件时遇到问题。
当我选择gmail进行共享时,它同时接受文本和文件,但众所周知,我们不能通过whatsapp共享文件。所以我想要的是,如果文件附件失败,那么只有文本应该共享,但它不会发生。
我使用以下代码:

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

请推荐一些。

最佳答案

就像其他人提到的那样,你不能让whatsapp做你想做的事或做你想做的事。如果whatsapp不能同时处理文本和uri并选择忽略它,我们就无能为力了。
但是,根据您希望此功能正常工作的程度,您可以:
方法1:
使用以下命令获取与您的意图匹配的包列表:

PackageManager packageManager = context.getPackageManager();
List<ResolveInfo>     resolvedInfoList = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);

在这里,
resolvedInfoList[i].activityInfo.packageName

给你包裹的名字。
显示包含这些应用程序列表的用户界面。当用户选择应用程序时,您将知道用户选择了哪个应用程序。
现在,如果choosen应用程序属于一个应用程序列表,而您知道这些应用程序不能用文本处理文件uri(在您的例子中是whatsapp),那么只需用额外的文本创建一个意图。
调用StartActivity,并明确指定所选包的目的。
根据您的需要,对于不能同时处理这两种情况的应用程序,您可以省去额外的文本或额外的流。
注意:这意味着您需要维护自己的ui。如果使用隐式意图调用startActivity,则用户体验将不同于所看到的选择器。大多数制造商以及平台都会自定义选择器活动。因此,如果你需要遵循本土经验,就不应该采用这种方法。
方法2:
使用ApkTool将whatsapp代码反向工程为smali代码,以了解当其中同时包含extra_text和intent.extra_流时,它如何处理您的意图。您只需打开activity smali文件并遵循oncreate()代码。如果你能在你身边做些什么,这会给你一些想法。
免责声明:逆向工程应用程序和代码在法律上是一个灰色区域。据我所知,不要为了商业利益而直接使用代码。就个人理解而言,这基本上是可以的。

10-07 19:44
查看更多