如何在同一Android意图中以编程方式共享不同MIME类型的多个文件?

时间:2017-09-21 20:15:44

标签: android android-intent bluetooth mime-types

我正在使用以下方法通过蓝牙成功共享生成的PDF文件的Android应用程序:

public static void sharePdfFile(Context ctx, String pathAndFile) {
    try {
        Intent share = new Intent(Intent.ACTION_SEND);

        share.setPackage("com.android.bluetooth");
        share.setType("application/pdf");
        share.putExtra(Intent.EXTRA_STREAM, Uri.parse(pathAndFile));
        share.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        ctx.startActivity(share);
    } catch (Exception e) {
        ExceptionDAO.Log(CATEGORY.SHARE_INTENT, e, ctx, e.getMessage(), true);
    }
}

我被要求在此共享意图中包含第二个文件(CSV格式),以便将这两个文件一起发送。我立即找到this question,它通过蓝牙发送多个文件,但只使用相同MIME类型的文件(在该示例中为“video / *”。)

我找到了很多通配符MIME 子类型(“video / *”,“text / *”等)的例子,但此时我无法找到任何Intent示例具有多个特定MIME类型集(例如:“application / pdf”和“text /逗号分隔值”)。所以,我创建了一个使用“* / *”作为MIME类型的测试方法,希望能够做到这一点。不幸的是,我的测试方法甚至没有足够激活蓝牙共享弹出窗口来选择附近的设备。

我不确定我做错了什么或遗漏了。在调试时我似乎无法捕获任何错误,所以我假设我仍然遗漏了一些东西。我知道PDF和CSV文件及其各自的URI是正常的,因为两个文件都通过原始方法传输正常(我更改了现有方法的MIME类型和URI以测试新的CSV文件。)

这是我的测试方法:

public static void shareTwoFilesTest(Context ctx, String pathAndFile, String pathAndFile2) {
    try {
        Intent share = new Intent(Intent.ACTION_SEND_MULTIPLE);

        share.setPackage("com.android.bluetooth");
        share.setType("*/*");
        share.putExtra(Intent.EXTRA_STREAM, Uri.parse(pathAndFile));
        share.putExtra(Intent.EXTRA_STREAM, Uri.parse(pathAndFile2));
        share.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        ctx.startActivity(share);
    } catch (Exception e) {
        ExceptionDAO.Log(CATEGORY.SHARE_INTENT, e, ctx, e.getMessage(), true);
    }
}

1 个答案:

答案 0 :(得分:1)

在我完成最终草稿后,我最终找到了解决问题/问题的有效方法。我在写作时一直在研究这个问题,并发现this answer表示我在测试方法中遗漏了intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);。我补充说,但我的测试方法仍无效。

然后我发现this answer表示我可能应该在我的意图中添加URI的数组列表,而不是尝试添加多个单个URI。在添加了最后一个缺失的部分之后,我最终得到了一个可以正式实现的工作测试功能:

public static void shareTwoFilesTest(Context ctx, String pathAndFile, String pathAndFile2) {

    ArrayList<Uri> Uris = new ArrayList<>();
    Uris.add(Uri.parse(pathAndFile));
    Uris.add(Uri.parse(pathAndFile2));

    try {
        Intent share = new Intent(Intent.ACTION_SEND_MULTIPLE);

        share.setPackage("com.android.bluetooth");
        share.setType("*/*");
        share.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
        share.putExtra(Intent.EXTRA_STREAM, Uris);
        share.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        ctx.startActivity(share);
    } catch (Exception e) {
        ExceptionDAO.Log(CATEGORY.SHARE_INTENT, e, ctx, e.getMessage(), true);
    }
}

如果您认为可以改进此答案或采用其他方式解决问题,请随时回答或发表评论。我继续发布问题和答案,希望将来可以帮助其他人。