Register activity to open any file with a specific extension

I am working on an application that is configured to open a file with a specific extension. It works several times with Gmail (some files open and some not), and I can open the file from the file explorer.

I can’t open files from the email application on my phone, and, as I said, 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 set of intent filters that record a specific action with any file containing the desired file extension from anywhere on the Android device?

+6
android android-intent
source share
4 answers

You don’t know why you use separate intent filters, when you can do it using one 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 may be a problem with permissions. I.E. If your activity is set to open in a separate task, then there cannot be access to files created / owned by other applications. You must set the flags of intent so that they open in one application.

+3
source share

You need to decide your path yourself when scheme is content , that is, when you get the URI before the ContentProvider . The system will look for the mime type for your call by ContentResolver.getType(Uri uri) before your intent filter is set, so you need the code below.

Allow the file path by retrieving the cursor from the URI containing the content scheme and query for 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> 
+1
source share

Try a few <data android:pathPattern/> , for example this answer

+1
source share
  • You can open any type of file. But here I handled reusable file types without violating the default behavior.
  • And this snippet is below ...

    public void openAllFiles (File url) throws IOException {// Creating a URI File file = url; Uri uri = Uri.fromFile (file);

     Intent intent = new Intent(Intent.ACTION_VIEW); // Check what kind of file you are trying to open, by comparing the url with extensions. // When the if condition is matched, plugin sets the correct intent (mime) type, // so Android knew what application to use to open the file if (url.toString().contains(".doc") || url.toString().contains(".docx")) { // Word document intent.setDataAndType(uri, "application/msword"); } else if(url.toString().contains(".pdf")) { // PDF file intent.setDataAndType(uri, "application/pdf"); } else if(url.toString().contains(".ppt") || url.toString().contains(".pptx")) { // Powerpoint file intent.setDataAndType(uri, "application/vnd.ms-powerpoint"); } else if(url.toString().contains(".xls") || url.toString().contains(".xlsx")) { // Excel file intent.setDataAndType(uri, "application/vnd.ms-excel"); } else if(url.toString().contains(".zip") || url.toString().contains(".rar")) { // WAV audio file intent.setDataAndType(uri, "application/x-wav"); } else if(url.toString().contains(".rtf")) { // RTF file intent.setDataAndType(uri, "application/rtf"); } else if(url.toString().contains(".wav") || url.toString().contains(".mp3")) { // WAV audio file intent.setDataAndType(uri, "audio/x-wav"); } else if(url.toString().contains(".gif")) { // GIF file intent.setDataAndType(uri, "image/gif"); } else if(url.toString().contains(".jpg") || url.toString().contains(".jpeg") || url.toString().contains(".png")) { // JPG file intent.setDataAndType(uri, "image/jpeg"); } else if(url.toString().contains(".txt")) { // Text file intent.setDataAndType(uri, "text/plain"); } else if(url.toString().contains(".3gp") || url.toString().contains(".mpg") || url.toString().contains(".mpeg") || url.toString().contains(".mpe") || url.toString().contains(".mp4") || url.toString().contains(".avi")) { // Video files intent.setDataAndType(uri, "video/*"); } else { //if you want you can also define the intent type for any other file //additionally use else clause below, to manage other unknown extensions //in this case, Android will show all applications installed on the device //so you can choose which application to use intent.setDataAndType(uri, "*/*"); } intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); 

    }

+1
source share

All Articles