如何使用图形API获取Facebook用户的照片相册?

3
我该如何从Facebook获取用户的所有照片集?我尝试了以下方式使用此URL:https://graph.facebook.com/me/albums?access_token=xxxx 我正在使用此代码,并已提及这些权限:"user_photos"
Bundle parameters = new Bundle();
parameters.putString("format", "json");
parameters.putString("method", "user_photos");
parameters.putString(TOKEN, facebook.getAccessToken());

JSONObject response = null;        
try {

    response = Util.parseJson(Album_Url);        
    JSONArray array = obj.optJSONArray("data");
    for(int i = 0; i<array.length(); i++){                  
    JSONObject main_obj = array.getJSONObject(i);
    String album = main_obj.getString("name");                          
    }        
} catch (JSONException e1) {             
    e1.printStackTrace();
} catch (FacebookError e1) {             
    e1.printStackTrace();
}

但是我在日志中看到了以下信息:09-12 14:27:42.990: W/System.err(12189): org.json.JSONException: Value https of type java.lang.String cannot be converted to JSONObject

我也尝试过这样做:

try {

        Bundle parameters = new Bundle();
        parameters.putString("format", "json");
        parameters.putString(TOKEN, facebook.getAccessToken()) ;       
        String response = null;
        try {
            response = Util.openUrl(Album_Url, "GET", parameters);
        } catch (MalformedURLException e) {      
            e.printStackTrace();
        } catch (IOException e) {        
            e.printStackTrace();
        }
        JSONObject obj = Util.parseJson(response);   
        JSONArray array = obj.optJSONArray("data");
        for(int i = 0; i<array.length(); i++){                  
            JSONObject main_obj = array.getJSONObject(i);
            String album =  main_obj.getString("name");                         
        }        
    } catch (JSONException e1) {             
        e1.printStackTrace();
    } catch (FacebookError e1) {             
        e1.printStackTrace();
    }   

我遇到了这个错误:09-12 14:42:36.920: W/System.err(12259): com.facebook.android.FacebookError: Malformed access token

你是在寻找适合你当前代码的特定解决方案吗?还是另一种方法更适合你?我有一个不同的实现,可以很好地处理分页等问题。 - Siddharth Lele
我想要解决方案,无论是什么方法都可以,即使是不同的方法也没有问题。请分享代码,我会尝试。 - RajaReddy PolamReddy
好的。虽然有点长,而且你还需要填几个空。但我相信你会做到的....;-) - Siddharth Lele
我会尝试填写空白,如果不可能的话我会让您知道并请求您的帮助。 - RajaReddy PolamReddy
你是如何获取Album_Url的? - IgorGanapolsky
1个回答

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

}

为了完整起见,以下是我使用的方法来获取无限滚动列表中的分页URLS:
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);
    }

}
< p > loadMoreAlbums Asynctask 是从在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();
                }

            }
        }
    });

你可以从我的代码中选择相关部分,或者在填写一些空白后使用它的全部内容。希望这些内容对你有所帮助。

我在这行代码中遇到了错误:Albums.this.runOnUiThread(run); - rams
@ram0801:这是在 Activity 还是 Fragment 中?如果是在 Activity 中,请将 Albums.this.runOnUiThread(run); 替换为 YOUR_ACTIVITY.this.runOnUiThread(run); - Siddharth Lele
@IceMAN,一年多以后我又来找你了(你可以看到我一年前就在试图让它工作)。我仍在努力让它工作,但没有成功。我已经设置好了你提供的所有代码,并且已经完全调试了我的应用程序,我意识到我的代码没有通过“if (rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {”这部分。Facebook sdk改变了吗?我确保我已经登录并拥有用户ID和访问令牌。再次感谢。 - Jack
@Jack:自从上次以来,Facebook SDK已经发生了巨大的变化。我不确定上面发布的代码是否有效。我已经很长时间没有使用SDK了。让我看看能否找到一些更实时的东西,可能对你有所帮助。 - Siddharth Lele
@IceMAN非常感谢。我花了6个小时试图让它工作,以为自己要疯了。我已经查看了更新的文档,似乎与上面的代码没有太大变化。 - Jack
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接