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

如何在同一个Android应用程序中以编程方式共享多个不同MIME类型的文件?,android,android-intent,bluetooth,mime-types,Android,Android Intent,Bluetooth,Mime Types,我正在开发一个Android应用程序,该应用程序已经使用以下方法通过蓝牙成功共享生成的PDF文件: public static void sharePdfFile(Context ctx, String pathAndFile) { try { Intent share = new Intent(Intent.ACTION_SEND); share.setPackage("com.android.bluetooth"); share.se

我正在开发一个Android应用程序,该应用程序已经使用以下方法通过蓝牙成功共享生成的PDF文件:

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格式),以便两个文件一起发送。我立即发现,它通过蓝牙发送多个文件,但只使用相同MIME类型的文件(在该示例中为“video/*”)

我已经找到了很多通配符MIME子类型的示例(“video/*”、“text/*”,等等),但在这一点上,我找不到任何具有多个特定MIME类型集的意图示例(例如:“application/pdf”和“text/comma分隔值”)。因此,我创建了一个测试方法,使用“*/*”作为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);
    }
}

就在我完成了最后的草稿之后,我终于找到了一个解决问题的有效方法。我在写作时不断研究这个问题,发现这表明我缺少
intent.putExtra(intent.EXTRA\u ALLOW\u MULTIPLE,true)在我的测试方法中。我补充说,但我的测试方法仍然不起作用

然后我发现,这表明我可能应该在我的意图中添加一个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);
    }
}
公共静态无效ShareTwoFileTest(上下文ctx、字符串路径和文件、字符串路径和文件2){
ArrayList URI=新的ArrayList();
add(Uri.parse(pathAndFile));
add(Uri.parse(pathAndFile2));
试一试{
意向共享=新意向(意向.行动\发送\多次);
share.setPackage(“com.android.bluetooth”);
share.setType(“*/*”);
share.putExtra(Intent.EXTRA\u ALLOW\u倍数,true);
share.putExtra(Intent.EXTRA\u流,URI);
share.addFlags(Intent.FLAG\u ACTIVITY\u NEW\u TASK);
ctx.startActivity(共享);
}捕获(例外e){
例外dao.Log(CATEGORY.SHARE\u INTENT,e,ctx,e.getMessage(),true);
}
}

如果您认为这个答案可以改进,或者有其他解决问题的方法,请随意回答或评论。我继续把问题和我的答案贴出来,希望这能在将来帮助其他人。

在我完成最后的草稿后,我就找到了一个解决问题的有效方法。我在写作时不断研究这个问题,发现这表明我缺少
intent.putExtra(intent.EXTRA\u ALLOW\u MULTIPLE,true)在我的测试方法中。我补充说,但我的测试方法仍然不起作用

然后我发现,这表明我可能应该在我的意图中添加一个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);
    }
}
公共静态无效ShareTwoFileTest(上下文ctx、字符串路径和文件、字符串路径和文件2){
ArrayList URI=新的ArrayList();
add(Uri.parse(pathAndFile));
add(Uri.parse(pathAndFile2));
试一试{
意向共享=新意向(意向.行动\发送\多次);
share.setPackage(“com.android.bluetooth”);
share.setType(“*/*”);
share.putExtra(Intent.EXTRA\u ALLOW\u倍数,true);
share.putExtra(Intent.EXTRA\u流,URI);
share.addFlags(Intent.FLAG\u ACTIVITY\u NEW\u TASK);
ctx.startActivity(共享);
}捕获(例外e){
例外dao.Log(CATEGORY.SHARE\u INTENT,e,ctx,e.getMessage(),true);
}
}
如果您认为这个答案可以改进,或者有其他解决问题的方法,请随意回答或评论。我继续把问题和我的答案贴出来,希望这能在将来帮助其他人