[英]Android Facebook Albums Display using Facebook Android sdk
I am building an android app in which i am using facebook android sdk to get login into facebook. 我正在构建一个Android应用程序,其中我使用Facebook android sdk登录到Facebook。 The login part went smoothly but now i am hang how to display albums in gridview after getting login into facebook. 登录部分顺利进行,但现在我挂起了如何在登录facebook后在gridview中显示专辑。 When all albums would get display in grid view, then when i click on any one album it must opened with check box on top left of each image . 当所有专辑都以网格视图显示时,当我点击任何一个专辑时,必须打开每个图像左上角的复选框。 So that when i check the check box of particular image it must be saved in device sd card and other functionality the checked images must get collage in table layout having tablerow & background color for each table row. 因此,当我选中特定图像的复选框时,它必须保存在设备SD卡和其他功能中,选中的图像必须以表格布局拼贴,每个表格行具有桌面和背景颜色。 I will attach some files so you can have idea what i want. 我会附上一些文件,这样你就可以知道我想要什么。 Hoping for your positive reply for the same. 希望你的肯定回复。 So please send full source code for the same. 所以请发送相同的完整源代码。 I am trying it from last 20 days but i didnt succeed :-( Hoping for the reply soon. 我在过去20天尝试它但我没有成功:-(希望尽快回复。
enter code here
public class Albums extends Activity{ private static final String APP_ID = "1403104849907306"; enter code here
public class Albums extends Activity {private static final String APP_ID =“1403104849907306”; private Facebook facebook = new Facebook(APP_ID); 私人Facebook facebook =新Facebook(APP_ID);
// HOLD THE URL TO MAKE THE API CALL TO
private String URL;
// STORE THE PAGING URL
private String pagingURL;
// FLAG FOR CURRENT PAGE
int current_page = 1;
// BOOLEAN TO CHECK IF NEW FEEDS ARE LOADING
Boolean loadingMore = true;
Boolean stopLoadingData = false;
ArrayList<getAlbums> arrAlbums = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.display);
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... arg0) {
// 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/" + "100005623513169"
+ "/photos&access_token="
+ facebook.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");
// IN MY CODE, I GET THE NEXT PAGE LINK HERE
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/"
+ "100005623513169" + "/albums&access_token="
+ facebook.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="
+ facebook.getAccessToken());
} else {
albums.setAlbumCover("https://graph.facebook.com/"
+ JOAlbums.getString("id")
+ "/picture?type=album"
+ "&access_token="
+ facebook.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) {
ListView lv = null;
ListAdapter adapter = null;
// 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);
}
}
class loadMoreAlbums extends AsyncTask<Void, Void, Void> {
LinearLayout linlaProgressBar = (LinearLayout)findViewById(R.id.linlaProgressBar);
@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/"
+ "100005623513169" + "/albums&access_token="
+ facebook.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="
+ facebook
.getAccessToken());
} else {
albums.setAlbumCover("https://graph.facebook.com/"
+ JOAlbums.getString("id")
+ "/picture?type=album"
+ "&access_token="
+ facebook
.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) {
AdapterView<ListAdapter> lv = null;
// 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
AlbumsAdapter adapter = new AlbumsAdapter(Albums.this, arrAlbums);
lv.setAdapter(adapter);
// Setting new scroll position
((ListView) 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);
}
}
}
} }
You should use Facebook SDK 3.0+ for Android, and take advantage of their Request.executeAsync() method. 您应该使用适用于Android的Facebook SDK 3.0+,并利用其Request.executeAsync()方法。 After logging the user into the app and retrieving the Session object, you can make requests on the Graph API. 将用户登录到应用程序并检索Session对象后,您可以在Graph API上发出请求。 Here is my method for requesting a user's albums: 这是我申请用户相册的方法:
/**
* Makes a request for user's photo albums from Facebook Graph API
* @param session
*/
private void fetchAlbumsFromFB(Session session) {
// callback after Graph API response with user object
Request.GraphUserCallback graphUserCallback;
graphUserCallback = new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
JSONObject jsonObject = null;
if (user != null)
jsonObject = user.getInnerJSONObject();
ImageAdapter.getInstance().setPhotoAlbums(jsonObject);
}
};
// assign callback to final instance variable in inner class
final Request.GraphUserCallback finalCallback = graphUserCallback;
Request.Callback wrapperCallback = new Request.Callback() {
@Override
public void onCompleted(Response response) {
finalCallback.onCompleted(response.getGraphObjectAs(GraphUser.class), response);
}
};
// make a new async request
Bundle params = new Bundle();
params.putString("fields", "photos");
Request request = new Request(session, "me/albums", params, null, wrapperCallback);
request.executeAsync();
}
Then you can parse the JSON response like this: 然后你可以像这样解析JSON响应:
/**
* Updates the array with cover photos from albums
*
* @param photosObject
*/
public void setPhotoAlbums(JSONObject photosObject) {
try {
mPhotoAlbumsArray = photosObject.getJSONArray("data");
coverPhotosArr = new String[mPhotoAlbumsArray.length()];
for (int i = 0; i < mPhotoAlbumsArray.length(); i++) {
JSONObject obj1 = mPhotoAlbumsArray.getJSONObject(i);
JSONObject obj2 = (JSONObject) obj1.get("photos");
JSONArray obj3 = obj2.getJSONArray("data");
JSONObject obj4 = obj3.getJSONObject(0);
String picture = String.valueOf(obj4.get("picture"));
coverPhotosArr[i] = picture;
}
// notify GridView's adapter that underlying data has been changed
notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.