title: Open downloaded file on Android N using FileProvider
body: <p>I've got to fix our App for Android N due to the FileProvider changes. I've basically read all about this topic for the last ours, but no solution found did work out for me.</p>
  
  <p>Here's our prior code which starts downloads from our app, stores them in the <code>Download</code> folder and calls an <code>ACTION_VIEW</code> intent as soons as the <code>DownloadManager</code> tells he's finished downloading:</p>
  
  <pre><code>BroadcastReceiver onComplete = new BroadcastReceiver() {
      public void onReceive(Context ctxt, Intent intent) {
          Log.d(TAG, "Download commplete");
  
          // Check for our download
          long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
          if (mDownloadReference == referenceId) {
              DownloadManager.Query query = new DownloadManager.Query();
              query.setFilterById(mDownloadReference);
              Cursor c = mDownloadManager.query(query);
              if (c.moveToFirst()) {
                  int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
                  if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
                      String localUri = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                      String fileExtension = MimeTypeMap.getFileExtensionFromUrl(localUri);
                      String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension);
  
                      if (mimeType != null) {
                          Intent openFileIntent = new Intent(Intent.ACTION_VIEW);
                          openFileIntent.setDataAndTypeAndNormalize(Uri.parse(localUri), mimeType);
                          openFileIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
  
                          try {
                              mAcme.startActivity(openFileIntent);
                          }
                          catch (ActivityNotFoundException e) {
                              // Ignore if no activity was found.
                          }
                      }
                  }
              }
          }
      }
  };
  </code></pre>
  
  <p>This works on Android M, but breaks on N due to the popular <code>FileUriExposedException</code>. I've now tried to fix this by using the <code>FileProvider</code>, but I cannot get it to work. It's breaking when I try to get the content URI:</p>
  
  <p><code>Failed to find configured root that contains /file:/storage/emulated/0/Download/test.pdf</code></p>
  
  <p>The <code>localUri</code> returned from the <code>DownloadManager</code> for the file is:</p>
  
  <p><code>file:///storage/emulated/0/Download/test.pdf</code></p>
  
  <p>The <code>Environment.getExternalStorageDirectory()</code> returns <code>/storage/emulated/0</code> and this is the code for the conversion:</p>
  
  <pre><code>File file = new File(localUri);
  Log.d(TAG, localUri + " - " + Environment.getExternalStorageDirectory());
  Uri contentUri = FileProvider.getUriForFile(ctxt, "my.file.provider", file);
  </code></pre>
  
  <p>From <code>AndroidManifest.xml</code></p>
  
  <pre><code>    &lt;provider
          android:name="android.support.v4.content.FileProvider"
          android:authorities="my.file.provider"
          android:exported="false"
          android:grantUriPermissions="true"&gt;
          &lt;meta-data
              android:name="android.support.FILE_PROVIDER_PATHS"
              android:resource="@xml/file_paths"/&gt;
      &lt;/provider&gt;
  </code></pre>
  
  <p>The <code>file_paths.xml</code>:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;paths xmlns:android="http://schemas.android.com/apk/res/android"&gt;
      &lt;external-path name="external_path" path="." /&gt;
  &lt;/paths&gt;
  </code></pre>
  
  <p>And I've tried all values I could find in that xml file. :(</p>