解析来自 url 的图像
parse the image from url
我正在尝试从服务器解析图像,并且我正在使用查询,在我的 Logcat 响应中显示但图像未显示!以下是我的回复Json和代码片段
有人可以帮忙吗?
[
{
"b_card":"http:\/\/www.webname.com\/uploaded\/users\/vcard\/8_ers.jpg"
}
]
和BusinessCard.java:
public class BusinessCard extends Activity{
private Button btn;
private String User_id;
private Activity activity;
private ImageView bucard;
ImageLoader _DownImageLoader;
AQuery androidAQuery=new AQuery(this);
JSONArray state_list=null;
private static String ALL_SUBCATAGORY_URL = "";
private static final String ALL_SUBCATAGORY_ID="b_card";
ArrayList<HashMap<String,String>> subcatagorydata;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.business_card);
User_id=this.getIntent().getStringExtra("userids");
System.out.println("for business card"+User_id);
ALL_SUBCATAGORY_URL="http://www.asdf.com/web-service/b_card.php?user_id="+User_id;
/*ImageLoader imageLoader = new ImageLoader(activity.getApplicationContext());
ImageView Profileimage = (ImageView) findViewById(R.id.You_image_view);
imageLoader.DisplayImage(imageurl , Profileimage);*/
bucard=(ImageView)findViewById(R.id.imgvwbusinesscard);
btn=(Button)findViewById(R.id.dwnldbutton);
_DownImageLoader = new ImageLoader(activity);
bucard.setTag(ALL_SUBCATAGORY_URL); //set url tag to image
_DownImageLoader.DisplayImage(ALL_SUBCATAGORY_URL, activity ,bucard);
new LoadAllSubcatagories().execute();
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
}
class LoadAllSubcatagories extends AsyncTask<String, String, ArrayList<HashMap<String,String>>> {
ArrayAdapter<String> adapterallsubcatagory ;
private ProgressDialog pDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
/* pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Load All Subcatagories..");
pDialog.setIndeterminate(false);
// pDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.custom_progress));
pDialog.setCancelable(true);
pDialog.show();*/
}
protected ArrayList<HashMap<String,String>> doInBackground(String... args) {
ServiceHandler sh = new ServiceHandler();
// Making a request to url and getting response
subcatagorydata = new ArrayList<HashMap<String, String>>();
String jsonStr = sh.makeServiceCall(ALL_SUBCATAGORY_URL, ServiceHandler.GET);
Log.d("Response: ", "> " + jsonStr);
if (jsonStr != null) {
try {
//JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
//JSONArray data_array = new JSONArray(received);
state_list = new JSONArray(jsonStr);
// looping through All Contacts
for (int i = 0; i < state_list.length(); i++) {
JSONObject c = state_list.getJSONObject(i);
String card=state_list.getJSONObject(i).toString();
System.out.println("Card "+card);
androidAQuery.id(bucard).image(card, true, true);
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(ALL_SUBCATAGORY_ID, c.getString(ALL_SUBCATAGORY_ID));
subcatagorydata.add(map);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.e("ServiceHandler", "Couldn't get any data from the url");
}
return subcatagorydata;
}
protected void onPostExecute(ArrayList<HashMap<String,String>> result) {
}
}
}
首先...将 json 响应变成 string
.. 你的响应看起来像 link
.. 所以它是 link图像但不是图像.. 所以你需要 image loader
将图像从 link 加载到 imageview
.. 你可以 universal-image-loader
.. 从这个 link您可以下载 UIL
库...然后您可以使用它来加载图像
添加 UIL
然后使用它来加载图像
ImageLoader imageLoader = new ImageLoader(getApplicationContext());
ImageView Profileimage = (ImageView) findViewById(R.id.You_image_view);
imageLoader.DisplayImage(imageurl , Profileimage);
如果不知道如何使用 UIL 然后添加这个 java class(ImageLoader.java)
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.widget.ImageView;
public class ImageLoader {
MemoryCache memoryCache=new MemoryCache();
FileCache fileCache;
private Map<ImageView, String> imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
ExecutorService executorService;
public ImageLoader(Context context){
fileCache=new FileCache(context);
executorService=Executors.newFixedThreadPool(5);
}
final int stub_id=R.drawable.defaultpic;
public void DisplayImage(String url, ImageView imageView)
{
imageViews.put(imageView, url);
Bitmap bitmap=memoryCache.get(url);
Bitmap output;
if(bitmap!=null)
{
output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx = 9;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
imageView.setImageBitmap(output);
}
else
{
queuePhoto(url, imageView);
imageView.setImageResource(stub_id);
}
}
private void queuePhoto(String url, ImageView imageView)
{
PhotoToLoad p=new PhotoToLoad(url, imageView);
executorService.submit(new PhotosLoader(p));
}
private Bitmap getBitmap(String url)
{
File f=fileCache.getFile(url);
//from SD cache
Bitmap b = decodeFile(f);
if(b!=null)
return b;
//from web
try {
Bitmap bitmap=null;
URL imageUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is=conn.getInputStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
bitmap = decodeFile(f);
return bitmap;
} catch (Throwable ex){
ex.printStackTrace();
if(ex instanceof OutOfMemoryError)
memoryCache.clear();
return null;
}
}
//decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f){
try {
//decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(f),null,o);
//Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE=1024;
int width_tmp=o.outWidth, height_tmp=o.outHeight;
int scale=1;
while(true){
if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
break;
width_tmp/=2;
height_tmp/=2;
scale*=2;
}
//decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=scale;
return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
} catch (FileNotFoundException e) {}
return null;
}
//Task for the queue
private class PhotoToLoad
{
public String url;
public ImageView imageView;
public PhotoToLoad(String u, ImageView i){
url=u;
imageView=i;
}
}
class PhotosLoader implements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoad photoToLoad){
this.photoToLoad=photoToLoad;
}
public void run() {
if(imageViewReused(photoToLoad))
return;
Bitmap bmp=getBitmap(photoToLoad.url);
memoryCache.put(photoToLoad.url, bmp);
if(imageViewReused(photoToLoad))
return;
BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad);
Activity a=(Activity)photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
boolean imageViewReused(PhotoToLoad photoToLoad){
String tag=imageViews.get(photoToLoad.imageView);
if(tag==null || !tag.equals(photoToLoad.url))
return true;
return false;
}
//Used to display bitmap in the UI thread
class BitmapDisplayer implements Runnable
{
Bitmap bitmap;
Bitmap out;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b, PhotoToLoad p){bitmap=b;photoToLoad=p;}
public void run()
{
if(imageViewReused(photoToLoad))
return;
if(bitmap!=null)
{
out = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(out);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx = 9;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
photoToLoad.imageView.setImageBitmap(out);
}
else
{
photoToLoad.imageView.setImageResource(stub_id);
}
}
}
public void clearCache() {
memoryCache.clear();
fileCache.clear();
}
}
使用volley的networkimageView
我正在尝试从服务器解析图像,并且我正在使用查询,在我的 Logcat 响应中显示但图像未显示!以下是我的回复Json和代码片段
有人可以帮忙吗?
[
{
"b_card":"http:\/\/www.webname.com\/uploaded\/users\/vcard\/8_ers.jpg"
}
]
和BusinessCard.java:
public class BusinessCard extends Activity{
private Button btn;
private String User_id;
private Activity activity;
private ImageView bucard;
ImageLoader _DownImageLoader;
AQuery androidAQuery=new AQuery(this);
JSONArray state_list=null;
private static String ALL_SUBCATAGORY_URL = "";
private static final String ALL_SUBCATAGORY_ID="b_card";
ArrayList<HashMap<String,String>> subcatagorydata;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.business_card);
User_id=this.getIntent().getStringExtra("userids");
System.out.println("for business card"+User_id);
ALL_SUBCATAGORY_URL="http://www.asdf.com/web-service/b_card.php?user_id="+User_id;
/*ImageLoader imageLoader = new ImageLoader(activity.getApplicationContext());
ImageView Profileimage = (ImageView) findViewById(R.id.You_image_view);
imageLoader.DisplayImage(imageurl , Profileimage);*/
bucard=(ImageView)findViewById(R.id.imgvwbusinesscard);
btn=(Button)findViewById(R.id.dwnldbutton);
_DownImageLoader = new ImageLoader(activity);
bucard.setTag(ALL_SUBCATAGORY_URL); //set url tag to image
_DownImageLoader.DisplayImage(ALL_SUBCATAGORY_URL, activity ,bucard);
new LoadAllSubcatagories().execute();
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
}
class LoadAllSubcatagories extends AsyncTask<String, String, ArrayList<HashMap<String,String>>> {
ArrayAdapter<String> adapterallsubcatagory ;
private ProgressDialog pDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
/* pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Load All Subcatagories..");
pDialog.setIndeterminate(false);
// pDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.custom_progress));
pDialog.setCancelable(true);
pDialog.show();*/
}
protected ArrayList<HashMap<String,String>> doInBackground(String... args) {
ServiceHandler sh = new ServiceHandler();
// Making a request to url and getting response
subcatagorydata = new ArrayList<HashMap<String, String>>();
String jsonStr = sh.makeServiceCall(ALL_SUBCATAGORY_URL, ServiceHandler.GET);
Log.d("Response: ", "> " + jsonStr);
if (jsonStr != null) {
try {
//JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
//JSONArray data_array = new JSONArray(received);
state_list = new JSONArray(jsonStr);
// looping through All Contacts
for (int i = 0; i < state_list.length(); i++) {
JSONObject c = state_list.getJSONObject(i);
String card=state_list.getJSONObject(i).toString();
System.out.println("Card "+card);
androidAQuery.id(bucard).image(card, true, true);
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(ALL_SUBCATAGORY_ID, c.getString(ALL_SUBCATAGORY_ID));
subcatagorydata.add(map);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.e("ServiceHandler", "Couldn't get any data from the url");
}
return subcatagorydata;
}
protected void onPostExecute(ArrayList<HashMap<String,String>> result) {
}
}
}
首先...将 json 响应变成 string
.. 你的响应看起来像 link
.. 所以它是 link图像但不是图像.. 所以你需要 image loader
将图像从 link 加载到 imageview
.. 你可以 universal-image-loader
.. 从这个 link您可以下载 UIL
库...然后您可以使用它来加载图像
添加 UIL
然后使用它来加载图像
ImageLoader imageLoader = new ImageLoader(getApplicationContext());
ImageView Profileimage = (ImageView) findViewById(R.id.You_image_view);
imageLoader.DisplayImage(imageurl , Profileimage);
如果不知道如何使用 UIL 然后添加这个 java class(ImageLoader.java)
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.widget.ImageView;
public class ImageLoader {
MemoryCache memoryCache=new MemoryCache();
FileCache fileCache;
private Map<ImageView, String> imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
ExecutorService executorService;
public ImageLoader(Context context){
fileCache=new FileCache(context);
executorService=Executors.newFixedThreadPool(5);
}
final int stub_id=R.drawable.defaultpic;
public void DisplayImage(String url, ImageView imageView)
{
imageViews.put(imageView, url);
Bitmap bitmap=memoryCache.get(url);
Bitmap output;
if(bitmap!=null)
{
output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx = 9;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
imageView.setImageBitmap(output);
}
else
{
queuePhoto(url, imageView);
imageView.setImageResource(stub_id);
}
}
private void queuePhoto(String url, ImageView imageView)
{
PhotoToLoad p=new PhotoToLoad(url, imageView);
executorService.submit(new PhotosLoader(p));
}
private Bitmap getBitmap(String url)
{
File f=fileCache.getFile(url);
//from SD cache
Bitmap b = decodeFile(f);
if(b!=null)
return b;
//from web
try {
Bitmap bitmap=null;
URL imageUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is=conn.getInputStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
bitmap = decodeFile(f);
return bitmap;
} catch (Throwable ex){
ex.printStackTrace();
if(ex instanceof OutOfMemoryError)
memoryCache.clear();
return null;
}
}
//decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f){
try {
//decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(f),null,o);
//Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE=1024;
int width_tmp=o.outWidth, height_tmp=o.outHeight;
int scale=1;
while(true){
if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
break;
width_tmp/=2;
height_tmp/=2;
scale*=2;
}
//decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=scale;
return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
} catch (FileNotFoundException e) {}
return null;
}
//Task for the queue
private class PhotoToLoad
{
public String url;
public ImageView imageView;
public PhotoToLoad(String u, ImageView i){
url=u;
imageView=i;
}
}
class PhotosLoader implements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoad photoToLoad){
this.photoToLoad=photoToLoad;
}
public void run() {
if(imageViewReused(photoToLoad))
return;
Bitmap bmp=getBitmap(photoToLoad.url);
memoryCache.put(photoToLoad.url, bmp);
if(imageViewReused(photoToLoad))
return;
BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad);
Activity a=(Activity)photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
boolean imageViewReused(PhotoToLoad photoToLoad){
String tag=imageViews.get(photoToLoad.imageView);
if(tag==null || !tag.equals(photoToLoad.url))
return true;
return false;
}
//Used to display bitmap in the UI thread
class BitmapDisplayer implements Runnable
{
Bitmap bitmap;
Bitmap out;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b, PhotoToLoad p){bitmap=b;photoToLoad=p;}
public void run()
{
if(imageViewReused(photoToLoad))
return;
if(bitmap!=null)
{
out = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(out);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx = 9;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
photoToLoad.imageView.setImageBitmap(out);
}
else
{
photoToLoad.imageView.setImageResource(stub_id);
}
}
}
public void clearCache() {
memoryCache.clear();
fileCache.clear();
}
}
使用volley的networkimageView