我正在尝试查询所有可用的搜索提供程序,类似于快速搜索框的工作方式,以获取搜索建议列表。我忽略了我没有权限阅读的内容。现在,一切都适用于立即返回结果的提供商。
然而,对于那些消失并从网上获得结果的人,我无法得到任何结果。其中一个示例是IMDB应用程序。通常我得到一个返回null的游标,有时我得到一些不正确的缓存结果。
任何人都知道如何最好地做到这一点?
在下面的示例中,(在一个线程中运行),我只是等待一段时间以确保任何网络内容完成。我等待ChangeObserver和MyDataObserver中的回调,但我什么都没得到。我也尝试过使用LoaderManager,但没有区别。我查看了Android快速搜索框的来源,但找不到任何线索。
SearchManager searchManager = (SearchManager)ProgDialog.this.getContext().getApplicationContext().getSystemService(Context.SEARCH_SERVICE);
List<SearchableInfo> searchables = searchManager.getSearchablesInGlobalSearch();
for(SearchableInfo si : searchables)
{
if(si.getSuggestPackage() == null) continue;
String query = title;
Uri.Builder uriBuilder = new Uri.Builder();
uriBuilder.authority(si.getSuggestAuthority());
uriBuilder.scheme(ContentResolver.SCHEME_CONTENT);
if(si.getSuggestPath() != null)
{
uriBuilder.appendEncodedPath(si.getSuggestPath());
}
uriBuilder.appendPath(SearchManager.SUGGEST_URI_PATH_QUERY);
// get the query selection, may be null
String selection = si.getSuggestSelection();
// inject query, either as selection args or inline
String[] selArgs = null;
if (selection != null) { // use selection if provided
selArgs = new String[] { query };
} else { // no selection, use REST pattern
uriBuilder.appendPath(query);
}
Uri uri = uriBuilder.build();
if(!canRead(uri))
{
continue;
}
c = context.getApplicationContext().getContentResolver().query(uri, null,
selection, selArgs, null);
if(c != null)
{
c.registerContentObserver(new ChangeObserver(c));
c.registerDataSetObserver(new MyDataSetObserver(si.getSuggestPackage(), c));
c.setNotificationUri(context.getContentResolver(), uri);
Thread.sleep(8000);
答案 0 :(得分:0)
我稍微调整了你的代码,现在它适用于我(对我来说)。请记住设置访问数据的权限(联系人,书签,...)。
if (searchableInfo.getSuggestPackage() == null)
continue;
Uri.Builder uriBuilder = new Uri.Builder();
uriBuilder.authority(searchableInfo.getSuggestAuthority());
uriBuilder.scheme(ContentResolver.SCHEME_CONTENT);
String path = searchableInfo.getSuggestPath();
if (path != null)
uriBuilder.appendEncodedPath(path);
else
uriBuilder.appendPath(SearchManager.SUGGEST_URI_PATH_QUERY);
// get the query selection, may be null
String selection = searchableInfo.getSuggestSelection();
// inject query, either as selection args or inline
String[] selArgs = null;
if (selection != null)
// use selection if provided
selArgs = new String[] { query };
else
// no selection, use REST pattern
uriBuilder.appendPath(query);
Uri uri = uriBuilder.build();