2012-10-22 51 views
1

我試圖查詢所有可用的搜索提供程序,類似於快速搜索框的操作方式,以獲取搜索建議列表。我忽略了我沒有權限閱讀的內容。現在,一切都適用於立即返回結果的提供者。如何查詢類似android的QSB的SearchProviders?

但是,對於那些離開並從網絡獲得結果的人,我無法獲得任何結果。其中一個例子是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

我改編了一下你的代碼,現在它適用於我。請記住設置訪問數據的權限(聯繫人,書籤,...)。

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