Android:在 Gradle 构建脚本中使用 packageNameSuffix 时 SearchableInfo 为 null

2023-12-12

我遇到了这个方法getSearchableInfo期间始终返回 nullSearchView初始化如果我使用packageNameSuffix在项目的 Gradle 构建脚本中。

搜索视图初始化:

final SearchManager searchManager = (SearchManager) context.getSystemService(Context.SEARCH_SERVICE);
SearchableInfo info = searchManager.getSearchableInfo(componentName);
mSearchView.setSearchableInfo(info);

项目的build.gradle:

android {
    [...]
    buildTypes {
        debug {
            packageNameSuffix ".debug"
            versionNameSuffix "-debug"
            signingConfig signingConfigs.debug
        }
        [...]
    }
}

如果不使用包后缀,则给定的componentName is ComponentInfo{com.example.android/com.example.android.MapActivity}SearchView以及与其相关的SuggestionsProvider工作正常。

But if packageNameSuffix被设定为".debug",给定的componentName is ComponentInfo{com.example.android.debug/com.example.android.MapActivity}SearchManager回报null,而不是返回各自的SearchableInfo object.

有谁知道如何获得正确的SearchableInfo来自SearchManager?谢谢!

[EDIT]

尤金·马丁诺夫在评论中提到,这种行为可能与当局重命名不当或缺失有关。但我还配置了依赖于构建类型的权限命名,为了简单起见,我在最初的帖子中省略了该命名。

项目的build.gradle:

android {
    [...]
    sourceSets {
        debug {
            java.srcDirs = [
                'src/main/java'
            ]
            java.srcDirs = [
                'src/debug/res',
                'src/main/res'
            ]
        }
        release {
            java.srcDirs = [
                'src/main/java'
            ]
            java.srcDirs = [
                'src/release/res',
                'src/main/res'
            ]
        }
        [...]
    }
}

src/debug/res/values/build-config.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="cfg_app_name">App - Debug</string>
    <string name="cfg_authorities">com.example.debug.SuggestionsProvider</string>
    <string name="cfg_maps_key"><!-- some key --></string>
</resources>

src/release/res/values/build-config.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="cfg_app_name">App</string>
    <string name="cfg_authorities">com.example.SuggestionsProvider</string>
    <string name="cfg_maps_key"><!-- some other key --></string>
</resources>

src/main/res/xml/searchable.xml:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:hint="@string/action_search_hint"
    android:label="@string/cfg_app_name"
    android:includeInGlobalSearch="false"
    android:queryAfterZeroResults="true"
    android:searchSuggestAuthority="@string/cfg_authorities"
    android:searchSuggestIntentAction="android.intent.action.VIEW"
    android:searchSuggestThreshold="3" />

安装调试程序(使用packageNameSuffix选项)并且同一设备上的发布 apk 可以工作。我没有收到类似的错误Failure [INSTALL_FAILED_CONFLICTING_PROVIDER]...但正如已经说过的,SearchableInfo is null then.

安装两个 apk 而不使用packageNameSuffix选项会导致以下错误:Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES] - Installation failed since the device already has an application with the same package but a different signature.

或者我在这里错过了什么?

[/EDIT]


我正在使用完全改变包名称的产品口味。我发现通过使用ComponentName(Context pkg, Class<?> cls)我的搜索活动的构造函数我得到了一个有效的 SearchableInfo。

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchableInfo searchableInfo = searchManager.getSearchableInfo(new ComponentName(this, SearchActivity.class));

我还必须调整我的提供程序以使用不同的包,以便我的可搜索 xml 位于每个风味目录中,并且提供程序也列在每个风味的清单中。 这是我的目录结构:

src
  main
    AndoridManifest.xml
  flavor1
    res
      xml
        search.xml
    AndroidManifest.xml
  flavor2
    res
      xml
        search.xml
    AndroidManifest.xml

主/AndroidManifest.xml

<application
    android:icon="@drawable/ic_launcher"
    android:logo="@drawable/actionbar_icon"
    android:label="@string/app_name"
    android:name=".App"
    android:allowBackup="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".ui.MainActivity"
        android:launchMode="singleTask">
        <meta-data
            android:name="android.app.default_searchable"
            android:value=".ui.activity.SearchActivity"/>
    </activity>
    <activity android:name=".ui.SearchActivity" android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/search"/>
    </activity>

    <provider
        android:authorities=".provider.SuggestionProvider"
        android:name="com.example.main.provider.SuggestionProvider"
        android:exported="false"
        android:enabled="true"
        />
</applicaiton

风味1/AndroidManifest.xml

<application>
    <provider
        tools:replace="android:authorities"
        android:authorities="com.example.flavor1.provider.SuggestionProvider"
        android:name="com.example.main.provider.SuggestionProvider"
        android:exported="false"
        android:enabled="true"
        />
</application>

风味1/res/xml/search.xml

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_name"
    android:includeInGlobalSearch="false"
    android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"
    android:searchMode="queryRewriteFromText"
    android:searchSuggestAuthority="com.example.flavor1.provider.SuggestionProvider"
    android:searchSuggestSelection="title LIKE ?"
    android:searchSuggestThreshold="0"
    >
</searchable>

风味2/AndroidManifest.xml

<application>
    <provider
        tools:replace="android:authorities"
        android:authorities="com.example.flavor2.provider.SuggestionProvider"
        android:name="com.example.main.provider.SuggestionProvider"
        android:exported="false"
        android:enabled="true"
        />
</application>

flavor2/res/xml/search.xml

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_name"
    android:includeInGlobalSearch="false"
    android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"
    android:searchMode="queryRewriteFromText"
    android:searchSuggestAuthority="com.example.flavor2.provider.SuggestionProvider"
    android:searchSuggestSelection="title LIKE ?"
    android:searchSuggestThreshold="0"
    >
</searchable>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:在 Gradle 构建脚本中使用 packageNameSuffix 时 SearchableInfo 为 null 的相关文章

随机推荐

  • 解析 WordPress 帖子内容

    我有一个奇怪的布局 即使在规划阶段 我也不知所措 本质上我需要分离出所有不属于 gallery并将其放入
  • 如何在没有表单的情况下捕获屏幕?

    这是我用来捕获屏幕和鼠标光标作为屏幕截图的类 但我想以某种方式做到 如果表单位于屏幕中间 则不捕获它捕获屏幕和表单后面的区域 但不捕获表单本身 即使表单位于前面 并且我在应用程序运行时单击按钮或更改表单中的某些内容 也不要捕获它 只需继续捕
  • Visual Studio 2008 参考太长?

    我最近重新组织了我们的源代码控制 发现我们的解决方案之一不再构建 我们得到的唯一错误是 错误 65 未知构建错误 指定的路径 文件名或两者都是 太长 完全合格的文件 名称必须少于 260 个字符 并且目录名必须小于 超过 248 个字符 我
  • Titan 如何使用 HBase / Cassandra 实现恒定时间查找?

    在 O Reilly 的书 Graph Databases 第 6 章中 关于 Neo4j 如何存储图形数据库 它说 了解为什么本机图形处理如此高效 与基于大量索引的图表相比 请考虑以下事项 根据实现的不同 索引查找的算法复杂度可能为 O
  • C++ 新手需要打印整数组合的帮助

    假设我得到 整数范围iRange 即从1 up to iRange and 所需数量的组合 我想找到所有可能组合的数量并打印出所有这些组合 例如 Given iRange 5 and n 3 那么组合数就是iRange iRange n n
  • c 链表 - 是否可以创建一个独立于有效负载的迭代器函数?

    所有 在我的应用程序中 我有许多正在创建的链接列表 例如 一个 struct record 保存具有数百个节点 文本行 的转录文本 而第二种类型的链接列表 struct srch results 保存使用 strstr 搜索第一个列表的搜索
  • 如何使用 JSTL 根据 Map 中的键显示多个表?

    我有一个字符串映射和对象列表 其中包含每个数据中心及其机器 我当前正在将此对象从我的控制器传递给 JSP 然后在 JSP 页面中迭代它以显示数据 如果地图大小为 1 那么我就能够在 JSP 页面中显示数据并且工作正常 现在假设如果地图大小为
  • Access - 从表单中的图像控件导出图像

    我一直在寻找一种从访问表单中提取图像的方法 在谷歌上的搜索几乎总是指向OLE到磁盘 该软件允许导出存储在访问表内的 OLE 字段中的图像 这不是我想要的 我有一个带有一些徽标 标题和背景图像的表单 这些图像使数据库变得越来越大 因为它们嵌入
  • 如何解决错误“System.Web.UI.MasterPage”不包含定义

    我有两个母版页和一个内容页 在我的本地计算机上 此代码可以工作 但是一旦我上传到服务器 我收到以下错误 编译错误 描述 编译服务此请求所需的资源期间发生错误 请查看以下具体错误详细信息并适当修改您的源代码 编译器错误消息 CS1061 Sy
  • readlines 给了我额外的换行符 python2.6.5

    我对以下代码有问题 file open file txt r lines file readlines print lines 0 print lines 1 print lines 2 file close 这段代码给了我行之间的换行符
  • 如何使用CPUID作为序列化指令?

    CPUID 可用作序列化指令 如上所述here and here 在 C 中以这种方式使用它的最小 最简单的 asm 语法是什么 Is that enough What to do with registers and memory Is
  • 如何在 SAS University Edition 中直接导入 PC 上的文件?

    我正在使用 SAS University Edition 我必须将文件导入 SAS 软件 我尝试过使用 infile 和 proc import 语句 但直接从 PC 访问文件时这些语句不起作用 有没有办法直接从 PC 访问 SAS UE
  • 关闭窗口后如何保存数据?

    我正在尝试制作一些 GUIPython3 with tkinter 到目前为止我已经主窗口 and Test 按钮 打开第二个窗口 第二个窗口有输入 标签 保存和关闭按钮 当您在条目中输入内容并按save按钮 标签显示您在条目中输入的文本
  • 如何从 Android 服务实现 FileObserver

    如何构建 Android 应用程序来启动Service使用一个FileObserver这样当观察到的目录被修改 即用户拍照 时 就会执行一些其他代码 调试时 永远不会触发 onEvent 方法 这是我的服务中的 onStart 事件 这To
  • 如何查找目录及其子目录中最大的文件?

    我们刚刚开始 UNIX 课程 正在学习各种 Bash 命令 我们的任务涉及在一个目录下执行各种命令 该目录下也有许多文件夹 我知道如何使用以下命令列出和计算根文件夹中的所有常规文件 find type l wc l 但我想知道从那里去哪里才
  • jQuery 显示/隐藏问题

    我只是想执行一个非常简单的 jQuery 操作 我有两个组件 safety and safety tab a the safety需要在加载时隐藏 当 a 链接出现在 safety tab点击后 将会hide本身和slideUp the s
  • 如何在 Coq 中将一条线的公理定义为两个点

    我想找一个例子axiom in Coq类似于几何中的线公理 如果给定两个点 则这两点之间存在一条线 我想看看如何在 Coq 中定义它 本质上选择这个简单的直线公理来看看如何定义一些非常原始的东西 因为我很难在自然语言之外定义它 具体来说 我
  • UIScrollView延迟加载图像以减少内存使用并避免崩溃

    我的应用程序 使用滚动视图通过 NSOperation 加载多个图像 最大大约 100sh 我尝试在我的 ipod 2Gen 上进行测试 由于设备内存不足 它崩溃了 但在 ipod 4th Gen 上运行良好 在 2nd Gen 上 它在加
  • 在滚动时显示和隐藏 BottomAppBar

    我正在尝试实施BottomAppBar我将在其中处理导航WebView
  • Android:在 Gradle 构建脚本中使用 packageNameSuffix 时 SearchableInfo 为 null

    我遇到了这个方法getSearchableInfo期间始终返回 nullSearchView初始化如果我使用packageNameSuffix在项目的 Gradle 构建脚本中 搜索视图初始化 final SearchManager sea