I've been working on an application which is set to open a file with a specific extension. It works some times with Gmail (some files open, while some don't), and I can open a file from the file explorer.
I can't open the files from the Email application on the phone however and as I say, some files do not open from the Gmail application with my application and some do!
Here is my code.
<intent-filter > <!-- Solution from @richardlegget on this question http://stackoverflow.com/questions/8148629/intent-filter-to-download-attachment-from-gmail-apps-on-android -->
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/octet-stream" android:pathPattern=".*\\.myextension" />
</intent-filter>
<intent-filter >
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" android:scheme="file" android:host="*" android:pathPattern=".*\\.myextension" />
</intent-filter>
My Question
Is there a blanket set of intent-filters that register a specific activity with any file containing the desired file extension from anywhere on the Android device?
Not sure why are you using separate intent-filters when you can do it using a single tag.
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="*"
android:pathPattern=".*\\.myextension" />
<data android:scheme="https" android:host="*"
android:pathPattern=".*\\.myextension" />
<data android:scheme="content" android:host="*"
android:pathPattern=".*\\.myextension" />
<data android:scheme="file" android:host="*"
android:pathPattern=".*\\.myextension" />
</intent-filter>
There might be a permissions problem. I.E If your activity is set to open in separate task, then cannot access files created/owned by other applications. You'l have to set intent flags such that it opens in the same application.
Try multiple <data android:pathPattern/>
like this answer suggests
You need to resolve your path yourself when the scheme
is content
, i.e. when you receive a URI
to a ContentProvider
. The system will look at the mime type for your by call to ContentResolver.getType(Uri uri)
before your intent filter is checked, hence you need the code below.
Resolve the file path to your file by fetching a Cursor from the URI containing content scheme and query the _data column:
Cursor cursor = getContentResolver().query(URI, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
return cursor.getString(idx);
}
And add this intent-filter:
<intent-filter >
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content" />
<data android:mimeType="ourapp/ourfileextension" />
<data android:mimeType="application/zip" />
<data android:mimeType="application/octet-stream" />
</intent-filter>