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: screenshoot.png

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ôiChuyệ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_pagespublish_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.