0

私は自分自身SearchRecentSuggestionsProviderを実装していますが、1 つのことを除いてすべてが機能しています。結果のアイコンを表示するデバイス検索を取得できません。/{sdcard}/Android/data/package_name/files/アプリケーションのデータ フォルダ (にある)から画像を表示したい

ドキュメントによると、それは を使用して達成可能でSearchManager.SUGGEST_COLUMN_ICON_1あり、 を含む多くのスキームをサポートしているようContentResolver.SCHEME_FILEですfile。以下は公式ドキュメントからの引用です。

候補カーソルの列名。オプション。カーソルにこの列が含まれている場合、すべての提案は、各提案の左側と右側に 1 つずつ、2 つの小さなアイコン用のスペースを含む形式で提供されます。列のデータは、ドローアブルのリソース ID、または次のいずれかの形式の URI である必要があります。

内容 ( SCHEME_CONTENT)

android.resource ( SCHEME_ANDROID_RESOURCE)

ファイル ( SCHEME_FILE)

ファイル URI の手動作成やUri.Builder(). これはどれもうまくいきませんでした。

また、他の誰かが Google グループで同じことについて質問しているのを見つけましたが、残念ながら回答がありません: https://groups.google.com/forum/#!topic/android-developers/MJj7GIaONjc

デバイス検索でデバイスからローカル画像を表示する経験がある人はいますか?

更新 (12 月 15 日):ContentProvider検索可能な情報としてa を使用してみましたがSearchView、カバー アート画像を含め、期待どおりに動作します。それでも、グローバル検索では表示されません...

4

2 に答える 2

3

同様の問題があり、他のソリューションを機能させることができませんでした。最後に、カーソルを、query() で必要なデータを含む新しいカーソルに置き換えました。

public class RecentQueriesProvider extends SearchRecentSuggestionsProvider {
    public final static String AUTHORITY = "com.package.RecentQueriesProvider";
    public final static int MODE = DATABASE_MODE_QUERIES;

    public RecentQueriesProvider() {
        setupSuggestions(AUTHORITY, MODE);
    }

    // We override query() to replace the history icon in the recent searches suggestions. We create a new cursor
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        Cursor superCursor = super.query(uri, projection, selection, selectionArgs, sortOrder);
        Uri iconUri = Uri.parse("android.resource://" + getContext().getPackageName() + "/drawable/ic_action_time");
        MatrixCursor newCursor = new MatrixCursor(superCursor.getColumnNames());
        superCursor.moveToFirst();
        while (superCursor.moveToNext()){
            newCursor.addRow(new Object[]{
                    superCursor.getInt(superCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_FORMAT)),
                    iconUri,
                    superCursor.getString(superCursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1)),
                    superCursor.getString(superCursor.getColumnIndex("suggest_intent_query")),
                    superCursor.getInt(superCursor.getColumnIndex("_id"))
            });
        }
       return newCursor;
    }
}
于 2014-05-16T14:52:53.167 に答える
2

1 つの方法は、ソース コードを からコピーしandroid.content.SearchRecentSuggestionsProvider、ContentProvider を拡張するクラスに配置して、setupSuggestions(String, int). 具体的には、次のように変更します。

Uri uriFile = Uri.fromFile(new File("path/to/file"));

mSuggestionProjection = new String [] {
        "0 AS " + SearchManager.SUGGEST_COLUMN_FORMAT,

        // Here, you would return a file uri: 'uriFile'
        "'android.resource://system/"
                + com.android.internal.R.drawable.ic_menu_recent_history + "' AS "
                        + SearchManager.SUGGEST_COLUMN_ICON_1,
        "display1 AS " + SearchManager.SUGGEST_COLUMN_TEXT_1,
        "query AS " + SearchManager.SUGGEST_COLUMN_QUERY,
        "_id"
};

私は次のことを好みます。メソッドを拡張SearchRecentSuggestionsProviderしてオーバーライドしますquery(...)SearchManager.SUGGEST_URI_PATH_QUERYここでは、カーソルをインターセプトして返します。

public class SearchSuggestionProvider extends SearchRecentSuggestionsProvider {

    private UriMatcher matcher;

    private static final int URI_MATCH_SUGGEST = 1;

    public SearchSuggestionProvider() {
        super();

        matcher = new UriMatcher(UriMatcher.NO_MATCH);

        // Add uri to return URI_MATCH_SUGGEST
        matcher.addURI(SearchSuggestionProvider.class.getName(), 
                         SearchManager.SUGGEST_URI_PATH_QUERY, URI_MATCH_SUGGEST);

        setupSuggestions(SearchSuggestionProvider.class.getName(), 
                                                           DATABASE_MODE_QUERIES);
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, 
                                      String[] selectionArgs, String sortOrder) {

        // special case for actual suggestions (from search manager)
        if (matcher.match(uri) == URI_MATCH_SUGGEST) {

            // File to use
            File f = new File("/path/to/file");

            Uri uriFile = Uri.fromFile(f);

            final String[] PROJECTION = new String[] {
                "_id", 
                "display1 AS " + SearchManager.SUGGEST_COLUMN_TEXT_1,                
                "query AS " + SearchManager.SUGGEST_COLUMN_QUERY,
                "'" + uriFile + "'" + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1,
            };

            final Uri URI = Uri.parse("content://" + 
                        SearchSuggestionProvider.class.getName() + "/suggestions");

            // return cursor
            return getContext().getContentResolver().query(
                URI, 
                PROJECTION, 
                "display1 LIKE ?", 
                new String[] {selectionArgs[0] + "%"}, 
                "date DESC");          
        }

        // Let super method handle the query if the check fails
        return super.query(uri, projection, selection, selectionArgs, sortOrder);
    }
}
于 2013-11-16T18:15:47.667 に答える