title: How to share internal storage file with Gmail Client
body: <p>I am trying to share my internal storage file via Gmail client on my Moto Razr, but every time I sent to my test gmail account, I got everything except attachment.</p>
  
  <p>This is how I invoke and start gmail, while add file as attachment.</p>
  
  <pre><code>private void saveDaily() {
  Intent intent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE);
  intent.setType("text/plain");
  
  intent.putExtra(Intent.EXTRA_EMAIL, new String[] { loadEmailAddress() });
  intent.putExtra(Intent.EXTRA_SUBJECT, "Daily");
  intent.putExtra(Intent.EXTRA_TEXT, "Daily Log");
  intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
  
  ArrayList&lt;Uri&gt; uris = new ArrayList&lt;Uri&gt;();
  uris.add(saveDaily2File("dailyRecord.txt"));
  Log.d(TAG_D, "Size: " + uris.size());
  intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
  startActivity(Intent.createChooser(intent, "Send email"));
  }
  </code></pre>
  
  <p>This is how I implement my customized content provider.</p>
  
  <pre><code>public class SavedFileProvider extends ContentProvider {
  
  private static final String TAG_D = "ContentProvider";
  private static final HashMap&lt;String, String&gt; MIME_TYPES = new HashMap&lt;String, String&gt;();
  
  static {
  MIME_TYPES.put(".txt", "text/plain");
  }
  
  @Override
  public String getType(Uri uri) {
  String path = uri.toString();
  
  for (String extension : MIME_TYPES.keySet()) {
      if (path.endsWith(extension)) {
      return (MIME_TYPES.get(extension));
      }
  }
  
  return (null);
  }
  
  @Override
  public ParcelFileDescriptor openFile(Uri uri, String mode)
      throws FileNotFoundException {
  Log.d(TAG_D, "openFile()");
  
  File f = new File(getContext().getFilesDir(), uri.getPath());
  
  Log.d(TAG_D, f.getAbsolutePath());
  if (f.exists()) {
      return (ParcelFileDescriptor.open(f,
          ParcelFileDescriptor.MODE_READ_ONLY));
  }
  
  throw new FileNotFoundException(uri.getPath());
  }
  
  @Override
  public Cursor query(Uri url, String[] projection, String selection,
      String[] selectionArgs, String sort) {
  throw new RuntimeException("Operation not supported");
  }
  
  @Override
  public Uri insert(Uri uri, ContentValues initialValues) {
  throw new RuntimeException("Operation not supported");
  }
  
  @Override
  public int update(Uri uri, ContentValues values, String where,
      String[] whereArgs) {
  throw new RuntimeException("Operation not supported");
  }
  
  @Override
  public int delete(Uri uri, String where, String[] whereArgs) {
  throw new RuntimeException("Operation not supported");
  }
  
  private void copy(InputStream in, File dst) throws IOException {
  FileOutputStream out = new FileOutputStream(dst);
  byte[] buf = new byte[1024];
  int len;
  
  while ((len = in.read(buf)) &gt; 0) {
      out.write(buf, 0, len);
  }
  
  in.close();
  out.close();
  }
  
  @Override
  public boolean onCreate() {
  Log.d(TAG_D, "onCreate()");
  File f = new File(getContext().getFilesDir(), "dailyRecord.txt");
  
  if (!f.exists()) {
      AssetManager assets = getContext().getResources().getAssets();
  
      try {
      copy(assets.open("dailyRecord.txt"), f);
      } catch (IOException e) {
      Log.e("FileProvider", "Exception copying from assets", e);
  
      return (false);
      }
  }
  return (true);
  }
  </code></pre>
  
  <p>}</p>
  
  <p>Then, I add the following lines in my AndroidManifest.xml File.</p>
  
  <pre><code>&lt;provider
          android:name=".SavedFileProvider"
          android:authorities="Package Path here"
          android:exported="true"
          android:grantUriPermissions="true"
          android:multiprocess="true" &gt;
  &lt;/provider&gt;
  </code></pre>
  
  <p>I wonder what I am missing here.</p>
  
  <p>I have check the link:<a href="https://github.com/commonsguy/cw-advandroid/blob/master/ContentProvider/Files/src/com/commonsware/android/cp/files/FileProvider.java" rel="nofollow noreferrer">Link1</a>, <a href="https://stackoverflow.com/questions/12170386/create-and-share-a-file-from-internal-storage">Link2</a></p>