Android email attachment not always working

I am sending an email with attachments using ContentProvider.

  • Firstly, I am writing files to the cache directory.
  • Then I create an email with a URL for each file that the content provider will find
  • Then I launch a new action with the intention of ACTION_SEND_MULTIPLE.
  • I select gmail and then click the submit button.

It sometimes works, it seems to work for the first time, but it does not work after subsequent attempts ... but this is not always the case.

When it doesn't work, the email gets stuck in gmail. This happens in versions 2.3.3 and 4.0.1, opening mail in the gmail client and clicking the send button, so often the message is transmitted almost instantly, but not every time.

Opening intent using Google Drive has the same behavior as gmail.

Opening intent with the built-in email client always works so far.

Here is the code to send email:

Intent sendIntent = new Intent(Intent.ACTION_SEND_MULTIPLE); sendIntent.putExtra(Intent.EXTRA_EMAIL, exportParams.emailAddresses); sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Leader Activity Report"); sendIntent.putExtra(Intent.EXTRA_TEXT, "Leader Activity Report, see attached file."); Uri fileUri = CachedFileProvider.createFileUri(result.fileName); if (L.dbg()) L.dbg("Using uri:" + fileUri.toString()); ArrayList<Uri> uris = new ArrayList<Uri>(); uris.add(fileUri); Uri fileUri2 = CachedFileProvider.createFileUri(result.fileNameDayByDay); uris.add(fileUri2); if (L.dbg()) L.dbg("Using uri2:" + fileUri2.toString()); sendIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); sendIntent.setType("text/plain"); parent.startActivity(sendIntent); 

Here is the content provider

 public class CachedFileProvider extends ContentProvider { private static final String CLASS_NAME = "CachedFileProvider"; public static final String AUTHORITY = "com.josh.lll.file.provider"; private UriMatcher uriMatcher; @Override public boolean onCreate() { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(AUTHORITY, "*", 1); return true; } @Override public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { try { String LOG_TAG = CLASS_NAME + " - openFile"; Log.v(LOG_TAG, "Called with uri: '" + uri + "' - " + uri.getLastPathSegment()); switch (uriMatcher.match(uri)) { case 1: String fileLocation = getContext().getCacheDir() + File.separator + uri.getLastPathSegment(); Log.i(CLASS_NAME,"Returning file :"+fileLocation); ParcelFileDescriptor pfd = ParcelFileDescriptor.open(new File( fileLocation), ParcelFileDescriptor.MODE_READ_ONLY); return pfd; default: Log.v(LOG_TAG, "Unsupported uri: '" + uri + "'."); throw new FileNotFoundException("Unsupported uri: " + uri.toString()); } } catch (FileNotFoundException t) { Bug.major(this, t, "Could not return file descriptor"); throw t; } catch (RuntimeException t) { Bug.major(this, t, "Could not return file descriptor"); throw t; } catch (Error t) { Bug.major(this, t, "Could not return file descriptor"); throw t; } } public static String createFullyQualifiedFileName(Context c, String fileNamePart) { File cacheDir = c.getCacheDir(); Log.i(CLASS_NAME,"Using cache dir:"+cacheDir); return cacheDir + File.separator + fileNamePart; } public static Uri createFileUri(String fileNamePart) { return Uri.parse("content://" + AUTHORITY + "/"+ fileNamePart); } public int update(Uri uri, ContentValues contentvalues, String s, String[] as) { return 0; } @Override public int delete(Uri uri, String s, String[] as) { return 0; } @Override public Uri insert(Uri uri, ContentValues contentvalues) { return null; } @Override public String getType(Uri uri) { return null; } @Override public Cursor query(Uri uri, String[] projection, String s, String[] as1, String s1) { return null; } 

}

For successful and "stalled" e-mails, gmail sends the following log message:

 04-03 22:17:35.027: I/Gmail(13206): >>>>> Attachment uri: content://com.josh.lll.file.provider/report_20100401_20130402_LeadetJosh_3_1364980653516.csv 04-03 22:17:35.035: I/Gmail(13206): >>>>> type: text/plain 04-03 22:17:35.035: I/Gmail(13206): >>>>> size: 0 04-03 22:17:35.054: I/Gmail(13206): >>>>> Attachment uri: content://com.josh.lll.file.provider/backup_20100401_20130402_LeadetJosh_3_1364980653516_day_by_day.lll 04-03 22:17:35.054: I/Gmail(13206): >>>>> type: text/plain 04-03 22:17:35.054: I/Gmail(13206): >>>>> size: 0 
+6
source share
2 answers

this happens for files stored in system folders, such as / data / app or / system.

Workaround for this: copy these files to the location of the SD card and attach / use them from there.

+1
source

Treatment found:

  • Disable Gmail.
  • Reset to factory by default.
  • Reboot the phone, both in the off state and vice versa.
  • Enable Gmail.

Should work again on attachments

-3
source

All Articles