Android BinaryFactory.decodeStream всегда возвращает ноль

Я пытаюсь загрузить изображение и декодировать его в растровое изображение с помощью BitmapFactory, но decodeStream всегда возвращает значение null. Я гуглил много подобных вопросов, пробовал много примеров, но не нашел решения.

Вот мой код:

    public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void downloadButton(View v)
    {
        String imageUrl = "http://www.picgifs.com/bird-graphics/bird-graphics/elf-owl/bird-graphics-elf-owl-527150.bmp";
        new Thread(new ImageDownloader(imageUrl)).start();
    }

    public void showImageButton(View v)
    {
        Bitmap image = ImageHandler.getImage();
        if (image == null)
            Log.e("Error", "No image available");
        else {
            ImageView imageView = (ImageView)findViewById(R.id.ImageView);
            imageView.setImageBitmap(image);
        }
    }
}

class ImageHandler
{
    static protected List<Bitmap> imagesList;
    static public void addImage(Bitmap image)
    {
        imagesList.add(image);
    }
    static public Bitmap getImage()
    {
        if (!imagesList.isEmpty())
            return imagesList.get(0);
        else
            return null;
    }
}

class ImageDownloader implements Runnable
{
    public Bitmap bmpImage;
    private String urlString;
    public ImageDownloader(String urlString)
    {
        this.urlString = urlString;
    }
    public void run()
    {
        try
        {
            AndroidHttpClient client = AndroidHttpClient.newInstance("Android");
            HttpGet getRequest = new HttpGet(urlString);
            HttpResponse response = client.execute(getRequest);
            HttpEntity entity = response.getEntity();
            InputStream inputStream = null;
            inputStream = (new BufferedHttpEntity(entity)).getContent();
            bmpImage = BitmapFactory.decodeStream(inputStream);
            //bmpImage = BitmapFactory.decodeStream(new URL(urlString).openConnection().getInputStream());
        }
        catch (Exception e)
        {
            Log.e("ImageDownloadError", e.toString());
            return;
        }
        if (bmpImage != null)
        {
            ImageHandler.addImage(bmpImage);
            Log.i("Info", "Image download successfully");
        }
        else
            Log.e("Error", "Bitmap is null");
    }
}

p.s showImageButton кидает IllegalStateException, а мне уже надоело.


person user3551569    schedule 22.04.2014    source источник
comment
я не уверен, что вы можете декодировать файл .bmp... РЕДАКТИРОВАТЬ: возможно, ответ на этот вопрос может помочь здесь stackoverflow.com/questions/5886583/   -  person cyborg86pl    schedule 22.04.2014
comment
@cyborg86pl я пытался скачать jpg и png и получил тот же результат.   -  person user3551569    schedule 22.04.2014
comment
@cyborg86pl попробовал метод из ссылки, все равно ошибка, но я получаю, что SkImageDecoder::Factory вернул null вместо decoder-›decode вернул false   -  person user3551569    schedule 22.04.2014
comment
не могли бы вы обновить свой код, пожалуйста?   -  person cyborg86pl    schedule 22.04.2014
comment
Конечно. Я думал, может быть, это из-за моей версии JDK? Я использую jdk8.   -  person user3551569    schedule 22.04.2014
comment
Если bmpImage остается нулевым, то какое исключение вы перехватываете? Что такое трассировка стека? У вас есть разрешение на доступ в Интернет в вашем манифесте?   -  person greenapps    schedule 22.04.2014
comment
Для нового URL-адреса @greenapps требуется инструкция try, трассировка стека -pastebin.com/mtc0VWEP, да, у меня есть права INTERNET и ACCESS_NETWORK_STATE .   -  person user3551569    schedule 22.04.2014
comment
Ну, есть несколько исключений, перечисленных в вашем pastebin. Вы видели их?   -  person greenapps    schedule 22.04.2014
comment
@greenapps да, но я не совсем понимаю, что они означают, я всего один день в разработке Java (и Android), а также то, что исключения не всегда просрочены   -  person user3551569    schedule 22.04.2014
comment
Ok. Я не пробовал ваш код. Но для загрузки файла есть много, много, много примеров здесь, в stackoverflow. Так что просто немного погуглите и попробуйте другие решения.   -  person greenapps    schedule 22.04.2014
comment
я пробовал наверное все примеры   -  person user3551569    schedule 23.04.2014


Ответы (2)


Я думаю, проблема в том, что после того, как вы использовали InputStream из HttpUrlConnection, вы не можете перемотать назад и снова использовать тот же InputStream. Поэтому вам нужно создать новый InputStream для фактической выборки изображения. В противном случае мы должны прервать http-запрос.

Только после того, как мы сможем использовать входной поток для httprequest, если вы пытаетесь загрузить другое изображение, он выдаст ошибку «InputStream уже создан», как это. поэтому нам нужно прервать httprequest после загрузки с помощью httpRequest.abort();

Использовать этот:

HttpGet httpRequest = new HttpGet(URI.create(path) );
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
HttpEntity entity = response.getEntity();
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
bmp = BitmapFactory.decodeStream(bufHttpEntity.getContent());
httpRequest.abort();
person Ajit Kumar    schedule 22.04.2014
comment
все то же самое, вернул null :( Я действительно не понимаю, почему это происходит. - person user3551569; 22.04.2014
comment
не могли бы вы поделиться своим кодом файла макета (activity_main). - person Ajit Kumar; 22.04.2014
comment
Я думаю, вам нужно добавить onClickListner в ваш xml-код downloadButton.share, чтобы я мог сообщить вам конкретную причину. - person Ajit Kumar; 22.04.2014

на мой взгляд есть две причины

  1. класс ImageHandler не может получить изображение
  2. Android дает проблемы с получением изображения GIF из источника.

Я загружаю рабочий код, надеюсь, это решит вашу проблему.

Основная деятельность

 public class MainActivity extends Activity {

    private ProgressDialog progressDialog;
    private ImageView imageView;
    private String url = "http://www.9ori.com/store/media/images/8ab579a656.jpg";
    private Bitmap bitmap = null;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = (ImageView) findViewById(R.id.imageView);

        Button start = (Button) findViewById(R.id.button1);
        start.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                progressDialog = ProgressDialog.show(MainActivity.this,
                        "", "Loading..");
                new Thread() {
                    public void run() {
                        bitmap = downloadBitmap(url);
                        messageHandler.sendEmptyMessage(0);
                    }
                }.start();

            }
        });
    }

    private Handler messageHandler = new Handler() {
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            imageView.setImageBitmap(bitmap);
            progressDialog.dismiss();
        }
    };

    private Bitmap downloadBitmap(String url) {
        // Initialize the default HTTP client object
        final DefaultHttpClient client = new DefaultHttpClient();

        //forming a HttoGet request
        final HttpGet getRequest = new HttpGet(url);
        try {

            HttpResponse response = client.execute(getRequest);

            //check 200 OK for success
            final int statusCode = response.getStatusLine().getStatusCode();

            if (statusCode != HttpStatus.SC_OK) {
                Log.w("ImageDownloader", "Error " + statusCode +
                        " while retrieving bitmap from " + url);
                return null;
            }

            final HttpEntity entity = response.getEntity();
            if (entity != null) {
                InputStream is = null;
                try {
                    // getting contents from the stream
                    is = entity.getContent();

                    // decoding stream data back into image Bitmap
                    final Bitmap bitmap = BitmapFactory.decodeStream(is);

                    return bitmap;
                } finally {
                    if (is != null) {
                        is.close();
                    }
                    entity.consumeContent();
                }
            }
        } catch (Exception e) {
            getRequest.abort();
            Log.e(getString(R.string.app_name), "Error "+ e.toString());
        }

        return null;
    }
}

Activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="15dp"
        android:text="Download Image" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scaleType="centerInside"
        android:src="@drawable/ic_launcher" />

</LinearLayout>

а также не забудьте дать INTERNET Permission в файле Manifest.xml

person Ajit Kumar    schedule 23.04.2014