Не удается настроить изображение Google Glass Card с помощью файла URI
У меня проблемы с использованием карт из недавно выпущенного GDK. По сути, Card.addImage() может принимать только два аргумента: идентификатор ресурса или URI.
Для моего случая использования мне нужно открыть изображение, которое существует как файл, а не как ресурс. Поэтому для целей тестирования я включаю изображения в папку ресурсов. Попытка получить к ним доступ непосредственно из папки ресурсов не удалась, поэтому я копирую их оттуда во внутреннее хранилище. Как только они скопированы, я генерирую URI из файла и присваиваю его карте. Полученная карта показывает серый блок, где изображение должно быть.
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));
Трудно диагностировать, потому что я понятия не имею, что внутренне делает Карта.
2 ответа
Это очень странно, но мне удалось решить мою проблему. Я заменил код копии файла следующим, и он, кажется, решил мои проблемы
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);
}
Мне не понятно, почему / как я копировал весь свой apk, но я предполагаю, что это призыв к
getAssets().openFd(fileName).getFileDescriptor()
Возможно, он возвращал файловый дескриптор apk. Это странно, потому что я видел некоторые утверждения, что предыдущий метод работает.
Вместо того чтобы писать
new FileInputStream(getAssets().openFd(fileName).getFileDescriptor());
ты можешь попробовать
getAssets().openFd(fileName).createInputStream();
и посмотреть, работает ли это?
Чтобы ответить на ваш оригинальный вопрос, addImage
метод поддерживает resource:
а также file:
URIs.