La configuración de la imagen de Google Glass Card con el URI del archivo falla
Frecuentes
Visto 467 veces
1
Tengo problemas para usar las Tarjetas del GDK lanzado recientemente. Básicamente, Card.addImage() solo puede tomar dos argumentos, una identificación de recurso o un URI.
Para mi caso de uso, necesito abrir una imagen que existe como archivo, no directamente como recurso. Entonces, para fines de prueba, incluyo las imágenes en la carpeta de activos. Intentar acceder a ellos directamente desde la carpeta de activos falla, así que los estoy copiando desde allí al almacenamiento interno. Una vez que se copian, genero un URI a partir del archivo y lo asigno a la tarjeta. La tarjeta resultante muestra un bloque gris donde debería estar la imagen.
String fileName = step.attachment; //of the form, "folder1/images/image1.jpg"
File outFile = new File(getFilesDir()+File.separator+fileName);
FileChannel inputChannel = null;
FileChannel outputChannel = null;
try {
//check to see if the file has already been cached in internal storage before copying
if(!outFile.exists()) {
FileInputStream inputStream = new FileInputStream(getAssets().openFd(fileName).getFileDescriptor());
FileOutputStream outputStream = openFileOutput(fileName, Context.MODE_PRIVATE);
inputChannel = inputStream.getChannel();
outputChannel = outputStream.getChannel();
outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
try {
if(inputChannel!=null)
inputChannel.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(outputChannel!=null)
outputChannel.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
card.addImage(Uri.fromFile(outFile));
Es difícil de diagnosticar porque no tengo ni idea de lo que está haciendo la tarjeta internamente.
2 Respuestas
0
En lugar de escribir
new FileInputStream(getAssets().openFd(fileName).getFileDescriptor());
puedes intentar
getAssets().openFd(fileName).createInputStream();
y ver si funciona?
Para responder a su pregunta original, el addImage
soportes de método resource:
y file:
URI.
respondido 28 nov., 13:00
De hecho, probé esto antes de ver tu sugerencia. Esto parece funcionar, aunque me parece curioso que obtener el descriptor de archivo de un activo devuelva el descriptor de archivo del apk. De hecho, había visto la forma en que estaba copiando los archivos como un método sugerido aquí: stackoverflow.com/questions/4447477/… - csrussell
0
Esto es muy extraño, pero logré resolver mi problema. Reemplacé el código de copia de archivo con el siguiente y parece haber resuelto mis problemas
InputStream in = null;
OutputStream out = null;
try {
in = getAssets().open(step.attachment);
out = new FileOutputStream(outFile);
byte[] buffer = new byte[1024];
int read;
while((read = in.read(buffer)) != -1){
out.write(buffer, 0, read);
}
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch(IOException e) {
Log.e("tag", "Failed to copy asset file: " + step.attachment, e);
}
No tengo claro por qué / cómo estaba copiando mi apk completo, pero supongo que es la llamada a
getAssets().openFd(fileName).getFileDescriptor()
Quizás estaba devolviendo el descriptor de archivo del apk. Es extraño porque he visto algunas afirmaciones de que el método anterior funciona.
respondido 28 nov., 13:15
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas android google-glass google-gdk or haz tu propia pregunta.
Ok, esto me está volviendo loco. Cambié el directorio de salida de las imágenes a /sdcard/ para poder ver si las imágenes se estaban copiando correctamente. Todos eran enormes y todos del mismo tamaño, 103 MB. Coincidentemente, tiene el mismo tamaño que mi APK (estoy empaquetando una gran cantidad de contenido para fines de prueba). ¡Abrí el archivo en 7zip, y es mi apk! ¿Que está pasando aqui? ¿Cómo copié mi solicitud? - csrussell