2011-06-28 83 views
0

我正在創建一個用於顯示來自先前指定源的圖像的應用程序。如果版本文件已更改,我將下載這些圖像。如果沒有可用的互聯網連接,它將顯示我以前下載的本地圖像。Android ImageView:從本地文件生成可繪製對象失敗

對於這一點,我使用的是ImageView的和拖拉的對象是這樣的:

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

我三聯通過DDMS檢查發現指定的文件(在這種情況下,「page1.jpeg」)目錄確實存在「數據/數據/ out.path /文件/ image1.jpeg」。但是,在上面的代碼示例中,第二個命令返回一個空對象。該文件可以通過常規方式(流)讀取和寫入,但似乎ImageView不喜歡圖像。

我不知道如何從這裏開始。它可能是因爲我錯過了一個關鍵的安全元素,允許顯示圖像。或者,圖像可能無法顯示。是否有工具來檢查可顯示的圖像?

謝謝你的時間。

編輯1:我已經改變了代碼如下:

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

這成功地創建了可繪製對象。可悲的是,當通過SetImageDrawable()分配對象時,我的調試器發瘋,並且在我從未聽說過的類(最可能是某些Android內部版本)中讀取4個異常。我檢查了一個雙斜槓(因爲我複製到最後),但路徑看起來很乾淨。

編輯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:問題有點兒自己解決了。我重新創建了這個項目,複製了舊的源代碼,重新創建了虛擬機,然後突然生效。如果是舊項目或虛擬機,我無法確定。

回答

1

我認爲你必須使用完整路徑。

獲取路徑的安全方法是使用下面的:

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

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

祝你好運!

[編輯]:迴應你的編輯。你可以發佈logcat輸出嗎?

[編輯2]:請參閱下面的代碼,我將如何去做這件事。

+0

這是我原來的問題的解決方案,因此我將其標記爲解決方案。謝謝。 – 0xCAFEBABE

0

我不確定是否是這種情況(我們無法從您的代碼中看到值),但是您確定您使用的是完整路徑嗎?換句話說就是FILENAME_PRE =「image」或「/data/data/..../image」? 它應該是後者。 (記住你在評論中缺少的開頭的「/」)。

+0

。我不這樣做,因爲我在保存文件時沒有使用完整路徑。使用完整路徑應該是不安全的,因爲目錄結構可能會改變,不是嗎? – 0xCAFEBABE

+0

沒有。無論如何,你應該知道完整的路徑,一旦你知道它,它不會改變。而不是 - 當前工作目錄非常不穩定,我不會在這上面進行中繼(這是相對路徑正在做的事 - 爲當前工作目錄添加名稱)。我建議始終使用完整路徑(您可以根據Android存儲指南http://developer.android.com/guide/topics/data/data-storage.html獲取存儲文件的正確路徑),具體取決於您的文件應該存儲在SD carrd中,內部存儲在緩存中或永久存儲在您需要選擇的存儲中)。 –

0

以下是我認爲你應該做的:

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?

我不使用完整路徑