android 注册活动以打开具有特定扩展名的任何文件

hgb9j2n6  于 2023-03-21  发布在  Android
关注(0)|答案(4)|浏览(213)

我一直在开发一个应用程序,它被设置为打开一个特定扩展名的文件。它有时可以在Gmail中使用(有些文件可以打开,有些不能),我可以从文件资源管理器中打开文件。
我不能打开文件从电子邮件应用程序在手机上,但是,正如我所说,有些文件不打开从Gmail应用程序与我的应用程序和一些做!
这是我的代码。

<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>

我的问题

是否存在一组覆盖的意图过滤器,可将特定Activity注册到Android设备上任何位置包含所需文件扩展名的任何文件?

vs3odd8k

vs3odd8k1#

不知道你为什么要使用单独的intent过滤器,当你可以使用一个标签的时候。

<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>

可能存在权限问题。例如,如果您的Activity设置为在单独的任务中打开,则无法访问由其他应用程序创建/拥有的文件。您必须设置Intent标志,以便它在同一应用程序中打开。

oknwwptz

oknwwptz2#

按照this answer的建议尝试多个<data android:pathPattern/>

bhmjp9jg

bhmjp9jg3#

schemecontent时,即当您接收URIContentProvider时,您需要自己解析路径。在检查Intent过滤器之前,系统将查看您对ContentResolver.getType(Uri uri)的by调用的mime类型,因此您需要以下代码。
通过从包含内容方案的URI中提取Cursor来解析文件的文件路径,并查询_data列:

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);
}

并添加以下intent过滤器:

<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>
ukdjmx9f

ukdjmx9f4#

  • 可以打开任何类型的文件。但在这里我处理重复使用的文件类型,而不干扰默认行为。
  • 片段如下......
public void openAllFiles(File url) throws IOException {
  // Create 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); 
}

相关问题