2011-06-28 15 views
0

私は以前に指定されたソースから画像を表示するためのアプリケーションを作成しています。バージョンファイルが変更された場合は、これらのイメージをダウンロードします。利用可能なインターネット接続がない場合、以前にダウンロードしたローカルイメージが表示されます。このため Android ImageView:ローカルファイルからDrawableオブジェクトを生成できない

は、私はこのようなImageViewのとDrawableのオブジェクトを使用しています:

私はトリプル(この場合は「page1.jpeg」で)指定されたファイルが実際にディレクトリに存在しないことをDDMS経由で確認
String imageName = Startseite.FILENAME_PRE + "1" + Startseite.FILENAME_POST; 
Drawable d = Drawable.createFromPath(imageName); 
mImageView.setImageDrawable(d); 

"data/data/out.path/files/image1.jpeg"と入力します。ただし、上記のコード例では、2番目のコマンドは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:悲しいことに、私はストリームから描画可能オブジェクトを作成し、あらかじめ画像をダウンロードしていない場合と同じことが起こります。

編集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だったなら、私は確かに言えません。

答えて

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

Nope。とにかくあなたは完全な道を知っていなければなりません。それを知ると変わらないでしょう。むしろ、現在の作業ディレクトリは非常に揮発性であり、私はこれをリレーしません(これは相対パスが実行しているもので、現在の作業ディレクトリに名前を追加しています)。私はいつも完全なパスを使用することをお勧めします(アンドロイドストレージガイドhttp://developer.android.com/guide/topics/data/data-storage.htmlに従ってファイルを保存する場所を適切に設定できます) SDカードに、内部で、キャッシュに保存するか、永続的に適切なストレージを選択する必要があります)。 –

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?

関連する問題