Android发送邮件与pdf

时间:2014-08-26 12:15:37

标签: android email pdf permissions email-attachments

在我的应用程序中,我将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-权限?

2 个答案:

答案 0 :(得分:0)

此处的问题是,虽然您的应用具有阅读文件的权限,但电子邮件应用程序无权读取该文件。从Jelly Bean开始,当您尝试在应用程序外共享文件URI时,StrictMode会发出警告,因为在与您共享文件的应用程序无权访问该文件时,可能会出现此类问题。建议在应用程序之间共享文件而不是content:// URI时使用file:// URI。

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

答案 1 :(得分:0)

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

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