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

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

概述如果我在项目的Gradle构建脚本中使用packageNameSuffix,则在SearchView初始化期间,方法getSearchableInfo始终返回null.SearchView初始化:finalSearchManagersearchManager=(SearchManager)context.getSystemService(Context.SEARCH_SERVICE);SearchableInfoinfo=search

如果我在项目的Gradle构建脚本中使用packagenameSuffix,则在SearchVIEw初始化期间,方法getSearchableInfo始终返回null.

SearchVIEw初始化:

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为ComponentInfo {com.example.androID/com.example.androID.MapActivity},并且SearchVIEw及其关联的RecommendationionsprovIDer可以正常工作.

但是,如果packagenameSuffix设置为“ .deBUG”,则给定的componentname为ComponentInfo {com.example.androID.deBUG / com.example.androID.MapActivity},并且SearchManager返回null,而不是返回相应的SearchableInfo对象.

有谁知道如何从SearchManager获取正确的SearchableInfo?谢谢!

[编辑]

尤金·马蒂诺夫(Eugen Martinov)在评论中提到,此行为可能需要对不正确或缺少的权限进行更名.但是我还配置了一个与构建类型相关的权限命名,为了简单起见,我在最初的文章中将其省略.

项目的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均可.我没有收到失败[INSTALL_Failed_CONFliCTING_PROVIDER]之类的错误.但是,正如已经说过的那样,SearchableInfo为null.

不带packagenameSuffix选项安装两个apk都会导致以下错误:失败[INSTALL_PARSE_Failed_INCONSISTENT_CERTIFICATES]-安装失败,因为该设备已经具有带有相同软件包但签名不同的应用程序.

还是我在这里想念什么?

[/编辑]

解决方法:

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

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

我还必须调整提供程序以使用其他程序包,以便我的可搜索xml位于每个flavor目录中,并且该提供程序也列在每种flavor的清单中.
这是我的目录结构:

src  main    AndorIDManifest.xml  flavor1    res      xml        search.xml    AndroIDManifest.xml  flavor2    res      xml        search.xml    AndroIDManifest.xml

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

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

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

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

flavour2 / 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>
总结

以上是内存溢出为你收集整理的Android:在Gradle构建脚本中使用packageNameSuffix时,SearchableInfo为null全部内容,希望文章能够帮你解决Android:在Gradle构建脚本中使用packageNameSuffix时,SearchableInfo为null所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1088091.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存