Можно ли использовать BitmapFactory.метод decodeFile для декодирования изображения из http-местоположения?

Я хотел бы знать, можно ли использовать BitmapFactory.метод decodeFile для декодирования изображения из http-местоположения?

например.

ImageView imageview = new ImageView(context);
Bitmap bmp = BitmapFactory.decodeFile("http://<my IP>/test/abc.jpg");  
imageview.setImageBitmap(bmp);

но bmp всегда возвращает null.

есть ли другой способ достичь этого сценария, где у меня есть набор изображений на моем серверном ПК, и я загружаю изображения в приложение галереи через xml?

спасибо,
Сен

5 ответов


используйте decodeStream и передайте вместо этого inputstream URL.

вот пример:

Bitmap bmp = BitmapFactory.decodeStream(new java.net.URL(url).openStream())

@Amir & @Sankar: Спасибо за ваши ценные предложения.

Я решил данную проблему, выполнив следующий фрагмент кода :

ImageView iv = new ImageView(context);

try{
    String url1 = "http://<my IP>/test/abc.jpg";
    URL ulrn = new URL(url1);
    HttpURLConnection con = (HttpURLConnection)ulrn.openConnection();
    InputStream is = con.getInputStream();
    Bitmap bmp = BitmapFactory.decodeStream(is);
    if (null != bmp)
        iv.setImageBitmap(bmp);
    else
        System.out.println("The Bitmap is NULL");

} catch(Exception e) {
}

спасибо,
Сен


String urldisplay="http://www.google.com/";//sample url
Log.d("url_dispaly",urldisplay);
try{    
InputStream in = new java.net.URL(urldisplay).openStream();
Bitmap  mIcon11 = BitmapFactory.decodeStream(new SanInputStream(in));
}
catch(Exception e){}

создать имя класса SanInputStream

public class SanInputStream extends FilterInputStream {
      public SanInputStream(InputStream in) {
        super(in);
      }
      public long skip(long n) throws IOException {
        long m = 0L;
        while (m < n) {
          long _m = in.skip(n-m);
          if (_m == 0L) break;
          m += _m;
        }

        return m;
      }
}

Если я не ошибаюсь, фрагмент кода @Sen должен возвращать null в случае .BMP-файл и logcat должны регистрироваться:

skia decoder->decode returned false

Если что-то подобное происходит, попробуйте использовать этот код (работает также в случае растрового ввода):

HttpGet httpRequest = null;

try {
    httpRequest = new HttpGet(url.toURI());
} catch (URISyntaxException e) {
    e.printStackTrace();
}

HttpClient httpclient = new DefaultHttpClient();

HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);

HttpEntity entity = response.getEntity();

BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);

InputStream instream = bufHttpEntity.getContent();

bmp = BitmapFactory.decodeStream(instream);

источник


/ / создайте объект для подкласса AsyncTask

GetXMLTask task = new GetXMLTask();

// выполнять задание

task.execute(new String[] { "ImageURL" });

/ / затем в классе Asyntask назначьте изображение для просмотра изображения, чтобы избежать android.ОС.NetworkOnMainThreadException

private class GetXMLTask extends AsyncTask<String, Void, Bitmap> {
    @Override
    protected Bitmap doInBackground(String... urls) {
        Bitmap map = null;
        for (String url : urls) {
            map = downloadImage(url);
        }
        return map;
    }

    // Sets the Bitmap returned by doInBackground
    @Override
    protected void onPostExecute(Bitmap result) {
        imageView.setImageBitmap(result);
    }

    // Creates Bitmap from InputStream and returns it
    private Bitmap downloadImage(String url) {
        Bitmap bitmap = null;
        InputStream stream = null;
        BitmapFactory.Options bmOptions = new BitmapFactory.Options();
        bmOptions.inSampleSize = 1;

        try {
            stream = getHttpConnection(url);
            bitmap = BitmapFactory.
                    decodeStream(stream, null, bmOptions);
            stream.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        return bitmap;
    }

    // Makes HttpURLConnection and returns InputStream
    private InputStream getHttpConnection(String urlString)
            throws IOException {
        InputStream stream = null;
        URL url = new URL(urlString);
        URLConnection connection = url.openConnection();

        try {
            HttpURLConnection httpConnection = (HttpURLConnection) connection;
            httpConnection.setRequestMethod("GET");
            httpConnection.connect();

            if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                stream = httpConnection.getInputStream();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return stream;
    }
}