特定活动的文件扩展名的意图过滤器



我有 2 个自定义文件扩展名*.abc*.xyz

我已经为活动编写了意图过滤器,其中扩展名*.abc文件应该以Activity1打开,*.xyz应该在Activity2中打开

这些文件具有序列化的 java 对象而不是纯文本文件。

这些是Android 清单中这些活动的意图过滤器.xml

<activity
android:name=".ui.Activity1">
<intent-filter tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
<data android:pathPattern=".*\.abc" />
</intent-filter>
</activity>
<activity
android:name=".ui.Activity2">
<intent-filter tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
<data android:pathPattern=".*\.xyz" />
</intent-filter>
</activity>

我可以在安卓系统中注册这些扩展,我的应用活动显示在安卓系统UI的应用选择器中

我正在日志猫中打印 URI 信息,如下所示

Timber.i(uri.toString())
val mimeType = contentResolver.getType(uri)
Timber.i(mimeType)

Logcat 當文件從WhatsApp打開

content://com.whatsapp.provider.media/item/5237
application/octet-stream

Solid Explorer打开文件时的 Logcat

content://pl.solidexplorer2.files/storage/emulated/0/Download/File1.abc
application/*

但是当点击任何一个文件(自定义扩展名)时,它将两个活动都显示为可打开的意图, 例如。如果单击文件 file1.abc,它将扩展名的意图过滤器显示为活动 1 和活动 2

我想使这些扩展名特定于活动,例如如果单击扩展名为 *.abc 的文件,它应该只在 Android 系统 UI 的意图选择器中具有活动 1

我尝试了其他答案中解释的一些方法,但这些方法似乎不适用于内容类型为 URI的两种文件格式

有些解决方案仅在从文件浏览器(如Solid Explorer)打开文件时有效,但在从使用MIME类型作为媒体的 WhatsApp 等应用程序打开时

不起作用下面的意图过滤器与Solid Explorer正确配合使用。 它基于自定义文件扩展名过滤活动。但是相同的意图过滤器不适用于Android System的"选择器"对话框,因为它不适用于使用Android系统的"意图选择器"的WhatsApp或Gmail等应用程序。

<activity
android:name=".ui.Activity1">
<intent-filter>
<data
android:host="*"
android:mimeType="*/*"
android:pathPattern=".*\.abc"
android:scheme="content" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
<activity
android:name=".ui.Activity2">
<intent-filter>
<data
android:host="*"
android:mimeType="*/*"
android:pathPattern=".*\.xyz"
android:scheme="content" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>

任何帮助将不胜感激。 谢谢。

使用每个活动的意图过滤器没有直接解决此问题的方法,因此我创建了接受以下意图过滤器的文件意图活动

<intent-filter
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.EDIT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>

文件意图活动用于接受任何文件格式,然后根据使用此答案中引用的游标从内容URI转换的文件扩展名决定进一步的操作

fun getFileName(uri: Uri): String {
lateinit var cursor: Cursor
lateinit var result: String
try {
cursor = appContext.contentResolver.query(uri, null, null, null, null)
if(cursor!=null && cursor.moveToFirst()){
result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME))
}
return result
} finally {
cursor.close()
}
}
private fun getFileType(fileName: String): FileType {
return when (fileExtension) {
FileFormats.ABC_FILE_FORMAT -> FileType.ABC
FileFormats.XYZ_FILE_FORMAT -> FileType.XYZ
else -> FileType.UNKNOWN
}
}

并打开基于文件类型的活动1活动 2

private fun openActivityByType(fileType: FileType) {
when (fileType) {
FileType.ABC -> startActivity1()
FileType.XYZ -> startActivity2()
FileType.UNKNOWN -> showFileUnsupportedMessage()
}
}

这种方法至少通过在Android的意图选择器中仅显示1个文件意图活动而不是单个应用程序的多个活动来减少用户交互的混乱

相关内容

最新更新