Câu hỏi này đã được đăng trước đó, nhưng không có câu trả lời rõ ràng hoặc được chấp nhận và tất cả các giải pháp được cung cấp phải "hoạt động" không cho tôi. Xem tại đây: Gmail 5.0 app fails with "Permission denied for the attachment" when it receives ACTION_SEND intent"Quyền bị từ chối đối với tệp đính kèm" (trên Gmail 5.0) cố gắng đính kèm tệp vào mục đích email
Tôi có ứng dụng tích hợp dữ liệu trong tệp văn bản và cần gửi tệp văn bản cùng trong email, tự động đính kèm tệp đó. Tôi đã thử nhiều cách để có được điều này để đính kèm, và nó dường như làm việc cho Gmail 4.9 và dưới đây nhưng 5.0 có một số tính năng mới cho phép vô hiệu hóa nó làm những gì tôi muốn.
Intent i = new Intent(Intent.ACTION_SEND);
String to = emailRecipient.getText().toString();
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL, new String[] { to });
i.putExtra(Intent.EXTRA_SUBJECT, "Pebble Accelerometer Data");
i.putExtra(Intent.EXTRA_TEXT, "Attached are files containing accelerometer data captured by SmokeBeat Pebble app.");
String[] dataPieces = fileManager.getListOfData(getApplicationContext());
for(int i2 = 0; i2 < dataPieces.length; i2++){
i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(getApplicationContext().getFilesDir() + File.separator + dataPieces[i2])));
}
i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(getApplicationContext().getFilesDir() + File.separator + fileManager.getCurrentFileName(getApplicationContext()))));
Log.e("file loc", getApplicationContext().getFilesDir() + File.separator + fileManager.getCurrentFileName(getApplicationContext()));
try {
startActivity(Intent.createChooser(i, "Send Email"));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(Main.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
Datapieces có thể trống nhưng dòng tệp hiện tại bên dưới vòng lặp luôn đáng tin cậy và luôn đính kèm.
Tôi đã cố gắng thay đổi
Uri.fromFile()
để
Uri.parse()
Khi tôi làm điều đó, nó gắn, nhưng Gmail sau đó bị treo và khi tôi kiểm tra logcat đó là vì một con trỏ null. Điều này rất có thể do Gmail không có quyền truy cập vào tệp và do đó kết quả là không có.
Tôi cũng đã cố gắng sử dụng
getCacheDir()
thay vì
getFilesDir()
và nó có kết quả tương tự.
Tôi đang làm gì sai ở đây và làm cách nào để tôi khắc phục sự cố? Một số ví dụ mã sẽ là thực sự, thực sự tiện dụng vì tôi mới phát triển Android và giải thích những gì tôi cần làm mà không có một số loại đẩy có lẽ sẽ không kết thúc giúp đỡ.
Cảm ơn rất nhiều.
Có sự khác biệt lớn giữa câu hỏi và giải pháp - câu hỏi là chia sẻ tệp riêng tư của ứng dụng (từ context.getFiles()) và trong câu trả lời nó trở thành từ bộ nhớ chung (~ context.getExternalFilesDir()) ... Không giống nhau ... – Felix
Có giải pháp chung tốt cho các thiết bị có thể không có bộ lưu trữ gắn ngoài không? Hay liệu kịch bản đó có phải là một mối lo ngại bây giờ không? – dylansturg
Sử dụng bộ nhớ ngoài để lưu trữ tệp đính kèm đã trở thành thực tiễn không tốt kể từ Android API 23 và hệ thống quyền mới của nó. Nếu bạn không yêu cầu người dùng cho phép WRITE_EXTERNAL_STORAGE khi chạy, thì nó sẽ thất bại. –