我有下面的代码从URL下载图像。但得到UnknowHostException:
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 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) {
bmImage.setImageBitmap(result);
}
}我这样称呼这段代码
new DownloadImageTask((ImageView) findViewById(R.id.imageView2))
.execute(ocrResult.getImgUrl());ocrResult.getImgUrl具有如下价值:
http://thumbs1.ebaystatic.com/m/mwXFFYQ1tmdoRBaDVQG2tsA/140.jpg我在Android中确实有以下内容:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>下面的是整个堆栈。在我看来,URL被错误地编码了。我看到%5c,然后在它后面看到"/“。
11 17:34:19.109: E/Error(2815): http:%5C/%5C/thumbs4.ebaystatic.com%5C/m%5C/mdfwIytXczq_z11DEJ42J9g%5C/140.jpg
06-11 17:34:19.117: W/System.err(2815): java.net.UnknownHostException: http:%5C/%5C/thumbs4.ebaystatic.com%5C/m%5C/mdfwIytXczq_z11DEJ42J9g%5C/140.jpg
06-11 17:34:19.125: W/System.err(2815): at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:279)
06-11 17:34:19.132: W/System.err(2815): at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
06-11 17:34:19.132: W/System.err(2815): at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
06-11 17:34:19.132: W/System.err(2815): at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
06-11 17:34:19.140: W/System.err(2815): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
06-11 17:34:19.140: W/System.err(2815): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179)
06-11 17:34:19.187: D/dalvikvm(2815): GC_FOR_ALLOC freed 1370K, 29% free 6738K/9360K, paused 39ms, total 39ms
06-11 17:34:19.195: W/System.err(2815): at java.net.URL.openStream(URL.java:470)
06-11 17:34:19.203: W/System.err(2815): at edu.sfsu.cs.orange.ocr.CaptureActivity$DownloadImageTask.doInBackground(CaptureActivity.java:854)
06-11 17:34:19.203: W/System.err(2815): at edu.sfsu.cs.orange.ocr.CaptureActivity$DownloadImageTask.doInBackground(CaptureActivity.java:1)
06-11 17:34:19.210: W/System.err(2815): at android.os.AsyncTask$2.call(AsyncTask.java:300)
06-11 17:34:19.218: W/System.err(2815): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
06-11 17:34:19.218: W/System.err(2815): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:240)
06-11 17:34:19.226: W/System.err(2815): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
06-11 17:34:19.226: W/System.err(2815): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
06-11 17:34:19.226: W/System.err(2815): at java.lang.Thread.run(Thread.java:841)发布于 2014-06-12 00:57:57
您从execute参数中获得了错误的URL(which is character encoded URL),但是仍然可以使用字符串的replaceAll方法将%5C的所有实例替换为空字符,从而获得正确的URL。
解决方案:
String urldisplay = urls[0].replaceAll("%5C","");结果:
http://thumbs4.ebaystatic.com/m/mdfwIytXczq_z11DEJ42J9g/140.jpg发布于 2014-06-12 01:07:53
%5c是一个url编码的反斜杠。看起来您的字符串的正斜杠正在用反斜杠转义,如下所示:
http:\/\/thumbs1.ebaystatic.com\/m\/mwXFFYQ1tmdoRBaDVQG2tsA\/140.jpg稍后,当您传入这个URL时,所有反斜杠都转换为%5c。
确保您的字符串在传递到DownloadImageTask之前没有将其正斜杠转义。正确的方法是
url = url.replaceAll("\\", "");https://stackoverflow.com/questions/24174849
复制相似问题