Не удается настроить изображение 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.

Другие вопросы по тегам