Android:在电子邮件中将多个文件作为附件发送

时间:2013-01-15 13:23:32

标签: android email

  

可能重复:
  Android multiple email attachments using Intent

我已经知道可能有类似的问题,因为我从其中一个答案中得到了我当前的代码。但我面临一些问题,最初我认为它是gmail应用程序,但后来我尝试与其他电子邮件客户端和同样的问题。 的代码: -

ArrayList<Uri> uris = null;
        try {
            uris = logger.getSiteFilePaths(siteIndex);
        } catch (BaseLoggerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Intent emailIntent = new   Intent(android.content.Intent.ACTION_SEND_MULTIPLE);
        emailIntent.setType("application/octet-stream");
        emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
        emailIntent.putExtra(Intent.EXTRA_EMAIL,"");
        emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Bl\u00fc-Test Log");
        emailIntent.putExtra(Intent.EXTRA_TEXT, "Please find the attachments.");
        emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
        startActivity(Intent.createChooser(emailIntent, "Email:"));

文件路径准确

**e.g. --** file:///storage/sdcard0/BAPISandy_test1.csv

问题: - 在Gmail应用程序文件中似乎附加了,但是当您发送电子邮件时,它会在通知栏中显示“无法显示attachemnt”。如果尝试使用其他电子邮件客户端,则不会将文件显示为附件。 系统信息: - 三星Galaxy Tab 2(7英寸) Android 4.1.1

2 个答案:

答案 0 :(得分:1)

抱歉全部,  很难找到文件路径中遗漏"/"等小错误,这实际上会导致问题。

答案 1 :(得分:1)

我今天在我的Note 2和一个拥有SG3的客户上也犯了这个错误。我做了一些挖掘并发现了以下内容。

如果我请求外部存储设备名称 - Environment.getExternalStorageDirectory()。getName()(我使用它,因为我的目标是版本7) - 我得到'sdcard0',如果我那么添加我的文件名并将其传递给电子邮件或Gmail,然后没有人会添加附件。如果我手动编辑'sdcard0'末尾的零并传递'sdcard'+我的文件名,那么一切正常。 这些似乎都不是JB之前的问题,或者如果我在模拟器中的JB下运行此代码,它总是返回'sdcard'。

我不确定是否有我应该使用的不同代码,或者这是os报告路径和电子邮件系统使用它的方式不一致。 (我曾经以为sdcard0应该指向与sdcard相同的位置 - 但有些东西不起作用)

我可能只是修补我的代码以剥离零(我知道这是丑陋和危险)。除非其他人有任何明智的想法:)

编辑: 我在下面添加了我的代码,以防其他人发现它有用。

                    // try and grab the log file

            String logFile = File.separator + getResources().getString(R.string.app_name) + File.separator + "logs" + File.separator + Constants.SMS_FILE;
            String extStorage = Environment.getExternalStorageDirectory().getName();

            // The following is a kludge for the Samsung (and maybe more) JB devices that don't allow you to add a file with the SDCARD0 external storage
            // link

            File nf = new File(extStorage, logFile);
            if (!nf.exists()) {
                // OK we can't find the file - say so and see if we are hiding behind SDCARD0

                Log.w(getLocalClassName() + ".shouldOverrideUrlLoading", "File: " + extStorage + logFile + " Doesn't exist - trying again");
                if (extStorage.matches("(?i)SDCARD(?-i)[0-9]")) {
                    // OK we've got a SDCARDx scenario - let's see if the file exists without the x
                    String extStorageFix = extStorage.replaceFirst("(?i)SDCARD(?-i)[0-9]", extStorage.substring(0, 6)); // try it without the 0,1,2 etc
                    nf = new File(extStorageFix, logFile);
                    if (!nf.exists()) {
                        // OK we're in the pooh now - can't find the log file so just say so and try to exit without attaching it.
                        Log.w(getLocalClassName() + ".shouldOverrideUrlLoading", "File: " + extStorageFix + logFile + " Doesn't exist either - giving up");
                        Toast.makeText(
                                getApplicationContext(),
                                "Unable to attach Log file from\n" + extStorage + logFile + "\n" + extStorageFix + logFile
                                        + "\nPlease add it manually if possible", Toast.LENGTH_LONG).show();
                    } else {
                        // Hurrah we found it - remember we did so and carry on
                        extStorage = extStorageFix;
                        Log.w(getLocalClassName() + ".shouldOverrideUrlLoading", "Found logfile at: " + extStorage + logFile);
                    }
                }

            }

            if (Debug.ON) {
                Log.d(getLocalClassName() + ".shouldOverrideUrlLoading", "Filepath = " + "file://" + File.separator + extStorage + logFile);
            }
            i.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + File.separator + extStorage + logFile));**strong text**