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