Android ImageView: не удается создать Drawable объект из локального файла - PullRequest
1 голос
/ 28 июня 2011

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

Для этого я использую объекты ImageView и Drawable, например:

String imageName = Startseite.FILENAME_PRE + "1" + Startseite.FILENAME_POST;
Drawable d = Drawable.createFromPath(imageName);
mImageView.setImageDrawable(d);

Я тройнойпроверил через DDMS, что указанный файл (в данном случае «page1.jpeg») действительно существует в каталоге «data / data / out.path / files / image1.jpeg».Однако в приведенном выше примере кода вторая команда возвращает нулевой объект.Файл доступен для чтения и записи обычными средствами (потоками), но, похоже, ImageView не нравится изображение.

Я не уверен, как действовать дальше.Возможно, я упустил важный элемент безопасности, который позволяет отображать изображения.Или, может быть, изображение не может быть отображено.Есть ли инструмент для проверки отображаемых изображений?

Спасибо за ваше время.

Редактировать 1: Я изменил код на это:

String imageName = Startseite.FILENAME_PRE + "1" + Startseite.FILENAME_POST;
String imageNameWithPath = getApplicationContext().getFilesDir().getPath() + '/' + imageName;
Drawable d = Drawable.createFromPath(imageNameWithPath);

Это создаетDrawable объект успешно.К сожалению, при назначении объекта с помощью SetImageDrawable () мой отладчик сходит с ума и читает 4 исключения в классах, о которых я никогда не слышал (скорее всего, в некоторой версии Android).Я проверил двойную косую черту (потому что я копирую одну в конец), но путь выглядит чистым.

Редактировать 2: К сожалению, то же самое происходит, когда я создаю нарисованный из потока и не загружаю изображениезаранее.

Редактировать 3: Вот фрагмент кода LogCat, когда приложение не работает.

06-28 08:14:32.323: WARN/dalvikvm(21462): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
06-28 08:14:32.323: ERROR/AndroidRuntime(21462): Uncaught handler: thread main exiting due to uncaught exception
06-28 08:14:32.343: ERROR/AndroidRuntime(21462): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.ourcompany.apps/de.ourcompany.apps.Startseite}: java.lang.NullPointerException
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     at android.os.Looper.loop(Looper.java:123)
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     at android.app.ActivityThread.main(ActivityThread.java:4363)
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     at java.lang.reflect.Method.invokeNative(Native Method)
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     at java.lang.reflect.Method.invoke(Method.java:521)
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     at dalvik.system.NativeStart.main(Native Method)
06-28 08:14:32.343: ERROR/AndroidRuntime(21462): Caused by: java.lang.NullPointerException
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     at de.ourcompany.apps.Startseite.displayImages(Startseite.java:61)
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     at de.ourcompany.apps.Startseite.onCreate(Startseite.java:42)
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
06-28 08:14:32.343: ERROR/AndroidRuntime(21462):     ... 11 more
06-28 08:14:32.373: INFO/Process(64): Sending signal. PID: 21462 SIG: 3
06-28 08:14:32.373: INFO/dalvikvm(21462): threadid=7: reacting to signal 3
06-28 08:14:32.373: ERROR/dalvikvm(21462): Unable to open stack trace file '/data/anr/traces.txt': Permission denied

Я попробовал версию, используя метод BitmapFactory.decode (), к сожалению, это приводит к исключениюа также.

Что я могу добавить: следующий код взят из видеоуроков:

    String mUrlString = "http://www.android.com/images/gingerdroid.png";
    try {
        mImageView.setImageDrawable(
            Drawable.createFromStream(
                    (InputStream) new URL(mUrlString).getContent(), 
                    "qrcode")
        );
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Этот код работает в учебнике, но он точно так же завершает работу с точно таким же изображениемчто мои попытки делают до сих пор.

Надеюсь, что это помогает.

Редактировать 4: Проблема вроде бы разрешилась сама собой.Я создал проект заново, copypastad старый источник, создал VM заново, вдруг он работает.Если это был старый проект или виртуальная машина, точно сказать не могу.

Ответы [ 3 ]

1 голос
/ 28 июня 2011

Я думаю, вы должны использовать полный путь.

Безопасный способ получить путь - использовать следующее:

 Context context = getApplicationContext(); // or other way of getting current context

 String dir = context.getFilesDir().getPath();

Удачи!

[РЕДАКТИРОВАТЬ]: В ответ на ваши изменения. Можете ли вы опубликовать вывод logcat?

[РЕДАКТИРОВАТЬ 2]: См. Ниже код для того, как мне поступить об этом.

1 голос
/ 28 июня 2011

Вот что я думаю вам следует сделать:

String imageName = Startseite.FILENAME_PRE + "1" + Startseite.FILENAME_POST;
String imageNameWithPath = getApplicationContext().getFilesDir().getPath() + '/' + imageName;
File img = new File(imageNameWithPath);
mImageView.setImageBitmap(BitmapFactory.decodeFile(img));

Дайте мне знать, если это работает.

Ссылка: Показать представление изображения из пути к файлу?

0 голосов
/ 28 июня 2011

Я не уверен, так ли это (мы не можем видеть значения из вашего кода), но вы уверены, что используете полный путь?Другими словами, FILENAME_PRE = "изображение" или "/data/data/..../image"?Должно быть последнее.(обратите внимание на «/» в начале, которое вы пропустили в своем комментарии).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...