-1

編集:アセットフォルダーから画像を追加する機能が以前のリリースでは利用できなかったため、UILライブラリを1.8.0に更新することでこの問題を解決しました。私はそれを逃しました。

UniversalImageLoaderライブラリを使用してListViewに画像のリストを表示しています

画像が存在しない場合は、ドローアブルフォルダまたはアセットフォルダのいずれかからプレースホルダーをロードしたいと思います。

ライブラリドキュメントでは、これは受け入れられるURIです。

 String imageUri = "assets://image.png"; // from assets
 String imageUri = "drawable://" + R.drawable.image; // from drawables

ただし、いずれかのオプションを使用すると、java.lang.NullPointerException

画像を読み込むonResumeメソッドは次のとおりです。

@Override
public void onResume() {
    super.onResume();

    //open connection to db
    db = new DBAdapter(this);
    db.open();

    // get all defects for this unit
    defectList = db.getAllDefectsByUnit(unit_id);
    // create an array adapter and let it to display our row
    defects = new SimpleCursorAdapter(this, R.layout.defect_row, defectList, new String[] { "defect", "image_path" }, new int[] { R.id.defect, R.id.image }, 0);

    //set custom view using ViewBinder
    SimpleCursorAdapter.ViewBinder binder = new SimpleCursorAdapter.ViewBinder() {
        @Override
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {

            //int placeholder_id = getResources().getIdentifier("placeholder", "drawable", getPackageName());

            //get column name
            String name = cursor.getColumnName(columnIndex);

            //for the thumbnail column,if we have an image replace the placeholder
            if ("image_path".equals(name)) {

                ImageView image = (ImageView) view.findViewById(R.id.image);
                //Bitmap thumbnail;
                String image_path = cursor.getString(columnIndex);

                Log.i("image_path ->", image_path);

                if (!image_path.equalsIgnoreCase("")) {

                    // Load and display image asynchronously
                    imageLoader.displayImage(file_prefix + image_path, image);

                } else {

                    String imageUri = "drawable://" + R.drawable.placeholder; // drawable
                    //image.setImageResource(placeholder_id);

                    // Load and display image asynchronously
                    imageLoader.displayImage(imageUri, image);

                }

                return true;

            }

            //for the defect column, just add the text to the view
            if ("defect".equals(name)) {

                String defect_text = cursor.getString(columnIndex);

                TextView defect_holder = (TextView) view.findViewById(R.id.defect);
                defect_holder.setText(defect_text);

                return true;
            }

            return false;
        }
    };

    defects.setViewBinder(binder);

    setListAdapter(defects);

}//onResume

ファイルからの読み込みは問題ありません。

一般的なAndroidの方法を使用してプレースホルダー画像を読み込もうとした場合:

int placeholder_id = getResources().getIdentifier("placeholder", "drawable", getPackageName());
image.setImageResource(placeholder_id);

その後、画像は正常に読み込まれます(ここで別の問題が発生した場合でも)

ログは次のとおりです。

 `03-07 15:58:07.141: E/ImageLoader(22950): null
 03-07 15:58:07.141: E/ImageLoader(22950): java.lang.NullPointerException
 03-07 15:58:07.141: E/ImageLoader(22950):  at com.nostra13.universalimageloader.core.ImageDecoder.computeImageScale(ImageDecoder.java:121)
 03-07 15:58:07.141: E/ImageLoader(22950):  at com.nostra13.universalimageloader.core.ImageDecoder.getBitmapOptionsForImageDecoding(ImageDecoder.java:104)
 03-07 15:58:07.141: E/ImageLoader(22950):  at com.nostra13.universalimageloader.core.ImageDecoder.decode(ImageDecoder.java:82)
 03-07 15:58:07.141: E/ImageLoader(22950):  at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeWithOOMHandling(LoadAndDisplayImageTask.java:252)
 03-07 15:58:07.141: E/ImageLoader(22950):  at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:235)
 03-07 15:58:07.141: E/ImageLoader(22950):  at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:211)
 03-07 15:58:07.141: E/ImageLoader(22950):  at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:128)
 03-07 15:58:07.141: E/ImageLoader(22950):  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442)
 03-07 15:58:07.141: E/ImageLoader(22950):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
 03-07 15:58:07.141: E/ImageLoader(22950):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
 03-07 15:58:07.141: E/ImageLoader(22950):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
 03-07 15:58:07.141: E/ImageLoader(22950):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
 03-07 15:58:07.141: E/ImageLoader(22950):  at java.lang.Thread.run(Thread.java:856)`

私は何が欠けていますか?不正な形式のURIを渡していますか?

4

2 に答える 2

5

UIL は、バージョン 1.8.0 以降でのみ、すぐに使用できるスキームをサポートcontent://してassets://ます。drawable://

于 2013-03-08T13:51:24.093 に答える
2

ここで使用されている uri を確認したと思います

imageLoader.displayImage(file_prefix + image_path, image);

よく形成されています。

アセット ファイルを取得するメソッドのライブラリ内のクラスを調べたBaseImageDownloaderところ、すべてのコードが適切に処理されているように見えました。以下は、エラーが発生する場所です。画像のオプションが null です。これは、画像のパスが正しくないことを意味します。

    Options options = new Options();
    options.inJustDecodeBounds = true;
    InputStream imageStream = imageDownloader.getStream(imageUri, displayOptions.getExtraForDownloader());
    try {
        BitmapFactory.decodeStream(imageStream, null, options);
    } finally {
        IoUtils.closeSilently(imageStream);
    }

    int scale = 1;
    int imageWidth = options.outWidth; //<-- this is where your error ocurrs
    int imageHeight = options.outHeight;

このコードを使用してテストを行い、同じ結果が得られるかどうかを確認してください。これは私にとってはうまくいっているので、あなたにとってもうまくいくはずです。そうでない場合は、ファイル名とパスを再確認してください。答えが見つからない場合は、エラーが発生する前に ImageDownloader に渡された Uri を投稿してください。

    AssetManager mngr = getAssets();
    InputStream stream;
    try {
        stream = mngr.open("your_picture.png");

        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = 2;// If you want to scale

        Bitmap bitmap = BitmapFactory.decodeStream(stream, new Rect(), o2);

        ImageView image = (ImageView) view.findViewById(R.id.image);
        image.setImageBitmap(bitmap);

    } catch (IOException e) {
        Log.e(TAG, "ERROR GETTING IMAGE", e);
    }
于 2013-03-07T17:07:33.493 に答える