ZeroyiQ:Unity 多平台原生SDK接入速览(一):微信开放平台
ZeroyiQ:Unity 多平台原生SDK接入速览(二):QQ互联
ZeroyiQ:Unity 多平台原生SDK接入速览(三):Facebook
ZeroyiQ:Unity 多平台原生SDK接入速览(五):微博
一、前言
离上次更新快过去一周了,不是我咕咕咕了,只是遇到了些状况。
Twitter 接入当前(2020-7-10)也是需要申请开发者账户,创建应用获取 key 和 secret。注意的是,据说 Twitter 开发者账户并不好申请,并且失败后该账户就无法重复申请了。然后我就以抱着碰碰运气的心态,结果申请秒过了,XD。(explore the APIs,地点为HK(挂了 HK 的梯子) ,+86 手机号,谷歌邮箱,不展示数据、不分析数据,理由说为了完成家庭作业)
正当进行到下一步——寻找官方提供的 SDK for Android 时,我死活找不到相关官方文档,最后发现了Twitter 18年 停止维护 SDK 了。废了些力气没有找到很好的替代方案,多方查找后,发现目前最正确的方法应该是自己去实现一套网页版的 Twitter 的登录。但是由于对于 Web 不是很了解以及时间因素,暂且还是优先使用 Twitter 官方停止维护的 SDK。通过 Twitter kit for Unity,验证了当前 SDK 依旧能够正常授权登录。因此还是选择了接入 Twitter kit for Android。
由于搞到了 Key 和 Secret,因此彻底走了遍整个流程。编译出 aar 包导入 Unity 项目,配置 AndroidManifest 和 Gradle,再 export 项目到 Android studio 中编译成 APK。后续也会出相关文章。
二、SDK接入
1. 配置依赖
build.gradle[Project]
repositories {
jcenter()
}
build.gradle[Module]
dependencies {
implementation 'com.twitter.sdk.android:twitter:3.1.1'
}
2. 初始化
初始化 Twitter。
private boolean bIsInitialized;
private TwitterAuthClient authClient;
private void init() {
if (!bIsInitialized) {
bIsInitialized = true;
String key = activity.getString(R.string.twitter_app_key);
String secret = activity.getString(R.string.twitter_app_secret);
UnityCallApi.unityLogInfo(TAG, "key: " + key + " secret: " + secret);
TwitterConfig config = new TwitterConfig.Builder(activity)
.logger(new DefaultLogger(Log.DEBUG))
.twitterAuthConfig(new TwitterAuthConfig(key, secret))
.debug(false)
.build();
Twitter.initialize(config);
// 客户端认证,用来登录
authClient = new TwitterAuthClient();
}
}
三、登录
1. Twitter 原生按钮
1.a 添加按钮 布局 xml 中添加。
<com.twitter.sdk.android.core.identity.TwitterLoginButton
android:id="@+id/login_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
1.b 发起请求
loginButton = (TwitterLoginButton) findViewById(R.id.login_button);
loginButton.setCallback(new Callback<TwitterSession>() {
@Override
public void success(Result<TwitterSession> result) {
// 成功回调
}
@Override
public void failure(TwitterException exception) {
// 失败回调
}
1.c 设置回调
@Override //这段代码非常重要,不加的话无法获取回调
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 传递回调
loginButton.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
2. 自定义按钮
2.a 发起请求
直接通过 authorize 方法触发登录请求。
//authClient 已经在 二.2 中初始化了
this.authClient.authorize(activity, new Callback<TwitterSession>() {
public void success(Result<TwitterSession> result) {
// 成功回调
TwitterSession data = (TwitterSession) result.data;
UnityCallApi.unityLogInfo(TAG, "Login successful. " + data.getUserName() + " " + data.getUserId());
UnityCallApi.sendLoginInfoToUnity(true, result.data.toString());
}
public void failure(TwitterException ex) {
// 失败回调
UnityCallApi.unityLogError(TAG, "Login error. " + ex.getMessage());
UnityCallApi.sendLoginInfoToUnity(false, "");
}
});
2.b 设置回调
@Override //这段代码非常重要,不加的话无法获取回调
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 传递回调
authClient.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
四、获取用户信息
TwitterSession 中就包含了用户基本信息 (username、id)
// 获取 session
TwitterSession session = TwitterCore.getInstance().getSessionManager().getActiveSession();
String userName = session.getUserName();
String userId = session.getUserId();
TwitterAuthToken authToken = session.getAuthToken();
String token = authToken.token;
String secret = authToken.secret;
五、分享
build.gradle[Module] 中添加依赖
dependencies {
implementation 'com.twitter.sdk.android:twitter:3.1.1'
// 新增
implementation 'com.twitter.sdk.android:tweet-composer:3.1.1'
}
发起分享请求
public void shareImage(Bundle params) {
TwitterSession session = TwitterCore.getInstance().getSessionManager().getActiveSession();
if (session != null) {
String imagePath = params.getString(PlatConstants.SHARE_IMAGE_PATH_STRING);
String text = params.getString(PlatConstants.SHARE_TEXT_STRING);
Intent intent = (new com.twitter.sdk.android.tweetcomposer.ComposerActivity.Builder(activity))
.session(session)
.image("图片 Uri")
.text("分享内容")
.hashtags("#标签")
.createIntent();
activity.startActivity(intent);
}
}
新建回调类,TwitterResultReceiver 继承 BroadcastReceiver
public class TwitterResultReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(TweetUploadService.UPLOAD_SUCCESS))
{
String text = "分享成功!";
Toast.makeText(context,text,Toast.LENGTH_SHORT).show();
}else {
String text ="分享失败!";
Toast.makeText(context,text,Toast.LENGTH_SHORT).show();
}
}
}
AndroidManifest.xml 中添加 Receiver
<receiver
android:name="替换为TwitterResultReceiver路径"
android:exported="false">
<intent-filter>
<action android:name="com.twitter.sdk.android.tweetcomposer.UPLOAD_SUCCESS" />
<action android:name="com.twitter.sdk.android.tweetcomposer.UPLOAD_FAILURE" />
<action android:name="com.twitter.sdk.android.tweetcomposer.TWEET_COMPOSE_CANCEL"/>
</intent-filter>
</receiver>
六、总结
当前虽然 Twitter 官方已经停止对 SDK 的维护了,但是登录和分享在目前(2020-7-13)都是能够正常使用的,因此可以先接入 SDK 进行使用,如果发生变化,直接对 SDK 进行修改。当然如果能专门封装一套网页版的实现,这应该才是正确的使用方式。请酌情选择方案。