如果我在项目的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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)