Sử dụng Graph API của Facebook cho chức năng post photo trên Android
Việc tích hợp các mạng xã hội phổ biến nhất hiện nay như Facebook, Twitter, Google+ vào trong những ứng dụng mobile là rất phổ biến. Nếu bạn được yêu cầu xây dựng một màn hình như sau: Những yêu cầu được khách hàng đưa ra là: Post 1 photo và comment lên timeline người dùng Facebook. ...
Việc tích hợp các mạng xã hội phổ biến nhất hiện nay như Facebook, Twitter, Google+ vào trong những ứng dụng mobile là rất phổ biến.
Nếu bạn được yêu cầu xây dựng một màn hình như sau:
Những yêu cầu được khách hàng đưa ra là:
- Post 1 photo và comment lên timeline người dùng Facebook.
- Lấy được các page của người dùng và post 1 photo và comment lên timeline của page đó.
Trong bài viết này tôi sẽ hướng dẫn bạn chi tiết để thực hiện 2 yêu cầu trên.
Trước khi đi vào chi tiết của bài viết, tôi giả sử rằng bạn đã hoàn thiện xong chức năng login của Facebook (Tham Khảo). Ở đây tôi đang sử dụng Facebook SDK version 4.2.
Post 1 photo và comment lên timeline người dùng Facebook
Đây là hàm dùng để post photo và comment sử dụng Graph API của Facebook.
private void upPhoto2Facebook(AccessToken accessToken){ Bitmap bitmap = Your Bitmap if(bitmap == null){ return; } ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); byte[] byteArray = stream.toByteArray(); Bundle params = new Bundle(); params.putString("caption", YOUR COMMENT); params.putByteArray("object_attachment", byteArray); GraphRequest request = new GraphRequest(accessToken, "/me/photos", params, HttpMethod.POST, new GraphRequest.Callback() { @Override public void onCompleted(GraphResponse graphResponse) { Log.d("Facebook debug", graphResponse.toString()); if (graphResponse.getError() == null){ Toast.makeText(FRPostActivity.this, "Success!",Toast.LENGTH_SHORT ).show(); } else { Toast.makeText(FRPostActivity.this, graphResponse.getError().toString(), Toast.LENGTH_SHORT).show(); } } }); request.executeAsync(); }
Theo Policy mới của Facebook để post lên timeline của người dùng bạn cần phải có **permission publish_actions **. Vậy làm sao để bạn có được quyền này ?? Để có được quyền publish_acitons bạn phải submit ứng dụng của bạn cho Facebook review (Bạn có thể tham khảo chi tiết về cách submit app của bạn cho Facebook review tại đây).
Post 1 photo và comment lên timeline của page
Trong hình trên bạn có thể nhìn thấy rằng tôi có 2 page là Việt Nam Quê Hương Tôi và Chuyện Thiếu Nhi với các thumbnail tương ứng.Làm sao để tôi có thể post 1 photo và comment lên timeline của các page đó ? Để làm được điều đó trước hết bạn phải lấy được các thông tin các page của người dùng.
**Lấy thông tin các page của người dùng: **
private void getFacebookPageUser(final AccessToken accessToken){ Bundle parameter = new Bundle(); parameter.putString("fields", "picture,access_token,name"); GraphRequest request = new GraphRequest(accessToken, "me/accounts", parameter, HttpMethod.GET, new GraphRequest.Callback() { @Override public void onCompleted(GraphResponse graphResponse) { Log.d("Facebookdebug","get page : " + graphResponse.toString()); if (graphResponse.getError() == null){ String result = graphResponse.getJSONObject()); } else { Toast.makeText(FRPostActivity.this, "Get Page fail", Toast.LENGTH_SHORT).show(); } } } }); request.executeAsync(); }
Với phương thức trên bạn sẽ nhận được 1 chuỗi JSon trả về với định dạng như sau:
{ "data": [ { "id": "1086029411413335", "name": Việt Nam Quê Hương Tôi, "access_token": CAACEdEose0cBAEXBpt4ZBnPcndx3cYrLicYcC2KMxEJZApBAZCPWcCqyhCEzvyfqTeeqkIi0Xf0uYVhqshvfKIbH74B4EloQ4sZB2QEiZC2W2jL5zMZA37GswJpcZBU6HyZAZBqIVUrmUDmJgNWphn19DXvnyqZBckqwkQDYJXaBBZBM5tqxZAgYLKpXA9xapLXGd7kZAMYBdHgIl6AZDZD, "picture": { "data": { "is_silhouette": false, "url": https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xfa1/v/t1.0-1/c14.0.50.50/p50x50/11214389_1086029681413308_568246372526712359_n.jpg?oh=bfea1b6ec64d0c98a96571673bd603be&oe=55E905E4&__gda__=1444694731_89bc7635dcda543f32af42c91f5be2f4 } } }, { "id": "914770371894753", "name": Truyện Thiếu Nhi, "access_token": CAACEdEose0cBAFOTuuZCrVZBdph7YgzZCEOPgQpC6wVBsGnzBeqWfUh8NXZChIrUMPV8YZBd3b02YGRbKBE6npQPyFz4QaxCs57Jgj8KZAPvXe41GcbuZAtwSZCJyFmmXwwZBdYWZAZCqhw22IqRkHV9QYXzbAEeU3g2Qtgjs9JZArsTtlUJa572jGYZA5Y2YPSx4OrY1akDCWMRyGQZDZD, "picture": { "data": { "is_silhouette": false, "url": https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xta1/v/t1.0-1/c9.0.50.50/p50x50/1557627_914771145228009_7171915038095486718_n.jpg?oh=751894d84eed058ad96f3a946a993e63&oe=55EC8278&__gda__=1445126123_28c09b6f052920c90f3b4c309f214e54 } } } ], "paging": { "cursors": { "before": MTA4NjAyOTQxMTQxMzMzNQ==, "after": OTE0NzcwMzcxODk0NzUz } } }
**Post photo và comment tới page: ** Để post 1 photo và comment lên timeline 1 page bạn cần phải phải biết id và access_token của page đó:
{ "id": "1086029411413335", "name": Việt Nam Quê Hương Tôi, "access_token": CAACEdEose0cBAEXBpt4ZBnPcndx3cYrLicYcC2KMxEJZApBAZCPWcCqyhCEzvyfqTeeqkIi0Xf0uYVhqshvfKIbH74B4EloQ4sZB2QEiZC2W2jL5zMZA37GswJpcZBU6HyZAZBqIVUrmUDmJgNWphn19DXvnyqZBckqwkQDYJXaBBZBM5tqxZAgYLKpXA9xapLXGd7kZAMYBdHgIl6AZDZD, "picture": { "data": { "is_silhouette": false, "url": https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xfa1/v/t1.0-1/c14.0.50.50/p50x50/11214389_1086029681413308_568246372526712359_n.jpg?oh=bfea1b6ec64d0c98a96571673bd603be&oe=55E905E4&__gda__=1444694731_89bc7635dcda543f32af42c91f5be2f4 } } }
private void upPhoto2FbPage(AccessToken accessToken,String pageId, String page_token){ Bitmap bitmap = YOUR BITMAP if(bitmap == null){ return; } ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); byte[] byteArray = stream.toByteArray(); Bundle params = new Bundle(); params.putString("caption", YOUR COMMENT); params.putByteArray("object_attachment", byteArray); params.putString("access_token",page_token); GraphRequest request = new GraphRequest(accessToken, "/" + pageId + "/photos", params, HttpMethod.POST, new GraphRequest.Callback() { @Override public void onCompleted(GraphResponse graphResponse) { Log.d("Facebookdebug", graphResponse.toString()); if (graphResponse.getError() == null){ Toast.makeText(FRPostActivity.this, "Success!",Toast.LENGTH_SHORT ).show(); } else { Toast.makeText(FRPostActivity.this, graphResponse.getError().toString(), Toast.LENGTH_SHORT).show(); } } }); request.executeAsync(); }
Để lấy được các page và post lên timeline của page bạn cần phải có 2 **permission ** là manage_pages và publish_pages:
-
manage_pages là permission dùng để lấy các page của người dung.
-
publish_pages là permission dùng để post bài lên timeline của page.