cod*_*old 3 android gradle searchable build.gradle
我遇到的是,如果我在项目的Gradle构建脚本中使用,则该方法getSearchableInfo在SearchView初始化期间始终返回null packageNameSuffix。
SearchView初始化:
final SearchManager searchManager = (SearchManager) context.getSystemService(Context.SEARCH_SERVICE);
SearchableInfo info = searchManager.getSearchableInfo(componentName);
mSearchView.setSearchableInfo(info);
Run Code Online (Sandbox Code Playgroud)
项目的build.gradle:
android {
[...]
buildTypes {
debug {
packageNameSuffix ".debug"
versionNameSuffix "-debug"
signingConfig signingConfigs.debug
}
[...]
}
}
Run Code Online (Sandbox Code Playgroud)
如果不使用软件包后缀,则给定componentName为ComponentInfo{com.example.android/com.example.android.MapActivity}和SearchView以及与其关联的SuggestionsProvider工作正常。
但是,如果packageNameSuffix将设置为".debug",则给定componentName为ComponentInfo{com.example.android.debug/com.example.android.MapActivity}和SearchManager返回null,而不是返回各自的SearchableInfo对象。
有谁知道如何得到正确的SearchableInfo距离SearchManager?谢谢!
[编辑]
尤金·马蒂诺夫(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'
]
}
[...]
}
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
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" />
Run Code Online (Sandbox Code Playgroud)
packageNameSuffix在同一设备上安装调试(带有选件)和发行版apk 均可。我没有收到类似Failure [INSTALL_FAILED_CONFLICTING_PROVIDER]... 的错误,但是正如已经说过SearchableInfo的null那样。
不带packageNameSuffix选件安装两个apk 会导致以下错误:Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES] - Installation failed since the device already has an application with the same package but a different signature.
还是我在这里想念什么?
[/编辑]
我使用的产品口味会完全改变包装名称。我发现通过将ComponentName(Context pkg, Class<?> cls)构造函数用于搜索活动,我可以获得有效的SearchableInfo。
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchableInfo searchableInfo = searchManager.getSearchableInfo(new ComponentName(this, SearchActivity.class));
Run Code Online (Sandbox Code Playgroud)
我还必须调整提供程序以使用其他程序包,以便我的可搜索xml位于每个flavor目录中,并且该提供程序也列在每种flavor的清单中。这是我的目录结构:
src
main
AndoridManifest.xml
flavor1
res
xml
search.xml
AndroidManifest.xml
flavor2
res
xml
search.xml
AndroidManifest.xml
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1057 次 |
| 最近记录: |