【问题标题】:How to query SearchProviders like android's QSB?如何查询像android的QSB这样的SearchProviders?
【发布时间】:2012-10-22 13:07:34
【问题描述】:

我正在尝试查询所有可用的搜索提供程序,类似于快速搜索框的方式,以获取搜索建议列表。我忽略了那些我没有阅读权限的人。现在,一切都适用于立即返回结果的提供者。

但是,对于那些离开并从网络上获得结果的人,我无法获得任何结果。其中之一的示例是 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);

【问题讨论】:

    标签: android android-contentprovider android-searchmanager


    【解决方案1】:

    我稍微修改了您的代码,现在它可以工作了(对我来说)。请记住设置访问数据(联系人、书签等)的权限。

            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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      相关资源
      最近更新 更多