Uso de una URL web para SUGGEST_COLUMN_ICON_1 para sugerencias de búsqueda

Tengo una configuración de SearchManager donde un desplegable de sugerencias se mostrará como los tipos de usuario. Los resultados son de mi servidor (http). Me gustaría mostrar un icono con cada opción (si el archivo de hecho existe).

Mirando los documentos, veo las opciones para la columna constante SUGGEST_COLUMN_ICON_1 permite estas opciones:

 Column name for suggestions cursor. Optional. If your cursor includes this column, then all suggestions will be provided in a format that includes space for two small icons, one at the left and one at the right of each suggestion. The data in the column must be a resource ID of a drawable, or a URI in one of the following formats: content (SCHEME_CONTENT) android.resource (SCHEME_ANDROID_RESOURCE) file (SCHEME_FILE) 

Todo lo que tengo es una URL. ¿Qué opción funcionaría mejor para mí?

Aquí está la class en la que estoy haciendo esto:

 public class MyCustomSuggestionProvider extends SearchRecentSuggestionsProvider { public static final String AUTHORITY = "---.MyCustomSuggestionProvider"; public static final int MODE = DATABASE_MODE_QUERIES; private final static String[] COLUMN_NAMES = {BaseColumns._ID, SearchManager.SUGGEST_COLUMN_TEXT_1, SearchManager.SUGGEST_COLUMN_TEXT_2, SearchManager.SUGGEST_COLUMN_QUERY, SearchManager.SUGGEST_COLUMN_INTENT_DATA, SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA, SearchManager.SUGGEST_COLUMN_ICON_1, SearchManager.SUGGEST_COLUMN_INTENT_ACTION}; public MyCustomSuggestionProvider() { setupSuggestions(AUTHORITY, MODE); } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Cursor recentCursor = super.query(uri, projection, selection, selectionArgs, sortOrder); String query = selectionArgs[0]; if (query == null || query.length() < 3) { return recentCursor; } final MatrixCursor customCursor = new MatrixCursor(COLUMN_NAMES); // Get web results from Retrofit Library List<TheProfile> suggestions = RestClient.get().getCustomSearch(query, MyApp.getUserId()); for (TheProfile suggestion : suggestions) { Uri searchIconUri = Uri.parse("http:/---/profile_images/" + String.valueOf(suggestion.id) + ".png"); try { customCursor.addRow(new Object[]{ suggestion.id, suggestion.profile, suggestion.subcategory, suggestion.profile, suggestion.profile, suggestion.subcategory, searchIconUri, "android.intent.action.SEARCH"}); } catch (Exception e) { e.printStackTrace(); } } return customCursor; } } 

Para aquellos, que sigue buscando la respuesta para esta pregunta, como lo hice. Es bastante similar a mi código, así que decidí compartirlo. Pasé horas juntando todo esto. Tal vez, ahorraré tiempo para alguien. En primer lugar, necesitará la biblioteca Glide .

Añadirlo al archivo build.gradle de su aplicación:

 repositories { mavenCentral() // jcenter() works as well because it pulls from Maven Central } dependencies { compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.android.support:support-v4:19.1.0' } 

Ahora vamos a hacer algunos cambios en el código de la pregunta (en la clase MyCustomSuggestionProvider ): Póngalo dentro de su for (TheProfile suggestion : suggestions) {

 FutureTarget<File> futureTarget = Glide .with(getContext().getApplicationContext()) .load(searchIcon) .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL); File cacheFile = futureTarget.get(); Uri searchIconUri = Uri.fromFile(cacheFile); 

Preste atención a esta línea de código: .with(getContext().getApplicationContext()) Eso es muy importante para obtener Contexto de la Aplicación, no sólo Contexto, ya que no vamos a mostrar bmp en ImageView. Documentación oficial de Glide para este tipo de uso de Glide.

Y después de todo puede llamar:

 // do things with bitmap and then release when finished: Glide.clear(futureTarget); 
  1. Recoge todos los archivos que vas a usar como iconos. Probablemente están en su servidor; Necesita integrarlos en su aplicación.

  2. Si no están en el formato .PNG, convertirlos al formato .PNG. Escala al tamaño que necesitas para mostrar en tu aplicación.

  3. Añádalos a su proyecto de Android en la carpeta / res / drawable-mdpi. Ponerlos en la carpeta específica de mdpi los escalará en el mismo tamaño en diferentes resoluciones de dispositivo.

  4. La primera parte del código para los iconos es tener URIs para devolver para SearchManager . Utilice el esquema "android.resource" en el formato:

     android.resource://<package-name>/<resource-type>/<resource-name> 

    Por ejemplo, puede crear un final URI para cada icono. He aquí un ejemplo de un URI que usé en mi proyecto para /res/drawable-mdpi/ic_autocomplete_1.png :

     private final Uri searchIconUri = Uri.parse("android.resource://com.mycompany.android/drawable/ic_autocomplete_1"); 
  5. A medida que realiza un bucle a través de sus sugerencias, determine qué icono es necesario, por ejemplo, con una instrucción switch , y coloque ese URI en el objeto de fila, tal y como aparece en su código.

  • Android FileNotFoundException obtener arrojado de URL.openStream ()
  • Android: Ir al URL de HTTP en el botón de clic
  • Picasso no funciona si url contiene espacio
  • Java, android, resolver un url, obtener redireccionado uri
  • ¿No pudo abrir la aplicación linkedIn con el perfil de la empresa (url) por otra aplicación android?
  • Ekito Simple KML leer la fuente
  • ¿Está el intento de compartir facebook en Android todavía roto?
  • Enviar URL a través de NFC para ser abierto por el navegador
  • ¿Cómo puedo obtener una vista previa de una página URL en Android?
  • Cómo almacenar datos desde un archivo XML a una base de datos SQLite en android
  • ¿Cómo puedo crear una aplicación en la que puedo "compartir" una URL en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.