gpt4 book ai didi

android - 特定 Activity 的文件扩展名的 Intent 过滤器

转载 作者:行者123 更新时间:2023-11-29 01:04:25 26 4
gpt4 key购买 nike

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

我已经编写了 Intent 过滤器 用于应在 Activity1*.xyz 中打开具有 *.abc 扩展名的文件的 Activity 应该在 Activity2

中打开

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

这些是 AndroidManifest.xml

中那些 Activity 的 Intent 过滤器
<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>

我可以在 Android 系统中注册这些扩展,并且我的应用 Activity 显示在 Android 系统用户界面的应用选择器中

我在 logcat 中打印 URI 信息如下

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

WhatsApp 打开文件时的 Logcat

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

Solid Explorer 打开文件时的 Logcat

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

但是当点击其中一个文件(自定义扩展名)时,它会将两个 Activity 显示为可打开的 Intent,例如。如果单击文件 file1.abc,它显示两个 Intent Filters 扩展名 Activity1 和 Activity2

我想让那些扩展 Activity 特定就像点击扩展名为 *.abc 的文件一样,它在 Android 系统 UI 的 Intent Chooser 中应该只有 Activity1

我尝试了其他答案中解释的几种方法,但这些方法没有似乎适用于两种具有内容类型 URI

的文件格式

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

下面的 Intent 过滤器与 Solid Explorer 一起正常工作。它是基于自定义文件扩展名的过滤 Activity 。但同样的 Intent Filter 不适用于 Android 系统的选择器对话框,因为它不适用于 WhatsAppGmail 等使用 Android 系统的 Intent Chooser 的应用

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

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

最佳答案

没有通过为每个 Activity 使用 Intent Filters 来直接解决这个问题,所以我创建了 FileIntentActivity 它接受以下 Intent Filter

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

FileIntentActivity 用于接受任何文件格式,然后根据从 Content URI 转换而来的 file extension 使用 Cursors 引用来决定进一步的操作this answer

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

并根据FileType打开Activity1Activity2

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

通过在 Android 的 Intent Chooser 中仅显示 1 个文件 Intent Activity 而不是单个应用的多个 Activity,这种方法至少使用户交互不那么困惑

关于android - 特定 Activity 的文件扩展名的 Intent 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48367934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com