目录
1、APP build
//推特登陆和分享相关
implementation 'com.twitter.sdk.android:twitter-core:3.1.1'
implementation 'com.twitter.sdk.android:tweet-ui:3.1.1'
implementation 'com.twitter.sdk.android:tweet-composer:3.1.1'
2、sdk初始化
初始化建议放在Application中。
我把twitter_comsumer_key以及twitter_comsumer_secret这两个key值放在了strings下了,你们根据需要放置。
private void initTwitter() {
TwitterConfig config = new TwitterConfig.Builder(this)
.logger(new DefaultLogger(Log.DEBUG))
.twitterAuthConfig(new TwitterAuthConfig(getApplicationContext().getString(R.string.twitter_comsumer_key),getApplicationContext().getString(R.string.twitter_comsumer_secret)))
.debug(true)
.build();
Twitter.initialize(config);
}
3、按钮样式(布局文件)
- 可以使用官方的Twitter按钮,样式不可以更改。
- 使用自定义的按钮,但是必须是button才行。
-
3.1官方按钮登陆
(1)、布局文件
<com.twitter.sdk.android.core.identity.TwitterLoginButton
android:id="@+id/btn_login_by_twitter"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="推特官方按钮" />
(2)、java代码
/**
* 官方按钮登陆Twitter
*/
private void loginByTwitterButton() {
//官方按钮登陆
TwitterLoginButton twitterLoginButton = findViewById(R.id.btn_login_by_twitter);
Log.e(TAG, "step1");
twitterLoginButton.setCallback(new Callback<TwitterSession>() {
@Override
public void success(Result<TwitterSession> result) {
isMySelfButton = false;
Log.e(TAG, "step2");
TwitterSession session = result.data;
final String userName = session.getUserName();
Call<User> user = TwitterCore.getInstance().getApiClient().getAccountService().verifyCredentials(false, true, false);
user.enqueue(new Callback<User>() {
@Override
public void success(Result<User> result) {
Log.e(TAG, "step3");
User userInfo = result.data;
String email = userInfo.email;
String description = userInfo.description;
Log.e(TAG, "userMessage--->" + userInfo.profileImageUrl);
StringBuilder sb = new StringBuilder();
sb.append("userName: " + userName);
sb.append("\n");
sb.append("eMail: " + email);
sb.append("\n");
sb.append("description: " + description);
sb.append("\n");
tvShowUserMessage.setText(sb.toString());
Log.e(TAG, "sb.toString():" + sb.toString());
}
@Override
public void failure(TwitterException exception) {
Log.e(TAG, "step4");
}
});
}
@Override
public void failure(TwitterException exception) {
Log.e(TAG, "step5");
Log.e(TAG, "login fail:", exception);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == TwitterAuthConfig.DEFAULT_AUTH_REQUEST_CODE) {
Log.e(TAG, "step6");
twitterLoginButton.onActivityResult(requestCode, resultCode, data);
}
}
-
3.2自定义按钮登陆
(1)布局文件
<Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="推特自定义按钮登陆" />
(2)java文件
private void initView() {
btnLogin = findViewById(R.id.btn_login);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loginByMyButton();
}
});
}
/**
* 自定义按钮登陆Twitter
*/
private void loginByMyButton() {
Log.e(TAG, "step1");
twitterLoginUtils = new TwitterLoginUtils(this);
twitterLoginUtils.setOnLoginByTwitterClick(new Callback<TwitterSession>() {
@Override
public void success(Result<TwitterSession> result) {
Log.e(TAG, "step2");
TwitterSession session = result.data;
final String userName = session.getUserName();
Call<User> user = TwitterCore.getInstance().getApiClient().getAccountService().verifyCredentials(false, true, false);
user.enqueue(new Callback<User>() {
@Override
public void success(Result<User> result) {
Log.e(TAG, "step3");
User userInfo = result.data;
String email = userInfo.email;
String description = userInfo.description;
Log.e(TAG, "userMessage--->" + userInfo.profileImageUrl);
StringBuilder sb = new StringBuilder();
sb.append("userName: " + userName);
sb.append("\n");
sb.append("eMail: " + email);
sb.append("\n");
sb.append("description: " + description);
sb.append("\n");
tvShowUserMessage.setText(sb.toString());
Log.e(TAG, "sb.toString():" + sb.toString());
}
@Override
public void failure(TwitterException exception) {
Log.e(TAG, "step4");
Log.e(TAG, "login fail:", exception);
}
});
}
@Override
public void failure(TwitterException exception) {
Log.e(TAG, "step5");
Log.e(TAG, "login fail:", exception);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == TwitterAuthConfig.DEFAULT_AUTH_REQUEST_CODE) {
Log.e(TAG, "step6");
twitterLoginUtils.onActivityResult(requestCode, resultCode, data);
}
}
(3)TwitterLoginUtilse.java文件
/**
* @author whr
* @date 2019/5/27
*/
public class TwitterLoginUtils {
static final String ERROR_MSG_NO_ACTIVITY = "TwitterLoginButton requires an activity."
+ " Override getActivity to provide the activity for this button.";
final WeakReference<Activity> activityRef;
Callback<TwitterSession> callback;
volatile TwitterAuthClient authClient;
public TwitterLoginUtils(Activity activity) {
this.activityRef = new WeakReference<>(activity);
TwitterCore.getInstance();
}
public void setOnLoginByTwitterClick(Callback<TwitterSession> callback) {
this.callback = callback;
checkCallback(callback);
checkActivity(activityRef.get());
getTwitterAuthClient().authorize(activityRef.get(), callback);
}
TwitterAuthClient getTwitterAuthClient() {
if (authClient == null) {
synchronized (TwitterLoginButton.class) {
if (authClient == null) {
authClient = new TwitterAuthClient();
}
}
}
return authClient;
}
private void checkCallback(Callback callback) {
if (callback == null) {
CommonUtils.logOrThrowIllegalStateException(TwitterCore.TAG,
"Callback must not be null, did you call setCallback?");
}
}
private void checkActivity(Activity activity) {
if (activity == null || activity.isFinishing()) {
CommonUtils.logOrThrowIllegalStateException(TwitterCore.TAG, ERROR_MSG_NO_ACTIVITY);
}
}
/**
* Call this method when {@link Activity#onActivityResult(int, int, Intent)}
* is called to complete the authorization flow.
*
* @param requestCode the request code used for SSO
* @param resultCode the result code returned by the SSO activity
* @param data the result data returned by the SSO activity
*/
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == getTwitterAuthClient().getRequestCode()) {
getTwitterAuthClient().onActivityResult(requestCode, resultCode, data);
}
}
}
4、Twitter分享
/******************************以下为推特分享********************************/
/**
* 分享到Twitter
* 若未安装twitter客户端,则会跳转到浏览器
*
* @throws MalformedURLException
*/
private void shareToTwitter() {
uri = resourceIdToUri(R.mipmap.bg);
Log.e("--->whr", "--->Uri:" + uri);
Intent intent = null;
try {
intent = new TweetComposer.Builder(this)
.text("百度链接:")
.url(new URL("https://www.baidu.com/"))
.image(uri)
.createIntent();
} catch (MalformedURLException e) {
e.printStackTrace();
}
startActivityForResult(intent, TWEET_COMPOSER_REQUEST_CODE);
}
public static final String ANDROID_RESOURCE = "android.resource://";
public static final String FOREWARD_SLASH = "/";
private Uri resourceIdToUri(int resourceId) {
return Uri.parse(ANDROID_RESOURCE + getPackageName() + FOREWARD_SLASH + resourceId);
}
/******************************以上为推特分享********************************/