android - 从url解析图片

标签 android json aquery

我正在尝试从服务器解析图像,并且我正在使用查询,在我的 Logcat 响应中显示但图像未显示!以下是我的Json响应和代码 fragment 。

有人能帮忙吗?

 [
       {
      "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 .. 所以它是一个图像链接但不是图像 .. 那么你需要 image loader 将图像从链接加载到 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 类(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();
}

}

关于android - 从url解析图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28554714/

相关文章:

java - 设置整个盒子的可见性

android - 想要从其他 Activity 更改 TextView 的文本?

php - 我的 Codeigniter 使用 ajax 自动完成

java - 像 Qt 中那样没有 hashmap 的查询帖子

android - AQuery 不会在 Android Studio 中加载图像

java - 如何知道当前运行的应用程序是android中的某个消息应用程序

android - 人脸特征检测使用OpenCV Android

json - 通过变量将 JSON 传递给 YAML

javascript - 如何从给定 URL 中的 JSON 数据读取 'extract' 字段