android - Facebook GraphRequest 获取相册列表或创建一个 android

标签 android facebook facebook-graph-api

Facebook 最近将他们的 SDK 更新到 V 2.0,实际上我的应用程序必须升级才能调用 v2.0 或更高版本。 一些修改是

*Session 被 Accesstoken 取代。

到目前为止,我可以在他们的帐户上使用 GraphRequest API 登录并发布视频/图像。下一步是获取用户的相册列表

doc

/* 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();

但是更新后的 SDK 没有 Request API,它也不允许 session ,还是我解释错了?

有没有人找到解决方案?

最佳答案

在 onCreate() 方法中,我调用这个 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);
}

}

为了完整起见,这是我用来获取永无止境列表的分页 URL 的方法:

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);
}

}

loadMoreAlbums 异步任务从 onCreate() 中的 onScrollListener 设置运行:

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();
            }

        }
    }
});

您可以从我的代码中选择相关部分,也可以完整地使用它(当然是在填写一些空白之后)。希望其中一些有所帮助。

关于android - Facebook GraphRequest 获取相册列表或创建一个 android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30183141/

相关文章:

javascript - Facebook 点赞、图像关联

android - 在操作栏中设置 fragment 内的自定义 View

android - 在 Android 中单击编辑文本时显示微调器?

android - 如何更改 ListView 内容的字体大小

facebook - facebook 之类的按钮有 i18n 功能吗?

c# - 如何处理这个 JSON 数据?

android - 检测程序焦点的变化

Facebook oauth 检索用户电子邮件

javascript - Facebook 垃圾邮件代码说明

iphone - 使用图形 API 获取好友状态更新