Ошибка установки изображения 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));

Трудно диагностировать, потому что я понятия не имею, что делает карта внутри.


person csrussell    schedule 27.11.2013    source источник
comment
Ладно, это сводит меня с ума. Я изменил выходной каталог изображений на /sdcard/, чтобы видеть, правильно ли копируются изображения. Все они были огромными, и все одинакового размера, 103 МБ. По совпадению это тот же размер, что и мой APK (я упаковываю в него много контента для тестовых целей). Я открыл файл в 7zip, и это мой apk! Что тут происходит? Как я скопировал свое приложение?   -  person csrussell    schedule 28.11.2013


Ответы (2)


Вместо того, чтобы писать

new FileInputStream(getAssets().openFd(fileName).getFileDescriptor());

ты можешь попробовать

getAssets().openFd(fileName).createInputStream();

и посмотреть, работает ли это?

Чтобы ответить на ваш первоначальный вопрос, метод addImage поддерживает URI resource: и file:.

person Tony Allevato    schedule 28.11.2013
comment
Я действительно пробовал это, прежде чем увидел ваше предложение. Кажется, это помогает, хотя мне любопытно, что получение дескриптора файла актива возвращает дескриптор файла apk. На самом деле я видел, как я копировал файлы в качестве предлагаемого метода здесь: stackoverflow.com/questions/4447477/ - person csrussell; 28.11.2013

Это очень странно, но мне удалось решить свою проблему. Я заменил код копирования файла следующим, и это, похоже, решило мои проблемы.

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. Это странно, потому что я видел заявления о том, что предыдущий метод работает.

person csrussell    schedule 28.11.2013