Android-universal-image-loader: ファイルURI画像の読み込みの問題のデコード/エンコード

作成日 2013年02月25日  ·  18コメント  ·  ソース: nostra13/Android-Universal-Image-Loader

画像ファイルの場合:/storage/sdcard0/groupurchase/cache/http%3A%2F%2Fd2.lashouimg.com%2Fzt_mobile_220%2F201211%2F29%2F135417696321262100.jpg

imageLoaderは、正しくないデコードされたファイルパスを読み込もうとします。

02-25 13:20:51.085: E/ImageLoader(27155): java.io.FileNotFoundException: /storage/sdcard0/groupurchase/cache/http:/d2.lashouimg.com/zt_mobile_220/201211/29/135417696321262100.jpg: open failed: ENOENT (No such file or directory)

エンコードされた文字列をそのまま保持し、ストリームで読み取る必要があります。

この問題は、以下のイメージローダーコードが原因で発生します。

final class ImageLoadingInfo {
...
    public ImageLoadingInfo(String uri, ImageView imageView, ImageSize targetSize, DisplayImageOptions options, ImageLoadingListener listener, ReentrantLock loadFromUriLock) {
        this.uri = Uri.encode(uri, "@#&=*+-_.,:!?()/~'%");
        ...
    }
}
Bug

全てのコメント18件

いいえ、これは問題の理由ではありません。 実際、デバッグで問題を見つけることができません。
ファイルが本当に存在しますか?

はい。 ファイルが存在します...
電話4.2.1、GT-I9100、CyanogenMod

もう一つの例:

渡される値

coverPhotoFilePath:/storage/sdcard0/picasa_tool/google%252520plus-1.jpg

ローダーによってスローされた例外:

03-01 09:40:21.880:E / ImageLoader(13598):/ storage / sdcard0 / picasa_tool / google%2520plus-1.jpg:オープンに失敗しました:ENOENT(そのようなファイルまたはディレクトリはありません)
03-01 09:40:21.880:E / ImageLoader(13598):java.io.FileNotFoundException:/storage/sdcard0/picasa_tool/google%2520plus-1.jpg:開くことができませんでした:ENOENT(そのようなファイルまたはディレクトリはありません)

adbシェルls

shell @ android :/ storage / sdcard0 / picasa_tool $ ls goo *
ls goo *
google%252520plus-1.jpg

結果

「25」はimageloaderによって削除されました。
google%252520plus-1.jpg-> google%2520plus-1.jpg

修正してみます。

あなたの変更があってもまだこの問題を抱えています、私はCM10 4.2.2(Samsung Vibrant)にもいます。

スナップショットjarを使用していますか?

私はいつもzipを取得して、自分でlibを作成します。

displayImage(...)メソッドに渡すファイルの設定、表示オプション、URIを教えてください。

        //Config ImageLoader
        DisplayImageOptions.Builder lBuilder = new DisplayImageOptions.Builder();
        lBuilder.showStubImage(R.drawable.ic_launcher);
        lBuilder.bitmapConfig(Integer.parseInt(mPrefs.getString(PrefsActivity.KEY_APP_BITMAP_TYPE, "0")) == 0 ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);

        if (mPrefs.getBoolean(
                PrefsActivity.KEY_APP_MEMCACHE_ENABLED_PREFERENCE, true))
            lBuilder.cacheInMemory();
        if (mPrefs.getBoolean(
                PrefsActivity.KEY_APP_DISCCACHE_ENABLED_PREFERENCE, true))
            lBuilder.cacheOnDisc();

        mDisplayOptions = lBuilder.build();

        // Create configuration for ImageLoader
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
        .discCache(new UnlimitedDiscCache(StorageHelper.getCacheDir()))
        .threadPoolSize(5)
        .threadPriority(Thread.NORM_PRIORITY-1)
        .defaultDisplayImageOptions(mDisplayOptions)
        .build(); // --

        mImageLoader.init(config);
String lCoverURL = "file:///"+ lCoverFile.getAbsolutePath();

URI = file://// storage / sdcard0 / My Manga Reader / Naruto / cover.png
エラー

03-10 12:24:43.448: E/ImageLoader(5349): /storage/sdcard0/My%20Manga%20Reader/Cache/1526703973: open failed: ENOENT (No such file or directory)
03-10 12:24:43.448: E/ImageLoader(5349): java.io.FileNotFoundException: /storage/sdcard0/My%20Manga%20Reader/Cache/1526703973: open failed: ENOENT (No such file or directory)
03-10 12:24:43.448: E/ImageLoader(5349):    at libcore.io.IoBridge.open(IoBridge.java:416)
03-10 12:24:43.448: E/ImageLoader(5349):    at java.io.FileInputStream.<init>(FileInputStream.java:78)
03-10 12:24:43.448: E/ImageLoader(5349):    at java.io.FileInputStream.<init>(FileInputStream.java:105)
03-10 12:24:43.448: E/ImageLoader(5349):    at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStreamFromFile(BaseImageDownloader.java:141)

はい、問題が発生したので、解決策を考えます。 APIの変更にはImageDownloaderが必要だと思いますが、本当に避けたいと思います。

現時点では、ファイルパスにスペース( "")を使用しないことをお勧めします。

セルゲイに感謝します。今は1.8.0を使用します。ご迷惑をおかけして申し訳ありません。
2013年3月10日15:22、「SergeyTarasevich」 [email protected]
書きました:

はい、問題が発生したので、解決策を考えます。 私は推測する
ImageDownloaderはAPIの変更に必要ですが、私は本当にそれを避けたいと思っています。

現時点では、スペース( "")を使用しないことをお勧めします。
ファイルパス。


このメールに直接返信するか、Gi tHubhttps://github.com/nostra13/Android-Universal-Image-Loader/issues/179#issuecomment-14687267で表示してください

実際、これは(完全に)修正されていません。 1.9.3を使用していますが、空白(%20)を含むディレクトリからSDカードから画像をロードすると、上記のエラーが発生します。

そして、どのURI文字列をImageLoaderに渡しますか?

/sdcard/Android/data/my.package/files/Pictures/directory%20taining%20whitespaces/some_image.jpg

「/sdcard/Android/data/my.package/files/Pictures/directoryintainingwhitespaces/some_image.jpg」を渡す必要があります

そういうわけで、URIからStringに変更しました...
Uriを使用したオーバーロードされたコンストラクターは素晴らしいでしょう。 Uri.toString()を使用したためにエラーが発生しました。これにより、空白の代わりに空白に%20が返されます。 または、%20(およびその他)が機能しないことに言及する必要があります(すでにどこかに記載されていますか?)

空白を%20に置き換えることは、私にとっては問題なく機能しています

%20をスペース置き換えると正常に機能します。

String strUri = uri.toString();
strUri = strUri.replace("%20", " ");
このページは役に立ちましたか?
0 / 5 - 0 評価