简体   繁体   English

如何从网址下载图片?

[英]How to download image from a Url?

I use this code: 我使用以下代码:

private class AsyncGetCatalogs extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        try {
            Map<String, String> catalogsBuffer = Requester.getCatalog();
            catalogsNumber = catalogsBuffer.size();
            catalogs = new catalogInfo[catalogsNumber];
            int n = 0;
            for(Map.Entry<String, String> entry : catalogsBuffer.entrySet()) {
                catalogs[n] = new catalogInfo();
                String name = entry.getKey();
                String link = entry.getValue();
                String imageLink = Requester.getCatalogImageLink(name);
                byte imgBuf[] = Requester.getCatalogImage(imageLink);
                Bitmap bitmap = BitmapFactory.decodeByteArray(imgBuf, 0, imgBuf.length);
                catalogs[n].setBitmap(bitmap);
                catalogs[n].setCatLink(link);
                catalogs[n].setCatName(name);
                n++;

            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override 
    protected void onPostExecute(Void result) {
        try {
            LinearLayout catsLayouts[] = new LinearLayout[catalogsNumber];
            for(int i=0;i<catalogsNumber;i++) {
                catsLayouts[i] = new LinearLayout(getApplicationContext());
                ImageView catImageView = new ImageView(getApplicationContext());
                catImageView.setImageBitmap(catalogs[i].getImage());
                catsLayouts[i].addView(catImageView);
                mainLayout.addView(catsLayouts[i]);
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

}

Application crashes at: 应用程序在以下位置崩溃:

byte imgBuf[] = Requester.getCatalogImage(imageLink);

With such stack trace; 具有这样的堆栈跟踪;

01-25 00:22:26.998: E/AndroidRuntime(975): FATAL EXCEPTION: AsyncTask #2
01-25 00:22:26.998: E/AndroidRuntime(975): java.lang.RuntimeException: An error occured while executing doInBackground()
01-25 00:22:26.998: E/AndroidRuntime(975):  at android.os.AsyncTask$3.done(AsyncTask.java:278)
01-25 00:22:26.998: E/AndroidRuntime(975):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
01-25 00:22:26.998: E/AndroidRuntime(975):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
01-25 00:22:26.998: E/AndroidRuntime(975):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
01-25 00:22:26.998: E/AndroidRuntime(975):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-25 00:22:26.998: E/AndroidRuntime(975):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
01-25 00:22:26.998: E/AndroidRuntime(975):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-25 00:22:26.998: E/AndroidRuntime(975):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-25 00:22:26.998: E/AndroidRuntime(975):  at java.lang.Thread.run(Thread.java:856)
01-25 00:22:26.998: E/AndroidRuntime(975): Caused by: java.lang.NoClassDefFoundError: javax.imageio.ImageIO
01-25 00:22:26.998: E/AndroidRuntime(975):  at IrkroseRequester.IrkroseRequester.getCatalogImage(IrkroseRequester.java:152)
01-25 00:22:26.998: E/AndroidRuntime(975):  at com.example.client.MainContentActivity$AsyncGetCatalogs.doInBackground(MainContentActivity.java:79)
01-25 00:22:26.998: E/AndroidRuntime(975):  at com.example.client.MainContentActivity$AsyncGetCatalogs.doInBackground(MainContentActivity.java:1)
01-25 00:22:26.998: E/AndroidRuntime(975):  at android.os.AsyncTask$2.call(AsyncTask.java:264)
01-25 00:22:26.998: E/AndroidRuntime(975):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

** getCatalog Image ** ** getCatalog图片**

public byte[] getCatalogImage(String _link) throws IOException {
    String link = "http://irkrose.ru/images/catalogImages/"+_link;
    URL url = new URL(_link);
    BufferedImage img = ImageIO.read(url);
    ByteArrayOutputStream res = new ByteArrayOutputStream();
    ImageIO.write(img, "jpg", res);
    return res.toByteArray();
}

As I understand it can't find ImageIO. 据我了解,找不到ImageIO。 I know that android haven't it but all function using ImageIO are in another java package just added to app as a lib. 我知道android还没有,但是所有使用ImageIO的功能都在另一个以lib形式添加到应用程序的java包中。 And android app works only with byte array. 而android app仅适用于字节数组。

So what is wrong? 那怎么了? And how can I load .jpg image from url another way? 以及如何从URL加载.jpg图像? And can it be problem with a async class? 异步类有问题吗?

Try this: 尝试这个:

private class GetImageTaskextends AsyncTask<String, Void, Bitmap> {
    ImageView tempBitmapImage;

    public GetImageTask(ImageView tempBitmapImage) {
        this.tempBitmapImage = tempBitmapImage;
    }

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

    protected void onPostExecute(Bitmap result) {
        tempBitmapImage.setImageBitmap(result);
    }
}

And use it like this: 并像这样使用它:

new GetImageTask((ImageView) imgIcon).execute("www.test.com/test.jpg");

I hope it helps. 希望对您有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM