07/09/2018, 15:43

[Android] Login, Share Twitter max easy với Fabric

Có lẽ với những thím lập trình Android hay iOS hiện nay đã quá quen thuộc với Facebook SDK để thực hiện 1 số thao tác như Login, Share, Like, ... Nhưng có lẽ ít ai quan tâm đến Twitter vì có ai dùng mấy đâu mà quan tâm =='. Vậy lý do mình viết bài này là gì? Cty mình đang làm outsource cho Nhật ...

Có lẽ với những thím lập trình Android hay iOS hiện nay đã quá quen thuộc với Facebook SDK để thực hiện 1 số thao tác như Login, Share, Like, ... Nhưng có lẽ ít ai quan tâm đến Twitter vì có ai dùng mấy đâu mà quan tâm =='. Vậy lý do mình viết bài này là gì?

Cty mình đang làm outsource cho Nhật Bổn, mà bọn Nhật Bổn nó cũng chăm dùng Twitter lắm, thấy dự án nào cũng yêu cầu Twitter cả. Nên thím nào có dự định làm outsource cho Nhật Bổn thì cũng nên chuẩn bị trước, 1 ngày có 1 lượng task giao thôi, mình có source có nguồn rồi thì làm nó nhẹ nhàng hơn, dành thời gian còn lượn lờ đá lông nheo với mấy em lễ tân :v hoặc là có thời gian học thêm được cái gì đó. Anh em nếu định làm hay tìm hiểu cái gì thì làm cho đẹp, cho chuẩn rồi lưu lại, mai sau lôi ra dùng lại đỡ phải đi xin xỏ thằng nào. Mỗi người 1 ngày đều có 24h như nhau thôi, hãy tiết kiệm, đừng có việc gì cũng lôi ra code "chay" từ lần này đến lần khác =='

Fabric 1 tool phát triển cho mobile rất mạnh :v chi tiết về Fabric ở trang https://fabric.io anh em nên ngó qua cho biết. Fabric gồm rất nhiều bộ phát triển dành cho mobile (trong đó thì có bộ Twitterkit chúng ta chuẩn bị xài sắp tới) dưới đây là hình ảnh crop ở trang chủ :v nhìn qua các bạn cũng hiểu phần nào những bộ phát triển Fabric cung cấp:

Bước 1: Bật bài hát yêu thích

Ngồi code mà mồm ú ớ theo bài nhạc là điều phê nhất đối với mình :v Hiện giờ mình đang bật bài "Cảm Ơn Người Đã Rời Xa Tôi". Link cho thím nào thích:

Bước 2: Tạo một app trên Twitter

Tạo app ở đây nhé: https://apps.twitter.com/

Ấn vào nút Create New App: Điền thông tin tùy các bác nhé.

  • Website mình để tạm thế, nếu các thím có Website thông tin quảng bá cho App thì cho vào đó.
  • Callback Url phần này không có * nhưng rất quan trọng nhé, phần này mình sẽ nói ở gần cuối bài.
  • Giờ thì đồng ý với mấy điều khoản chẳng bao giờ đọc. Create app rồi tiếp nào. Sau khi tạo app thành công các thím cần quan tâm tới 2 key quan trọng này. Các thím vào tab Keys and Access Tokens sẽ hiện ra như hình dưới đây:

Oke bây giờ đã tạo app thành công. Sáng bước tiếp theo nào.

Bước 3: Cài đặt plugin Fabric trên Android Studio (đẹp cực)

  • Các thím mở project muốn dùng Twitter lên. Chọn File -> Settings
  • Ở cửa sổ Settings, các thím chọn Plugins ở menu bên tay trái. Chọn Browse Repositories search "Fabric" chọn Fabric for Android Studio rồi Install và Restart Android Studio.
  • Giờ các thím sẽ thấy icon Fabric như sau, click và tạo tài khoản Fabric nhé.
  • Sau khi đăng ký, xác nhận mail xong, thì nó hỏi tạo cái organ gì í thì cứ next nhé, không quan trọng đâu. Sau khi tạo tài khoản thành công thì quay trở lại Android Studio đăng nhập vào nhé.
  • Đăng nhập xong. Trong mục Select your oragnization chọn Next. Sau đó sẽ liệt kê tất cả các bộ phát triển hiện có, ở đây chúng ta chọn Twitter.
  • Ở màn hình mới sẽ hiển thị Twitter cùng version mới nhất, chọn Install, I agree ..., Chú ý: Ở đây chúng ta đã có Account Twitter rồi vì ở trước trên có account ta mới tạo được app trên Twitter chứ :v nên là click vào I already have a Twitter account nhé.
  • Giờ thì các thím điền vào Twitter keyConsumer keyTwitter secretConsumer secret đã tạo ở trên nhé. Oke xong là Next.
  • Xong, giờ thì Fabric nó sẽ đề nghị muốn generate code còn thiếu cho các thím, thím nào muốn coi thì xem từng file nó muốn thêm là gì thì xem, lười thì Apply thì nó tự add với sync lại Gradle cho các thím.

Chú ý: Các thím nhớ kiểm tra lại Consumer Key vs Consumer Secret ở code và trên https://apps.twitter.com/ đúng không nhé. Có phát bọn Fabric nó làm sai đấy @@

Vậy là đã setup xong chú Fabric rồi. Tiếp theo nghịch thử cái Login xem thế nào.

Login

Cách đơn giản nhất đó là chúng ta sử dụng TwitterLoginButton. Bên trong layout chúng ta sẽ có đoạn code như thế này:

<com.twitter.sdk.android.core.identity.TwitterLoginButton
    android:id="@+id/btn_login_twitter"
    android:layout_awidth="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"/>

Tiếp theo chúng ta cần set callback cho button để biết có đăng nhập thành công hay không.

public class MainActivity extends AppCompatActivity {
private static final String TWITTER_KEY = "oPvIId5mxlpG8mwfdKjuEPRlC";
private static final String TWITTER_SECRET = "9wcue21zUuOX0kVZdaFZaXccG";
TextView tvInformation;
TwitterLoginButton btnLoginTwitter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
    Fabric.with(this, new Twitter(authConfig));
    setContentView(R.layout.activity_main);
    initView();
    btnLoginTwitter.setCallback(new Callback<TwitterSession>() {
        @Override
        public void success(Result<TwitterSession> result) {
            TwitterSession session = result.data;
            getInfoUser(session);
        }

        @Override
        public void failure(TwitterException e) {

        }
    });
}

private void getInfoUser(TwitterSession session) {
    Twitter.getApiClient(session).getAccountService().verifyCredentials(true, false, new Callback<User>() {
        @Override
        public void success(Result<User> result) {
            tvInformation.setText(result.data.name);
        }

        @Override
        public void failure(TwitterException e) {

        }
    });
}

private void initView() {
    tvInformation = (TextView) findViewById(R.id.tv_information);
    btnLoginTwitter = (TwitterLoginButton) findViewById(R.id.btn_login_twitter);
}

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

    btnLoginTwitter.onActivityResult(requestCode, resultCode, data);
}

}

Ở đây mình muốn lấy thông tin của User thì cần phải lấy được session sau khi đăng nhập, các thím muốn thông tin nào thì xem trong đối tượng User nhé.

Để nhận được thông tin và kết quả sau khi login thì các thím phải có đoạn btnLoginTwitter.onActivityResult(requestCode, resultCode, data) như trên vì bản chất là button login nó startActivityForResult.

Đó là override lại method startActivityForResult ở Activity vậy còn ở Fragment thì các bác dùng đoạn này:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    Fragment fragment = getFragmentManager().findFragmentById(R.id.your_fragment_id);
    if (fragment != null) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

Oke bây giờ thì có 2 trường hợp:

TH1: Trong device đã có app Twitter thì đăng nhập bình thường, thoải mái không vấn đề gì.

TH2: Nếu không có app Twitter sẵn thì nó sẽ chạy màn hình mà bộ kit đã cài sẵn nhưng xui là chúng ta sẽ gặp bug này E/Twitter: Failed to get request token.

Fix nào, giờ chúng ta cùng xem lại hình này ở phần đăng ký app cho Twitter: Việc của chúng ta bây giờ là paste bất kì 1 URL hợp lệ nào đó vào Callback URL giả sử như https://www.google.com/ cũng được. Twitter nó sẽ override lại nó. Đó, paste vào xong thì Update settings nhé.

Xong giờ thì cái nào cũng oke. Kết quả là mình login xong lấy về tên User:

Custom view TwitterLoginButton

Giả sử như mình muốn làm 1 cái button nhỏ nhỏ, xinh xinh thế này thôi:

Code layout này (30dp x 30dp là xinh xắn rồi):

<com.twitter.sdk.android.core.identity.TwitterLoginButton
    android:id="@+id/btn_login_twitter"
    android:layout_awidth="30dp"
    android:layout_height="30dp"
    android:layout_centerInParent="true"/>

Custom ở Activity này:

btnLoginTwitter = (TwitterLoginButton) findViewById(R.id.btn_login_twitter);
    btnLoginTwitter.setCompoundDrawablesWithIntrinsicBounds(0,0,0,0);
    btnLoginTwitter.setText("");
    btnLoginTwitter.setBackgroundResource(R.drawable.icon_twiter);

Xong! Chúc các thím login thành công :v

Share

Bây giờ chúng ta đến phần Share nào, thật ra thì không biết mình có dùng từ đúng không nữa @@ mình nghĩ nó dạng như là post 1 status như trong Facebook hoặc gọi là tweet trong Twitter. Nhưng dù nó có gọi là gì đi nữa thì mục đích của chúng ta vẫn là hiện một nội dung nào đó đã chuẩn bị sẵn :v

Điều mà chúng ta làm được sắp tới đối với Twitter đã không còn khả dụng với Facebook nữa, Facebook họ cấm share 1 đoạn text được chuẩn bị sẵn dưới mọi hình thức ==' (Bựa).

Share ở Twitter chúng ta có 2 cách nhé:

Cách 1: Share thông qua một url vs các params truyền vào. Ví dụ nhé:

http://twitter.com/share?text=Hado handsome&url=https://google.com&hashtags=depzai,totbung
  • text: nội dung mà các thím muốn share (điều này không làm được vs Fb đâu)
  • url: đúng như ý nghĩa của nó.
  • hashtags: cái này thấy các mẹ hay dùng này, mỗi lần đăng ảnh là cả đống hashtags. Viết thế thôi chứ chưa chắc các mẹ chả hiểu nó để làm gì đâu =='

    String url = "http://twitter.com/share?text=Hado handsome&url=https://google.com&hashtags=depzai,totbung"; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent);

Chú ý: Cách này thì các thím không đẩy ảnh lên được nhé, muốn đẩy thì cách sau.

Cách 2: Share thông qua TweetComposer

Trước khi lôi TweetComposer ra vày thì chúng ta cho nó khởi động tí nhé. Các thím có nhớ lúc đầu có đoạn code này không:

Fabric.with(this, new Twitter(authConfig));

Giờ cần chú TweetComposer thì cho hắn vào danh sách ăn hành nhé. Thay đoạn code trên thành thế này:

Fabric.with(this, new Twitter(authConfig), new TweetComposer());

Nào share nào:

Uri imageUri = getImageResourceUri();
TweetComposer.Builder builder = new TweetComposer.Builder(MainActivity.this);
try {
    builder.text("Em a, chung ta khong nen quay lai voi nhau")
           .url(new URL("https://www.youtube.com/watch?v=RowaBT-4UPM"))
           .image(imageUri)
           .show();
} catch (MalformedURLException e) {
    e.printStackTrace();
}

image: ở đây chúng ta có phương thức để truyền Uri của ảnh vào. Tạm thời ở đây mình viết 2 phương thức lấy Uri của ảnh ở resource và bộ nhớ trong cho các thím xài tạm:

private Uri getLocalImageUri() {
    String imagePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/hadohandsome.jpg";
    File imgFile = new File(imagePath);
    if (imgFile.exists()) {
        return Uri.fromFile(imgFile);
    }
    return null;
}

//android.resource://[package-name]/[Resource-ID]
private Uri getImageResourceUri() {
    return Uri.parse("android.resource://" + this.getPackageName() + "/" + R.mipmap.ic_launcher);
}

Rồi giờ các thím có thể tự tin ấn nút share.

Chú ý: Ở cách thứ 2 chúng ta có thể get được giá trị trả về liệu rằng người dùng có Share thành công hay không. Mình sẽ sửa vào bài viết này sớm nhất có thể (dạo này mình bận quá, huhu)

Oke vậy là chương trình đến đây xin được kết thúc, chúc các thím code khỏe. Hẹn các thím ở các bài viết khác :D

0