【问题标题】:Android Send Mail with pdfAndroid 发送带有 pdf 的邮件
【发布时间】:2014-10-19 18:23:18
【问题描述】:

在我的应用程序中,我将 PDF 文件下载到内部存储。在此之后,我想发送带有文件的邮件。我看到文件已下载到内存中 com.my.app -> 文件-> pdffile.pdf 它有权限-rw--------

当我将文件附加到邮件并发送 gmail 时说:无法发送附件。但为什么 ??我有权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />

这是下载文件的代码。它在异步任务中运行

public static boolean saveFile(String fileName, Context context){
    String fileDirectory = context.getFilesDir().getAbsolutePath()
            + "//"+fileName;
    String urlServ = Constants.serverUrl+ "upload/forms/"+fileName;
    urlServ = urlServ.replace(" ", "%20");
    urlServ = urlServ.replace("\n", "%0d");
    urlServ = urlServ.replace("\"", "%22"); 


    int count;
    URI fUri = URI.create("file://" + fileDirectory);
    File f  = new File(fileDirectory);
    if (f.exists()){
        f.delete();
    }


    try {

        URL url = new URL(urlServ);
        URLConnection conexion = url.openConnection();
        conexion.connect();

        int lenghtOfFile = conexion.getContentLength();

        InputStream input = new BufferedInputStream(url.openStream());
        OutputStream output = new FileOutputStream(fileDirectory);


        //OutputStream output = context.openFileOutput(fileDirectory, Context.MODE_PRIVATE);

        byte data[] = new byte[1024];

        long total = 0;

        while ((count = input.read(data)) != -1) {
            total += count;
            output.write(data, 0, count);
        }

        output.flush();
        output.close();
        input.close();
    } catch (Exception e) {
        return false;
    }
    return true;
}

这是发送邮件的代码:

public static void sendMail(Context context, String filename) {
    String fileDirectory = context.getFilesDir().getAbsolutePath()
            + "/"+filename;
    File f  = new File(fileDirectory);
    Uri URI =Uri.fromFile(f);
    Intent i = new Intent(Intent.ACTION_SEND);
    i.setType("message/rfc822");
    i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"mytestmail@gmail.com"});
    i.putExtra(Intent.EXTRA_SUBJECT, "subject of email");
    i.putExtra(Intent.EXTRA_STREAM, URI);

    i.putExtra(Intent.EXTRA_TEXT   , "body of email");
    try {
        context.startActivity(Intent.createChooser(i, "Send mail..."));
    } catch (android.content.ActivityNotFoundException ex) {
        Toast.makeText(context, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
    }               
}

怎么了?它只用主题和文本打磨邮件......也许有一些权限问题。如何下载文件并赋予其完全权限

编辑:

这是权限问题,因为当我从同一目录发送具有不同权限的文件时,正在发送带有附件的邮件。 -rw-rw-rw- 有这个权限

我怎样才能下载文件并设置 -rw-rw-rw- 权限???

【问题讨论】:

    标签: android email pdf permissions email-attachments


    【解决方案1】:

    如果有人遇到同样的问题,我已经解决了这个问题。像这样打开 OutputStream 时 它赋予新文件权限-rw-rw-rw。和其他应用程序(在这种情况下为 Gmail)可以使用它。

    OutputStream output = context.openFileOutput( fileName, Context.MODE_WORLD_READABLE);
    

    【讨论】:

      【解决方案2】:

      这里的问题是,虽然您的应用程序有权读取文件,但电子邮件应用程序没有读取文件的权限。自 Jelly Bean 以来,当您尝试在应用程序外部共享文件 URI 时,StrictMode 会产生警告,因为当您与之共享文件的应用程序无权访问该文件时,可能会出现此类问题。建议在应用之间共享文件时使用content:// URI 而不是file:// URI。

      我建议使用FileProvider 类,它提供了一种使用content:// URI 共享文件的相对简单的方法。

      【讨论】:

        猜你喜欢
        • 2014-10-10
        • 2013-01-22
        • 2011-10-09
        • 1970-01-01
        • 1970-01-01
        • 2020-11-20
        • 2014-02-28
        • 2011-02-18
        • 1970-01-01
        相关资源
        最近更新 更多