1

検索候補のリストを取得するために、クイック検索ボックスと同様に、利用可能なすべての検索プロバイダーを照会しようとしています。読み取り権限がないものは無視します。これで、結果をすぐに返すプロバイダーに対してすべてが機能します。

しかし、離れて Web から結果を取得するものについては、結果を取得できません。これらの 1 つの例は、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);
4

1 に答える 1

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();
于 2013-02-05T16:50:10.467 に答える