¿Cómo consigo un Uri para una imagen en mis Activos que funcionará para la columna SearchManager.SUGGEST_COLUMN_ICON_1?
He integrado con éxito la búsqueda de países de mi aplicación en el servicio de búsqueda global y ahora estoy tratando de mostrar la bandera de cada país junto a las sugerencias de búsqueda. La búsqueda dentro de mi aplicación funciona de esta manera, pero por supuesto tengo el control de la lista y su punto de vista vinculante. Así que sé que todas las banderas están ahí y puedo usarlas en el resto de mi aplicación.
El problema surge cuando intento suministrar un Uri a un archivo .gif en mis Activos. De acuerdo con la documentación de búsqueda, el valor de la columna con la claveSearchManager.SUGGEST_COLUMN_ICON_1
debería ser un Uri para la imagen.
A continuación se muestra cómo se ve el código. En respuesta a laContentProvider
métodopublic Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
Estoy creando unMatrixCursor
que asigna columnas de la base de datos de mi país a las requeridas por el servicio de búsqueda. Los nombres de los países aparecen bien y puedo seleccionarlos y responder correctamente en mi solicitud.
He intentado formar el Uri de tres maneras diferentes:
// String flagUri = "file:///android_asset/" + flagPath;
// String flagUri = "file:///assets/" + flagPath;
String flagUri = "android.resource://com.lesliesoftware.worldinfo.WorldInfoActivity/assets/" + flagPath;
columnValues.add (flagUri);
Todos conducen a lo mismo: el icono de mi aplicación junto a cada sugerencia que puedo obtener al usar un valor de cadena vacía.
¿Hay un Uri que funcione? ¿Cómo puedo obtener el ícono de la bandera del país junto a las sugerencias de búsqueda?
Gracias Ian
La fuente completa:
private Cursor search (String query, int limit) {
query = query.toLowerCase ();
String[] requestedColumns = new String[] {
BaseColumns._ID,
SearchManager.SUGGEST_COLUMN_TEXT_1,
SearchManager.SUGGEST_COLUMN_ICON_1,
};
String[] queryColumns = new String[] {
WorldInfoDatabaseAdapter.KEY_ROWID,
WorldInfoDatabaseAdapter.KEY_COUNTRYNAME,
WorldInfoDatabaseAdapter.KEY_COUNTRYCODE
};
return packageResults (query, requestedColumns, queryColumns, limit);
}
private Cursor packageResults (String query, String[] requestedColumns, String[] queryMappedColumns, int limit) {
if (requestedColumns.length != queryMappedColumns.length)
throw new IllegalArgumentException ("Internal error: requested columns do not map to query columns");
MatrixCursor results = new MatrixCursor (requestedColumns);
// Query the country list returns columns: KEY_ROWID, KEY_COUNTRYNAME, KEY_COUNTRYCODE
Cursor dbResults = myDbHelper.getCountryList (query);
// Verify that the query columns are available
for (int index = 0; index < queryMappedColumns.length; index++) {
int col = dbResults.getColumnIndex (queryMappedColumns[index]);
if (col == -1)
throw new IllegalArgumentException ("Internal error: requested column '" +
queryMappedColumns[index] + "' was not returned from the database.");
}
// Loop over the database results building up the requested results
int rowCount = 0;
while (dbResults.moveToNext () && rowCount < limit) {
Vector<String> columnValues = new Vector<String> ();
for (int index = 0; index < requestedColumns.length; index++) {
if (requestedColumns[index].compareTo (SearchManager.SUGGEST_COLUMN_ICON_1) == 0) {
String flagPath = "flags/small/" + dbResults.getString (
dbResults.getColumnIndexOrThrow (queryMappedColumns[index]))
+ "-flag.gif";
// String flagUri = "file:///android_asset/" + flagPath;
// String flagUri = "file:///assets/" + flagPath;
String flagUri = "android.resource://com.lesliesoftware.worldinfo.WorldInfoActivity/assets/" + flagPath;
columnValues.add (flagUri);
} else {
// Add the mapped query column values from the database
String colValue = dbResults.getString (dbResults.getColumnIndexOrThrow (queryMappedColumns[index]));
columnValues.add (colValue);
}
}
results.addRow (columnValues);
rowCount++;
}
return results;
}
EDITAR: He intentado otras variaciones, como mover las imágenes de los activos a la carpeta sin formato. Nada funcionó. Aquí están los uri que probé:
flagUriStr = "android.resource://com.lesliesoftware.worldinfo/raw/flags/small/" +
countryCode + "-flag.gif";
flagUriStr = "android.resource://com.lesliesoftware.worldinfo/assets/flags/small/" +
countryCode + "-flag.gif";
flagUriStr = "android.resource://com.lesliesoftware.worldinfo/assets/flags/small/" +
countryCode + "-flag";
flagUriStr = "android.resource://com.lesliesoftware.worldinfo/raw/" +
countryCode + "-flag.gif";
flagUriStr = "android.resource://com.lesliesoftware.worldinfo/raw/" +
countryCode + "-flag";
La única uri que funcionó fue si moví un indicador de prueba a mi carpeta dibujable:
flagUriStr = "android.resource://com.lesliesoftware.worldinfo/" +
R.drawable.small_ca_flag;