在我的Android应用程序中,我创建了一个PDF,我希望用户能够通过电子邮件客户端从我的应用程序发送。现在,电子邮件客户端将显示PDF已附加但无法发送附件。这是权限问题还是什么?有什么建议吗?
编辑通过添加getExternalCacheDir()
存储到外部并且问题仍然存在
电子邮件功能
private void EmailDialog(){
//create a dialog that prompts the user whether or not they want to send the PDF
dialogBuilder = new AlertDialog.Builder(this);
final TextView txtInput = new TextView(this);
dialogBuilder.setTitle("Email Audit");
dialogBuilder.setMessage("Do you want to email this audit?");
dialogBuilder.setView(txtInput);
dialogBuilder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
//allows user to send PDF over their email application choice
@Override
public void onClick(DialogInterface dialog, int which) {
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
PDF = new File(getExternalCacheDir() + PDFname);
i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(PDF));
try {
startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(OldLocation.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
}
});
dialogBuilder.setNegativeButton("Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
RemoveDialog();
}
});
AlertDialog emailDialog = dialogBuilder.create();
emailDialog.show();
}
PDF功能
@TargetApi(Build.VERSION_CODES.KITKAT)
private void createPDF(){
// open a new document
PrintAttributes pa = new PrintAttributes.Builder().setMediaSize(PrintAttributes.MediaSize.NA_LETTER).setMinMargins(PrintAttributes.Margins.NO_MARGINS).build();
PrintedPdfDocument document = new PrintedPdfDocument(this, pa);
// start a page
PdfDocument.Page page = document.startPage(0);
// draw something on the page
View content = textView;
content.draw(page.getCanvas());
// finish the page
document.finishPage(page);
// add more pages
// write the document content
try {
File PDFs = getExternalCacheDir();
File file = new File(PDFs, companyInfo.getName() + ".pdf");
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
document.writeTo(fos);
fos.close();
//close the document
document.close();
} catch (Exception ex){
}
realm.beginTransaction();
companyInfo = realm.where(CompanyInfo.class).findFirst();
companyInfo.removeFromRealm();
realm.commitTransaction();
}
答案 0 :(得分:1)
这是权限问题还是什么?
是。除了你的文件之外,地球上正好有零个可以访问你文件的应用程序,就像internal storage一样,属于你的应用程序。
此外,永远没有硬编码路径。在用户位于辅助帐户的每台Android 4.2+设备上,您的/data/data/
内容都会失败。
有什么建议吗?
您可以坚持使用内部存储,但您需要使用a FileProvider
(可能还有my LegacyCompatCursorWrapper
)来提供文件。 This sample app虽然使用了ACTION_VIEW
而不是ACTION_SEND
来证明了这一点。
或者,将文件放在external storage上。
答案 1 :(得分:0)
除了权限外,我还遇到了一个问题。我猜想这与Gmail懒惰持有Uri有关,但是直到(有时很多分钟)才阅读。您会发现有时邮件位于发件箱中。
如果您在电子邮件退出发件箱之前删除文件,则电子邮件将被发送而没有附件。我不得不在删除文件之前等待很长的时间