Search code examples
androidandroid-parser

Parsing graph.facebook album


I'm working on parsing json from graph.facebook.com. I managed to get the json from graph.facebook.com. But the problem, that I'm getting now is that I can retrieve the value inside "id" from this graph. But while trying to retrieve value from album I'm gettin error like this.

07-04 16:40:46.939: E/AndroidRuntime(13450): FATAL EXCEPTION: AsyncTask #1
07-04 16:40:46.939: E/AndroidRuntime(13450): java.lang.RuntimeException: An error occured while executing doInBackground()
07-04 16:40:46.939: E/AndroidRuntime(13450):    at android.os.AsyncTask$3.done(AsyncTask.java:200)
07-04 16:40:46.939: E/AndroidRuntime(13450):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
07-04 16:40:46.939: E/AndroidRuntime(13450):    at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
07-04 16:40:46.939: E/AndroidRuntime(13450):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
07-04 16:40:46.939: E/AndroidRuntime(13450):    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
07-04 16:40:46.939: E/AndroidRuntime(13450):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
07-04 16:40:46.939: E/AndroidRuntime(13450):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
07-04 16:40:46.939: E/AndroidRuntime(13450):    at java.lang.Thread.run(Thread.java:1019)
07-04 16:40:46.939: E/AndroidRuntime(13450): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
07-04 16:40:46.939: E/AndroidRuntime(13450):    at android.os.Handler.<init>(Handler.java:121)
07-04 16:40:46.939: E/AndroidRuntime(13450):    at android.widget.Toast.<init>(Toast.java:68)
07-04 16:40:46.939: E/AndroidRuntime(13450):    at android.widget.Toast.makeText(Toast.java:231)
07-04 16:40:46.939: E/AndroidRuntime(13450):    at com.ministry.ensing119app.photos.GetPath$Message.doInBackground(GetPath.java:114)
07-04 16:40:46.939: E/AndroidRuntime(13450):    at com.ministry.ensing119app.photos.GetPath$Message.doInBackground(GetPath.java:1)
07-04 16:40:46.939: E/AndroidRuntime(13450):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
07-04 16:40:46.939: E/AndroidRuntime(13450):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
07-04 16:40:46.939: E/AndroidRuntime(13450):    ... 4 more
07-04 16:40:47.149: E/WindowManager(13450): Activity com.ministry.ensing119app.photos.GetPath has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40591a50 that was originally added here
07-04 16:40:47.149: E/WindowManager(13450): android.view.WindowLeaked: Activity com.ministry.ensing119app.photos.GetPath has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40591a50 that was originally added here
07-04 16:40:47.149: E/WindowManager(13450):     at android.view.ViewRoot.<init>(ViewRoot.java:265)
07-04 16:40:47.149: E/WindowManager(13450):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
07-04 16:40:47.149: E/WindowManager(13450):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
07-04 16:40:47.149: E/WindowManager(13450):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
07-04 16:40:47.149: E/WindowManager(13450):     at android.app.Dialog.show(Dialog.java:241)
07-04 16:40:47.149: E/WindowManager(13450):     at com.ministry.ensing119app.photos.GetPath$Message.onPreExecute(GetPath.java:159)
07-04 16:40:47.149: E/WindowManager(13450):     at android.os.AsyncTask.execute(AsyncTask.java:391)
07-04 16:40:47.149: E/WindowManager(13450):     at com.ministry.ensing119app.photos.GetPath.onCreate(GetPath.java:49)
07-04 16:40:47.149: E/WindowManager(13450):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-04 16:40:47.149: E/WindowManager(13450):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623)
07-04 16:40:47.149: E/WindowManager(13450):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
07-04 16:40:47.149: E/WindowManager(13450):     at android.app.ActivityThread.access$1500(ActivityThread.java:121)
07-04 16:40:47.149: E/WindowManager(13450):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
07-04 16:40:47.149: E/WindowManager(13450):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-04 16:40:47.149: E/WindowManager(13450):     at android.os.Looper.loop(Looper.java:123)
07-04 16:40:47.149: E/WindowManager(13450):     at android.app.ActivityThread.main(ActivityThread.java:3701)
07-04 16:40:47.149: E/WindowManager(13450):     at java.lang.reflect.Method.invokeNative(Native Method)
07-04 16:40:47.149: E/WindowManager(13450):     at java.lang.reflect.Method.invoke(Method.java:507)
07-04 16:40:47.149: E/WindowManager(13450):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862)
07-04 16:40:47.149: E/WindowManager(13450):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
07-04 16:40:47.149: E/WindowManager(13450):     at dalvik.system.NativeStart.main(Native Method)

My code to parse json goes like this.

getSource.java

import com.ministry.ensing119app.HomeScreen;
import com.ministry.ensing119app.R;

import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.AsyncTask;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class GetPath extends Activity {

    public static String url = "http://graph.facebook.com/fundamentalalvarado/?fields=albums.fields(photos.fields(source))";
    public String[] IMAGES;

        // JSON Node names
        protected static final String TAG_PRODUCTS = "image_path";
        protected static final String TAG_CID = "file_id";
        public static final String TAG_NAME = "file_name";

        // contacts JSONArray  
        JSONArray products = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ConnectivityManager connectivityManager 
        = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();


        if ((activeNetworkInfo != null && activeNetworkInfo.isConnected())) {
            Log.d("if condition", "if condition is running");
            new Message().execute(url);

        } else {
            Log.d("if condition", "else condition is running");
        Toast.makeText(getApplicationContext(), "The internet is not present or low. Please check", Toast.LENGTH_LONG).show();
        Intent returnIntent = new Intent(GetPath.this, HomeScreen.class);
        startActivity(returnIntent);
        }
    }

    class Message extends AsyncTask<String, Integer, ArrayList<HashMap<String, String>> > {
        ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
        ProgressDialog progress = new ProgressDialog(GetPath.this);
        JSONParser jParser = new JSONParser();
                @Override
            protected ArrayList<HashMap<String, String>> doInBackground(String... params) {

                    Log.d("doInBackgound","backgound is running");

                    // getting JSON string from URL
                    JSONObject json = jParser.getJSONFromUrl(url);
                    Log.d("Json", json.toString());

                    Log.d("path_parsing", "before parsing");
                    try {
                            Log.d("json id", json.getString("id"));
                            JSONArray albumArray = json.getJSONArray("albums");
                            for(int i=0; i<albumArray.length();i++){
                                JSONArray dataArray = albumArray.getJSONObject(i).getJSONArray("data");
                                Log.d("jsons", dataArray.toString());
                                for(int j=0;j<dataArray.length();j++){
                                    JSONArray photoArray = dataArray.getJSONObject(j).getJSONArray("photos");
                                    Log.d("jsons", photoArray.toString());
                                    for(int k=0; k<photoArray.length();k++){
                                        JSONArray dataArray1 = photoArray.getJSONObject(k).getJSONArray("data");
                                        Log.d("jsons", dataArray1.toString());
                                        for(int l=0;l<dataArray1.length();l++){
                                            String source = dataArray1.getJSONObject(l).getString("source");
                                        }
                                    }
                                }
                            }

                        // Getting Array of Contacts
                    } catch (JSONException e) {
                        Toast.makeText(getApplicationContext(), "Cannot get the images", Toast.LENGTH_LONG).show();
                        Intent goBack = new Intent(GetPath.this,GridActivity.class);
                        startActivity(goBack);
                        e.printStackTrace();
                    }
                    Log.d("path_parsing", "after parsing");
                    return mylist;

                }

            @Override
            protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
                if(progress.isShowing()){
                    progress.cancel();
                }
                IMAGES = new String[result.size()];
                for(int i=0; i<result.size(); i++){
                   IMAGES[i] = result.get(i).get("file_name");
                }
                for(String path: IMAGES){
                    Log.d("path", path.toString());
                }
                Log.d("postExecute","Postexecute is running");

                Bundle b=new Bundle();
                b.putStringArray("IMAGES", IMAGES);
                Intent i=new Intent(GetPath.this, GridActivity.class);
                i.putExtras(b);
                startActivity(i);
                GetPath.this.finish();
            }

            @Override
            protected void onProgressUpdate(Integer... values) {
                // TODO Auto-generated method stub
                super.onProgressUpdate(values);

            }

            @Override
            protected void onPreExecute() {
                // TODO Auto-generated method stub
                super.onPreExecute();
                progress.setTitle("Loading");
                progress.setMessage("Retrieving Images");
                progress.show();
            }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.get_path, menu);
        return true;
    }
}

Can anyone please tell me where I'm going wrong. I'm newbie to android.


Solution

  • After many hours of scratching head, came to this solution. Not much efficient one, but it will do the things you need.

    JSONObject albumObj = json.getJSONObject("albums");
    //                          Log.d("Json values", albumObj.toString());
                                JSONArray dataArray1 = albumObj.getJSONArray("data");
                                for(int i=0; i<dataArray1.length(); i++){
    //                              Log.d("data id", dataArray1.getJSONObject(i).getString("id"));
                                    JSONObject photoObj= dataArray1.getJSONObject(i).getJSONObject("photos");
    //                              Log.d("photo object", photoObj.toString());
                                    JSONArray dataArray2 = photoObj.getJSONArray("data");
                                    for(int j=0; j<dataArray2.length();j++){
                                        Log.d("source", dataArray2.getJSONObject(j).getString("source"));
                                        source = dataArray2.getJSONObject(j).getString("source");
    
    }