[Facebook SDK ] Cách chia sẻ link hình ảnh và invite friend trên ứng dụng android

1. Yêu cầu đã Setup SDK

Bước đầu tiên để bắt đầu chúng ta cần setup sdk của facebook vào ứng dụng, bài viết này được viết tiếp tục trên project của bài viết đầu tiên nên các bạn có thể xem lại tại các link dưới đây:
Setup: cài đặt sdk facebook
Login: Login facebook trên android

2. Giới thiệu tính năng share của sdk

Tài liệu chính được tham khảo tại đây: Click hướng dẫn rất cụ thể nên mình chỉ nói sơ lượt và làm một sample nhỏ.

Facebook SDK hỗ trợ cho chúng ta chia sẻ nhiều nội dung như: Liên kết, Hình ảnh, video, đa phương tiện, quote…

  • Khi mọi người chia sẻ liên kết từ ứng dụng của bạn lên Facebook, liên kết đó bao gồm các thuộc tính hiển thị trong bài viết:

    • contentURL, liên kết sẽ chia sẻ
    • contentTitle, thể hiện tiêu đề của nội dung trong liên kết
    • imageURL, URL của hình nhỏ xuất hiện trên bài viết
    • contentDescription của nội dung, thường từ 2 đến 4 câu
      Được sử dụng thông qua ShareLinkContent.
  • Ảnh

    Mọi người có thể chia sẻ ảnh từ ứng dụng của bạn lên Facebook bằng hộp thoại Chia sẻ hoặc giao diện tùy chỉnh.

    • Ảnh phải có kích thước dưới 12MB
    • Mọi người cần cài đặt ứng dụng Facebook gốc dành cho Android, phiên bản 7.0 trở lên

      Được sử dụng thông qua SharePhotoContent với dữ liệu truyền vào là bitmap.

Các loại khác các bạn xem thêm ở link phía trên 😀

3.DEMO về share link và share photo  trên project trước đó.

Project trước đó.
– Đầu tiên mở AndroidManifest.xml  thêm đoạn code sau nằm trong thẻ <application> lưu ý điền ID app của bạn vào phía sau:

  <provider android:authorities="com.facebook.app.FacebookContentProvider357284681323683"
            android:name="com.facebook.FacebookContentProvider"
            android:exported="true"/>

-Tạo thêm 1 Activity tên là : ShareActivity.java

Tạo giao diện đơn giản như sau:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_share"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:text="Link Share:"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="http://androidcoban.com/"
        android:textColor="@android:color/holo_red_dark"
        android:textSize="18sp"
        android:id="@+id/tv_link"/>
    <ImageView
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_marginTop="20dp"
        android:layout_gravity="center"
        android:id="@+id/img_share"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:id="@+id/btn_share_image"
        android:background="#3b5998"
        android:textColor="@android:color/white"
        android:text="Share Facebook Image"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:id="@+id/btn_share_link"
        android:background="#3b5998"
        android:textColor="@android:color/white"
        android:text="Share Facebook Link"/>
</LinearLayout>

Do ban đầu mình cấu hình FB tại MainActivity.java nên mình viết luôn các hàm share dạng static bên activity này gồm 2 hàm share link và share photo:

/**
     * Share LinkFB
     * @param title Tiêu đề
     * @param linkShare link cần share
     * @param imgThumnal ảnh thu nhỏ
     *  Ở đây mình có gắn thêm phần Hashtag                
     */
    public static void shareLinkFB(String title, String linkShare, String imgThumnal) {
        ShareLinkContent content = new ShareLinkContent.Builder()
                .setContentTitle(title)
                .setImageUrl(Uri.parse(imgThumnal))
                .setContentUrl(Uri.parse(linkShare))
                .setShareHashtag(new ShareHashtag.Builder()
                        .setHashtag("#AndroidCoBan.Com")
                        .build())
                .build();
        ShareDialog.show(mainActivity, content);
    }

    /**
     * Share Photo
     * @param b Hình ảnh dạng bitmap
     * @param caption thêm caption 
     */
    public static void sharePhoto(Bitmap b, String caption) {
        SharePhoto photo = new SharePhoto.Builder()
                .setBitmap(b)
                .setCaption(caption)
                .build();
        SharePhotoContent content = new SharePhotoContent.Builder()
                .addPhoto(photo).build();
        ShareDialog.show(mainActivity, content);
    }

Quay lại ShareActivity.java

Máy mình chạy trên android 6.0 nên để lấy được hình ảnh thì cần check permistion:

// Check permistion cho android 6.0
    public void runTimePermission() {

        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {

            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.READ_EXTERNAL_STORAGE)) {

            } else {
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                        1);
            }
        }
    }

Dưới đây là code của activity này :

public class ShareActivity extends AppCompatActivity {
    private TextView tvLinkShare;
    private Button btnShareImage;
    private Button btnShareLink;
    private ImageView imgShare;
    private Uri selectedImageUri;
    Bitmap bitmap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_share);
        addControl();
        addEvent();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 0 && resultCode == this.RESULT_OK) {
            if(data != null)
            {
                selectedImageUri = data.getData();
                try {
                    bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImageUri);
                    imgShare.setImageBitmap(bitmap);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    private void addEvent() {
        imgShare.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                runTimePermission();
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("image/*");
                startActivityForResult(intent, 0);
            }
        });
        btnShareImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String capTion = "Học Lập Trình Android";
                MainActivity.sharePhoto(bitmap,capTion);
            }
        });
        btnShareLink.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                 String title = "Lập Trinh Android";
                 String imageThumnal = "http://androidcoban.com/wp-content/uploads/2016/07/hoc_lap_trinh_android.png";
                 String linkShare = tvLinkShare.getText().toString();
                 MainActivity.shareLinkFB(title,linkShare,imageThumnal);
            }
        });
    }

    private void addControl() {
        tvLinkShare = (TextView) findViewById(R.id.tv_link);
        btnShareImage = (Button) findViewById(R.id.btn_share_image);
        btnShareLink = (Button) findViewById(R.id.btn_share_link);
        imgShare = (ImageView) findViewById(R.id.img_share);
    }

    // Check permistion cho android 6.0
    public void runTimePermission() {

        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {

            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.READ_EXTERNAL_STORAGE)) {

            } else {
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                        1);
            }
        }
    }
}

Một vài hình ảnh:

4. INVITE FRIEND

(Phần này mang tính tham khảo, do phần tạo App Link mình chưa hiểu rõ )

Để sử dụng được tính năng này đầu tiên app của bạn đảm bảo đã được pushlish trên Google Play Store.
App trên facebookdevelop và app trên Store phải cùng một package.
Tiếp theo truy cập vào :
https://developers.facebook.com/quickstarts/357284681323683/?platform=app-links-host

App Link Name  (Chưa rõ).


Các giá trị tiếp theo mặc đinh sẽ có sẵn bấm Next để tạo code.

Code dạng như sau:

Trong AndroidManifest.xml thêm IntentFilter thay bằng packagename của bạn

 <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs "com.example.myapp://" -->
        <data android:scheme="com.lynkdev.facebookdemo" />
    </intent-filter>

Tại Mainactivity tiến hành khai báo và viết hàm như sau:

Callback dùng để lắng nghe kết quả trả về.

 private FacebookCallback<AppInviteDialog.Result> appInviteDialogResult;
  appInviteDialogResult = new FacebookCallback<AppInviteDialog.Result>() {
            @Override
            public void onSuccess(AppInviteDialog.Result result) {
                Log.d("onSuccess: ",result.toString());
            }

            @Override
            public void onCancel() {

            }

            @Override
            public void onError(FacebookException e) {
                Log.d("onError: ",e.toString());
            }
        };

Trên Oncreate() target URI

    Uri targetUrl = AppLinks.getTargetUrlFromInboundIntent(this, getIntent());
        if (targetUrl != null) {
            Log.i("Activity", "App Link Target URL: " + targetUrl.toString());
        } else {
            AppLinkData.fetchDeferredAppLinkData(this,
                    new AppLinkData.CompletionHandler() {
                        @Override
                        public void onDeferredAppLinkDataFetched(
                                AppLinkData appLinkData) {
                        }
                    });
        }

 

Hàm Invite friend:

 /*
    * invite Friend FB
    * */
    public static void inviteFriendFB() {

        String AppURl = "https://fb.me/358392131212938"; // Tạo trên develop web
        String previewImageUrl = "https://lh3.googleusercontent.com/HUC--MkwsosgiSoUjjb-YsVjTgV8hrXOLcSzKg9cHY-HFSso3qT7XXN-fLIEkY4xoZwY=w300-rw";
        if (AppInviteDialog.canShow()) {
            AppInviteContent content = new AppInviteContent.Builder()
                    .setApplinkUrl(AppURl)
                    .setPreviewImageUrl(previewImageUrl)
                    .build();
            AppInviteDialog appInviteDialog = new AppInviteDialog(mainActivity);
            appInviteDialog.registerCallback(mainActivity.callbackManager, mainActivity.appInviteDialogResult);
            appInviteDialog.show(content);
        }
    }

Tạo Button và gọi hàm như các chức năng trên.
Note:
Hiện đã mời thành công tuy nhiên người được mời lại chưa hiển thị liên kết của ứng dụng, khi tìm ra nguyên nhân mình sẽ update lại code.

Nguyễn Linh

Chia sẻ để cùng tiến bộ...