Android Bitmap из URL всегда нулевой

Я пытаюсь загрузить изображение с URL-адреса и преобразовать его в растровое изображение, но строка

Bitmap myBitmap = BitmapFactory.decodeStream(input);

всегда заставляет отладчик переходить к следующей строке

return null;

даже не распечатывая трассировку стека, а переменная Exception также не существует в переменных, перечисленных в отладчике. Я много читал о том, что могут быть проблемы с URL-адресами, которые на самом деле не ведут к изображениям, плохо отформатированным изображениям и т. Д., Но у него все еще есть та же проблема с жестко закодированным изображением, которое, я уверен, существует.

public static Bitmap getBitmapFromURL(String src) {
    try {
        URL url = new URL(
                "http://www.helpinghomelesscats.com/images/cat1.jpg");
        HttpURLConnection connection = (HttpURLConnection) url
                .openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        return myBitmap;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

Поскольку кажется, что может быть задействован файл manifest.xml, я отредактировал его, чтобы добавить сюда.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.delivery"
android:versionCode="1"
android:versionName="1.0">

<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".IntroPage"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".Browse"></activity>
    <activity android:name=".ViewProduct"></activity>
    <activity android:name=".ViewOrder"></activity>
    <activity android:name=".GetAddress"></activity>
    <activity android:name=".ConfirmOrder"></activity>
</application>


person Andrew Boissonnault    schedule 21.11.2012    source источник
comment
вы использовали интернет-разрешение?   -  person Nikhil    schedule 21.11.2012
comment
пожалуйста, попробуйте посмотреть, что было выброшено, вы можете зарегистрировать IOexception, используя Log.i(TAG,e.getMessage) и опубликовать его здесь   -  person Niko Adrianus Yuwono    schedule 21.11.2012
comment
Если отладчик переходит к return null; в вашей ветке catch, должно быть возникло исключение, и переменная e должна содержать это исключение.   -  person Ridcully    schedule 21.11.2012
comment
Да, разрешение на интернет есть. Вот что меня так беспокоит, даже когда я добавляю Log.i(TAG,e.getMessage) и ставлю точки останова на эту строку и строку e.printStackTrace(), он все равно не останавливается до тех пор, пока не вернет нулевую строку.   -  person Andrew Boissonnault    schedule 21.11.2012


Ответы (3)


следующий код работает для всех типов изображений.

    try {

        URL url = new URL("http://www.helpinghomelesscats.com/images/cat1.jpg");
        InputStream in = url.openConnection().getInputStream(); 
        BufferedInputStream bis = new BufferedInputStream(in,1024*8);
        ByteArrayOutputStream out = new ByteArrayOutputStream();

        int len=0;
        byte[] buffer = new byte[1024];
        while((len = bis.read(buffer)) != -1){
            out.write(buffer, 0, len);
        }
        out.close();
        bis.close();

        byte[] data = out.toByteArray();
        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
        imageView.setImageBitmap(bitmap);
    }
    catch (IOException e) {
        e.printStackTrace();
    }
person Kirit Vaghela    schedule 21.11.2012
comment
Спасибо за кодирование надежного ответа, который не передает InputStream в BitmapFactory. Хотя я бы предложил изменить отступ вашего кода, так как он выглядит не очень красиво. - person dudeofea; 09.07.2014

Привет, вы можете указать эти 2 pemssions в файле манифеста Android.

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

В вашей деятельности:

url="http://www.helpinghomelesscats.com/images/cat1.jpg"
Bitmap bmp=readBitmapFromNetwork(url);



 public static Bitmap readBitmapFromNetwork(String imgurl) {
         URL url;
         Bitmap bmp = null;
         InputStream is = null;
           BufferedInputStream bis = null;
           System.out.println("image url ==========   "+imgurl);
        try {

            url=new URL(imgurl);
            System.out.println("url.getPath()"+url.getPath());          
                try {
               URLConnection conn = url.openConnection();
                    conn.connect();
                    is = conn.getInputStream();
                    bis = new BufferedInputStream(is);
                bmp = BitmapFactory.decodeStream(bis);
                } catch (MalformedURLException e) {                 
                    System.out.println("Bad ad URL");
                    e.printStackTrace();
                } catch (IOException e) {                   
                    System.out.println("Could not get remote ad image");
                    e.printStackTrace();
                }

        } catch (MalformedURLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
         finally {
                try {
                    if( is != null )
                        is.close();
                    if( bis != null )
                      bis.close();
                } catch (IOException e) {
                    System.out.println("Error closing stream.");
                    e.printStackTrace();
                }
            }   


           return bmp;
            }
person mini    schedule 21.11.2012
comment
Этот код перехватывает исключение в строке conn.connect();, а затем выводит следующую ошибку. - person Andrew Boissonnault; 21.11.2012
comment
11-21 10:34:34.554: W/System.err(818): java.net.UnknownHostException: Хост не разрешен: www.helpinghomelesscats.com:80 - person Andrew Boissonnault; 21.11.2012

Это работает для меня, нашел его здесь, когда искал другую проблему. Таким образом, он не поддерживает пользовательский интерфейс. очень хорошо работает и в ArrayAdapters.

Использование:

_coverArt = (ImageView) row.findViewById(R.id.top_CoverArt);

new DownloadImageTask(_coverArt)
            .execute("Put your URL here Hint: make sure it's valid http://www.blah...");

Асинтаск

class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;

public DownloadImageTask(ImageView bmImage) {
    this.bmImage = bmImage;
}

protected Bitmap doInBackground(String... urls) {
    String urldisplay = urls[0];
    Bitmap mIcon11 = null;
    try {
        InputStream in = new URL(urldisplay).openStream();
        mIcon11 = BitmapFactory.decodeStream(in);
    } catch (Exception e) {
        Log.e("Error", e.getMessage());
        e.printStackTrace();
    }
    return mIcon11;
}

protected void onPostExecute(Bitmap result) {
    bmImage.setImageBitmap(result);
}
}
person user1723341    schedule 21.11.2012