我试图从http响应中获取图像,但无法将流转换为位图。请让我知道,我在这里错过了什么。
仅供参考 - 图像内容以原始二进制形式接收,它是 jpeg 图像。
遵循的程序:
- 发出 HttpRequest。
- 作为响应,请检查 200 ->获取 httpentity 内容。 使用位图
- 工厂将流转换为位图。
- 将位图设置为图像视图
在 AsyncTask 的 postExecute 中执行此操作
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(endpoint);
// Adding Headers ..
// Execute the request
HttpResponse response;
try {
response = httpclient.execute(httpget);
if (response.getStatusLine().getStatusCode() == 200) {
// Get hold of the response entity
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
return instream;
// instream.close();
}
}
}
在 AsyncTask 的 postExecute 中执行此操作
if (null != instream) {
Bitmap bm = BitmapFactory.decodeStream(instream);
if(null == bm){
Toast toast = Toast.makeText(getApplicationContext(),
"Bitmap is NULL", Toast.LENGTH_SHORT);
toast.show();
}
ImageView view = (ImageView) findViewById(R.id.picture_frame);
view.setImageBitmap(bm);
}
提前谢谢。
终于找到了答案。 下面是片段 - 可能对使用 http 响应的新手有所帮助。
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(endpoint);
// Adding Headers ..
// Execute the request
HttpResponse response;
try {
response = httpclient.execute(httpget);
if (response.getStatusLine().getStatusCode() == 200) {
// Get hold of the response entity
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
String path = "/storage/emulated/0/YOURAPPFOLDER/FILENAME.EXTENSION";
FileOutputStream output = new FileOutputStream(path);
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int len = 0;
while ((len = instream.read(buffer)) != -1) {
output.write(buffer, 0, len);
}
output.close();
}
我们可以将内容保存在字节数组中并从中获取位图,而不是将文件保存到磁盘。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int len = 0;
try {
// instream is content got from httpentity.getContent()
while ((len = instream.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
byte[] b = baos.toByteArray();
Bitmap bmp = BitmapFactory.decodeByteArray(b, 0, b.length);
ImageView imageView = (ImageView)findViewById(R.id.picture_frame);
imageView.setImageBitmap(bmp);
仅供参考 - 在 android 文件输出流中,写入本地磁盘必须在非 UI 线程中完成(在我的情况下使用了异步任务,此处未添加该部分)。
谢谢。。
使用此库处理来自 Web 的图像。 https://github.com/nostra13/Android-Universal-Image-Loader它为您做一切。但是来自onPostExecute的代码你应该放到onDoInBackground。onPre和onPost执行代码将在主线程上执行,doInBackground是工作线程。但在这种情况下,只需使用通用图像加载器