hardik m hardik m - 4 months ago 31
Android Question

Facebook GraphRequest get list of albums or create one android

Facebook has recently updated their SDK to V 2.0,In effect my app must be upgraded to make calls to v2.0 or greater.
Some modifications are

*Session is replaced by Accesstoken.

So far i can login and post a video/images using GraphRequest API on their account.next step is getting user's list of albums

The doc says

/* make the API call */
new Request(
session,
"/{user-id}/albums",
null,
HttpMethod.GET,
new Request.Callback() {
public void onCompleted(Response response) {
/* handle the result */
}
}
).executeAsync();


but updated SDK doesn't has Request API neither it allows session or am i interpreting it wrong?

Has anyone found the solution yet?

Answer

In the onCreate() method, I am calling this Asynctask:

private class getAlbumsData extends AsyncTask<Void, Void, Void> {

LinearLayout linlaHeaderProgress = (LinearLayout) findViewById(R.id.linlaHeaderProgress);

@Override
protected void onPreExecute() {

    // SHOW THE PROGRESS BAR (SPINNER) WHILE LOADING ALBUMS
    linlaHeaderProgress.setVisibility(View.VISIBLE);
}

@Override
protected Void doInBackground(Void... params) {

    // CHANGE THE LOADING MORE STATUS TO PREVENT DUPLICATE CALLS FOR
    // MORE DATA WHILE LOADING A BATCH
    loadingMore = true;

    // SET THE INITIAL URL TO GET THE FIRST LOT OF ALBUMS
    URL = "https://graph.facebook.com/" + initialUserID
            + "/albums&access_token="
            + Utility.mFacebook.getAccessToken() + "?limit=10";

    try {

        HttpClient hc = new DefaultHttpClient();
        HttpGet get = new HttpGet(URL);
        HttpResponse rp = hc.execute(get);

        if (rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
            String queryAlbums = EntityUtils.toString(rp.getEntity());

            JSONObject JOTemp = new JSONObject(queryAlbums);

            JSONArray JAAlbums = JOTemp.getJSONArray("data");

            if (JAAlbums.length() == 0) {
                stopLoadingData = true;
                Runnable run = new Runnable() {

                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                "No more Albums", Toast.LENGTH_SHORT)
                                .show();
                    }
                };
                Albums.this.runOnUiThread(run);

            } else {
                // PAGING JSONOBJECT
                if (JOTemp.has("paging"))   {
                    JSONObject JOPaging = JOTemp.getJSONObject("paging");

                    if (JOPaging.has("next")) {
                        String initialpagingURL = JOPaging
                                .getString("next");

                        String[] parts = initialpagingURL.split("limit=10");
                        String getLimit = parts[1];

                        pagingURL = "https://graph.facebook.com/"
                                + initialUserID + "/albums&access_token="
                                + Utility.mFacebook.getAccessToken()
                                + "?limit=10" + getLimit;

                    } else {
                        stopLoadingData = true;
                        Runnable run = new Runnable() {

                            @Override
                            public void run() {
                                Toast.makeText(getApplicationContext(),
                                        "No more Albums",
                                        Toast.LENGTH_SHORT).show();
                            }
                        };
                        Albums.this.runOnUiThread(run);
                    }
                } else {
                    stopLoadingData = true;
                    Runnable run = new Runnable() {

                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),
                                    "No more Albums",
                                    Toast.LENGTH_SHORT).show();
                        }
                    };
                    Albums.this.runOnUiThread(run);

                }

                getAlbums albums;

                for (int i = 0; i < JAAlbums.length(); i++) {
                    JSONObject JOAlbums = JAAlbums.getJSONObject(i);

                    if (JOAlbums.has("link")) {

                        albums = new getAlbums();

                        // GET THE ALBUM ID
                        if (JOAlbums.has("id")) {
                            albums.setAlbumID(JOAlbums.getString("id"));
                        } else {
                            albums.setAlbumID(null);
                        }

                        // GET THE ALBUM NAME
                        if (JOAlbums.has("name")) {
                            albums.setAlbumName(JOAlbums
                                    .getString("name"));
                        } else {
                            albums.setAlbumName(null);
                        }

                        // GET THE ALBUM COVER PHOTO
                        if (JOAlbums.has("cover_photo")) {
                            albums.setAlbumCover("https://graph.facebook.com/"
                                    + JOAlbums.getString("cover_photo")
                                    + "/picture?type=normal"
                                    + "&access_token="
                                    + Utility.mFacebook
                                            .getAccessToken());
                        } else {
                            albums.setAlbumCover("https://graph.facebook.com/"
                                    + JOAlbums.getString("id")
                                    + "/picture?type=album"
                                    + "&access_token="
                                    + Utility.mFacebook
                                            .getAccessToken());
                        }

                        // GET THE ALBUM'S PHOTO COUNT
                        if (JOAlbums.has("count")) {
                            albums.setAlbumPhotoCount(JOAlbums
                                    .getString("count"));
                        } else {
                            albums.setAlbumPhotoCount("0");
                        }

                        arrAlbums.add(albums);
                    }
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

@Override
protected void onPostExecute(Void result) {

    // SET THE ADAPTER TO THE LISTVIEW
    lv.setAdapter(adapter);

    // CHANGE THE LOADING MORE STATUS
    loadingMore = false;

    // HIDE THE PROGRESS BAR (SPINNER) AFTER LOADING ALBUMS
    linlaHeaderProgress.setVisibility(View.GONE);
}

}

For the sake of completeness, here is what I use to fetch the Paging URLS for a never ending list:

private class loadMoreAlbums extends AsyncTask<Void, Void, Void> {

@Override
protected void onPreExecute() {
    // SHOW THE BOTTOM PROGRESS BAR (SPINNER) WHILE LOADING MORE ALBUMS
    linlaProgressBar.setVisibility(View.VISIBLE);
}

@Override
protected Void doInBackground(Void... params) {

    // SET LOADING MORE "TRUE"
    loadingMore = true;

    // INCREMENT CURRENT PAGE
    current_page += 1;

    // Next page request
    URL = pagingURL;
    // Log.e("NEW URL", URL);

    try {

        HttpClient hc = new DefaultHttpClient();
        HttpGet get = new HttpGet(URL);
        HttpResponse rp = hc.execute(get);

        if (rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
            String queryAlbums = EntityUtils.toString(rp.getEntity());
            // Log.e("RESULT", queryAlbums);

            JSONObject JOTemp = new JSONObject(queryAlbums);

            JSONArray JAAlbums = JOTemp.getJSONArray("data");

            if (JAAlbums.length() == 0) {
                stopLoadingData = true;

                Runnable run = new Runnable() {

                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                "No more Albums", Toast.LENGTH_SHORT)
                                .show();
                    }
                };
                Albums.this.runOnUiThread(run);

            } else {
                // PAGING JSONOBJECT
                JSONObject JOPaging = JOTemp.getJSONObject("paging");
                // Log.e("PAGING", JOPaging.toString());

                if (JOPaging.has("next")) {
                    String initialpagingURL = JOPaging
                            .getString("next");
                    // Log.e("initialpagingURL", initialpagingURL);

                    String[] parts = initialpagingURL.split("limit=10");
                    String getLimit = parts[1];

                    pagingURL = "https://graph.facebook.com/"
                            + initialUserID + "/albums&access_token="
                            + Utility.mFacebook.getAccessToken()
                            + "?limit=10" + getLimit;
                    // Log.e("NEW PAGING URL", pagingURL);

                } else {
                    stopLoadingData = true;
                    Runnable run = new Runnable() {

                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),
                                    "No more Albums available",
                                    Toast.LENGTH_SHORT).show();
                        }
                    };
                    Albums.this.runOnUiThread(run);
                }

                getAlbums albums;

                for (int i = 0; i < JAAlbums.length(); i++) {
                    JSONObject JOAlbums = JAAlbums.getJSONObject(i);
                    // Log.e("INDIVIDUAL ALBUMS", JOAlbums.toString());

                    if (JOAlbums.has("link")) {

                        albums = new getAlbums();

                        // GET THE ALBUM ID
                        if (JOAlbums.has("id")) {
                            albums.setAlbumID(JOAlbums.getString("id"));
                        } else {
                            albums.setAlbumID(null);
                        }

                        // GET THE ALBUM NAME
                        if (JOAlbums.has("name")) {
                            albums.setAlbumName(JOAlbums
                                    .getString("name"));
                        } else {
                            albums.setAlbumName(null);
                        }

                        // GET THE ALBUM COVER PHOTO
                        if (JOAlbums.has("cover_photo")) {
                            albums.setAlbumCover("https://graph.facebook.com/"
                                    + JOAlbums.getString("cover_photo")
                                    + "/picture?type=album"
                                    + "&access_token="
                                    + Utility.mFacebook
                                            .getAccessToken());
                        } else {
                            albums.setAlbumCover("https://graph.facebook.com/"
                                    + JOAlbums.getString("id")
                                    + "/picture?type=album"
                                    + "&access_token="
                                    + Utility.mFacebook
                                            .getAccessToken());
                        }

                        // GET THE ALBUM'S PHOTO COUNT
                        if (JOAlbums.has("count")) {
                            albums.setAlbumPhotoCount(JOAlbums
                                    .getString("count"));
                        } else {
                            albums.setAlbumPhotoCount("0");
                        }

                        arrAlbums.add(albums);
                    }
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

@Override
protected void onPostExecute(Void result) {

    // get listview current position - used to maintain scroll position
    int currentPosition = lv.getFirstVisiblePosition();

    // APPEND NEW DATA TO THE ARRAYLIST AND SET THE ADAPTER TO THE
    // LISTVIEW
    adapter = new AlbumsAdapter(Albums.this, arrAlbums);
    lv.setAdapter(adapter);

    // Setting new scroll position
    lv.setSelectionFromTop(currentPosition + 1, 0);

    // SET LOADINGMORE "FALSE" AFTER ADDING NEW FEEDS TO THE EXISTING
    // LIST
    loadingMore = false;

    // HIDE THE BOTTOM PROGRESS BAR (SPINNER) AFTER LOADING MORE ALBUMS
    linlaProgressBar.setVisibility(View.GONE);
}

}

The loadMoreAlbums Asynctask is run from a onScrollListener setup in the onCreate():

lv.setOnScrollListener(new OnScrollListener() {

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {

    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        int lastInScreen = firstVisibleItem + visibleItemCount;
        if ((lastInScreen == totalItemCount) && !(loadingMore)) {

            if (stopLoadingData == false) {
                // FETCH THE NEXT BATCH OF FEEDS
                new loadMoreAlbums().execute();
            }

        }
    }
});

You can choose the relevant parts from my code, or you can use it in it's entirety (after filling a few blanks of course). Hope some of this helps.

Comments