如何从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();
}但是我在log cat 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
发布于 2012-09-12 17:59:33
在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);
    }
}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();
                }
            }
        }
    });您可以从我的代码中选择相关的部分,也可以完整地使用它(当然是在填充了几个空白之后)。希望这能对你有所帮助。
https://stackoverflow.com/questions/12384717
复制相似问题