2

以下は私のコードです:

private byte[] downloadImage(String image_url) {
            byte[] image_blob = null;
            URL _image_url = null;
            HttpURLConnection conn = null;
            InputStream inputStream = null;
            try {
                _image_url = new URL(image_url);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
            try {
                conn = (HttpURLConnection) _image_url.openConnection();

            } catch (IOException e) {
                e.printStackTrace();
            }
            conn.setDoInput(true);
            try {
                conn.connect();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            conn.setUseCaches(false);
            try {
                inputStream = conn.getInputStream();
                inputStream.read(image_blob);

            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                conn.disconnect();
            }
            return image_blob;
        }

私がやろうとしているのは、画像のバイト配列を取得することです。小包で使用して、別のアクティビティに転送します。

このコードを使用すると、NullPointerException が報告されます。誰が何が間違っていると言えますか?

4

4 に答える 4

3

次のように試してみてください。

DefaultHttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(imageUrl);
HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();
int imageLength = (int)(entity.getContentLength());
InputStream is = entity.getContent();

byte[] imageBlob = new byte[imageLength];
int bytesRead = 0;
while (bytesRead < imageLength) {
    int n = is.read(imageBlob, bytesRead, imageLength - bytesRead);
    if (n <= 0)
        ; // do some error handling
    bytesRead += n;
}

image_blobちなみに、nullPointerExceptionは nullが原因で発生します。データを読み取る前に、まず配列を割り当てる必要があります。

于 2012-07-29T09:26:31.620 に答える
0

画像を送信するのではなく、キャッシュにダウンロードされた画像のパスを送信できます。このメソッドを使用して、イメージ パスをプローブし、イメージをローカル パスにダウンロードできます。

    private String createLocal(String surl) {       
    URL url;
    try {


        url = new URL(surl);


        String tempname=String.valueOf(surl.hashCode());

        File root=getCacheDir();

        File localfile=new File(root.getAbsolutePath()+"/"+tempname);

        localfile.deleteOnExit();
        if(!localfile.exists()){
            InputStream is=url.openStream();
            OutputStream os = new FileOutputStream(localfile);
            CopyStream(is, os);
            os.close();
        }
        return localfile.getAbsolutePath();
    } catch (Exception e){
        return null;
    }
}
public static void CopyStream(InputStream is, OutputStream os) {
    final int buffer_size=1024;
    try {
        byte[] bytes = new byte[buffer_size];
        for(;;) {
            int count=is.read(bytes, 0, buffer_size);
            if(count == -1)
                break;
            os.write(bytes, 0, count);
        }
    }
    catch(Exception ex){}
}
于 2012-07-29T09:27:45.677 に答える
0

あなたのbyte[] image_blobはnullです。使用する前に、そのような十分なスペースを新しくする必要があります:

image_blob = new byte[enough];
inputStream.read(image_blob);
于 2012-07-29T09:31:11.413 に答える