Ошибка нулевого указателя при отображении изображения из папки активов Android 2.2 SDK - PullRequest
0 голосов
/ 28 октября 2010

Я посмотрел 2 примера на стеке, но не могу заставить их работать.Я просто пытаюсь получить изображение из папки в ресурсах и установить его, как в ImageView, но получить нулевой указатель возвращается.Что я делаю не так?

Основная активность: пакет com.xxx.xxx;

import java.io.InputStream;

import android.app.AlertDialog;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.ViewFlipper;

public class SamplesViewFlipper extends SamplesViewCreator {

    private Bitmap returnedImage;
    ImageView imgView;
    ViewFlipper vf;
    private String imageName = "testImage.png";

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        returnedImage = getImageFromAsset(imageName);

        imgView = (ImageView) findViewById(R.id.dynamicImageView);
        imgView.setImageBitmap(returnedImage); //<-null pointer happens here

        vf = (ViewFlipper) findViewById(R.id.SamplesViewFlipper);
        setContentView(R.layout.view_flipper_samples); 

    }

    public void buttonClickHandler(View view) {

        switch (view.getId()) {

            case R.id.nextSampleButton:

                vf.showNext();

                break;

            case R.id.backSampleButton:

                vf.showPrevious();

                break;

        }

    }

}

Класс расширителя:

package com.xxx.xxx;

import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class SamplesViewCreator extends Activity {

     private InputStream is;
     private Bitmap bitmap;

    public Bitmap getImageFromAsset(String imageName) {

        AssetManager mngr = getAssets();
        try {

            is = mngr.open("file:///android_asset/Samples/" + imageName);
            bitmap = BitmapFactory.decodeStream(is);
                    //also tried "Files/" + imageName per example on Stack

        } catch (final IOException e) {

            e.printStackTrace();

        }

        return bitmap;

    }

}

И два моих файла xml:

<?xml version="1.0" encoding="utf-8"?>      
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/SamplesLayout"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical">
    <RelativeLayout
        android:id="@+id/samples_menu"
        android:layout_width="fill_parent" 
        android:layout_height="50dp" 
        android:gravity="center"
        android:background="#0061F9">
        <Button android:id="@+id/nextSampleButton"  
            android:layout_marginRight="10dp"
            android:gravity="center"    
            android:layout_width="50dp"
            android:layout_height="30dp"
            android:text="Next"
            android:textColor="#FFFFFF"
            android:textSize="13dp"
            android:layout_weight="1"
            android:background="@drawable/button"
            android:layout_alignParentRight="true"
            android:onClick="buttonClickHandlerSamples"/>
        <Button android:id="@+id/backSampleButton"
            android:layout_marginLeft="10dp"
            android:gravity="center"    
            android:layout_width="50dp"
            android:layout_height="30dp"
            android:text="Back"
            android:textColor="#FFFFFF"
            android:textSize="13dp"
            android:layout_weight="1"
            android:background="@drawable/button"
            android:onClick="buttonClickHandler"/>
    </RelativeLayout>
    <LinearLayout android:id="@+id/SamplesViewFlipperLayout"
        android:layout_width="wrap_content" android:layout_height="wrap_content">
        <ViewFlipper android:id="@+id/SamplesViewFlipper"
            android:layout_width="wrap_content" android:layout_height="wrap_content">
            <!--adding views to ViewFlipper-->  
            <LinearLayout
                android:layout_width="fill_parent" 
                android:layout_height="fill_parent"
                android:paddingLeft="@dimen/header_pad_left"
                android:paddingRight="@dimen/header_pad_right"
                android:paddingBottom="@dimen/header_pad_bot"
                android:paddingTop="@dimen/header_pad_top"
                android:orientation="vertical"
                android:background="@color/background" >

            </LinearLayout>
        </ViewFlipper>
    </Linear

Макет>

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/dynamicImageView"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@drawable/default_samples_image"/>

РЕДАКТИРОВАТЬ:

Также попытался, но все еще получить исключение не найден файл.

Public Bitmap getImageFromAsset() throws IOException {

        try {

            is = getAssets().open("test3.png");

                    bitmap = BitmapFactory.decodeStream(is);

        } catch (final IOException e) {

            e.printStackTrace();

        }

        System.out.println("bitmap is " + bitmap);
        return bitmap;

    }

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

Фрэнк, у меня была такая же проблема!

У меня были изображения PNG в «активах» моего проекта, и AssetManager.open () продолжал выдавать мне исключение, потому что не удалось найти файл!

Я исследовал с помощью assetManager.list (""), чтобы перечислить, что находится в "активах". Впоследствии я обнаружил, что мои изображения на самом деле НЕ были добавлены в «активы»!

Как вы можете себе представить, я был очень взбешен в этот момент, потому что, очевидно, мои изображения должны находиться в пределах ресурсов, потому что я мог видеть, как они играют как день в Eclipse в проклятой папке "assets" моего проект.

Решение

  1. создайте резервную копию файлов, которые находятся в папке ресурсов вашего проекта. Я использовал Windows Explorer для этой операции перетаскивания.
  2. вернитесь к затмению и удалите ваши файлы в «активах». Для этого используйте Eclipse, чтобы вам не нужно было обновлять проект.
  3. верните окно Windows Explorer и перетащите ваши резервные копии в Eclipse и на «активы». Ваш курсор изменится на «+». Когда вы отпустите кнопку мыши, Eclipse предложит вам ссылку или копирование. Выберите копию.
  4. перестройте свой проект, и изображения теперь действительно в активах.

Бонус - я обновил ваш метод getBitmapFromAsset ():

private Bitmap getBitmapFromAsset(String strName) throws IOException
{
    AssetManager assetManager = getAssets();

    InputStream istr = assetManager.open(strName);
    Bitmap bitmap = BitmapFactory.decodeStream(istr);

    return bitmap;
}
2 голосов
/ 28 октября 2010

Откуда приходит "file:///android_asset/Samples/" + imageName? Если ваша иерархия выглядит как assets / file_name.jpg, вы просто позвоните open(file_name.jpg). Другими словами, попробуйте заменить ваш file:///android_asset/Samples/" + imageName просто imageName.

Посмотрите демонстрации API, в частности класс ReadAsset.java:

try {
        InputStream is = getAssets().open("read_asset.txt");

...

где папка ресурсов выглядит как

alt text

...