Android ImageView:从本地文件生成Drawable对象失败

时间:2011-06-28 07:21:03

标签: android imageview

我正在创建一个用于显示先前指定源的图像的应用程序。如果版本文件已更改,我将下载这些图像。如果没有可用的互联网连接,它将显示我之前下载的本地图像。

为此,我使用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”目录中。但是,在上面的代码示例中,第二个命令返回一个null对象。该文件可通过常规方法(流)读写,但似乎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:遗憾的是,当我从流中创建drawable而不是事先下载图像时也会发生同样的情况。

编辑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,突然它起作用了。如果它是旧项目或VM,我不能肯定地说。

3 个答案:

答案 0 :(得分:1)

我认为你必须使用完整的路径。

获取路径的安全方法是使用以下内容:

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

 String dir = context.getFilesDir().getPath();
祝你好运!

[编辑]:响应您的修改。你可以发一个logcat输出吗?

[编辑2] :请参阅下文,了解我将如何解决这个问题。

答案 1 :(得分:1)

以下是我认为你应该做的事情:

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));

让我知道它是否有效。

参考: Show Image View from file path?

答案 2 :(得分:0)

我不确定是否是这种情况(我们无法查看代码中的值),但您确定使用的是完整路径吗?换句话说,FILENAME_PRE =“image”或“/ data / data /.... / image”? 它应该是后者。 (请注意您在评论中缺少的“/”)。