https://docs.fabric.io/此站点是Twitter官方文档,有兴趣的可以自行查看。笔者主要介绍自己根据此文档,并且成功进行Twitter分享的步骤。
准备工作:
- 给自己的Android Studio安装一个Fabric插件:只要打开Android Studio中的设置下的plugins,一搜Fabric for Android Studio就可以安装了;
- 到https://apps.twitter.com/中进行create new app,跟着里面的步骤一直走会得到一个app key和一个app secret,注意,如果要进行发推功能的话,那么在这个步骤中,不要忘记选择Read, Write and Access direct messages这一项单选按钮;
buildscript {
repositories {
jcenter()
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
// The Fabric Gradle plugin uses an open ended version to react
// quickly to Android tooling updates
classpath 'io.fabric.tools:gradle:1.+'
}
}
apply plugin: 'com.android.application'
//Put Fabric plugin after Android plugin
apply plugin: 'io.fabric'
repositories {
jcenter()
maven { url 'https://maven.fabric.io/public' }
}
将这一段代码拷到主程序的build.gradld的第一行中,此处是声明一个maven库,从中我们可以进行后续的下载包的工作。
compile('com.twitter.sdk.android:twitter:1.13.0@aar') {
transitive = true;
}
compile('com.twitter.sdk.android:tweet-composer:1.0.3@aar') {
transitive = true;
}
compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') {
transitive = true;
}
compile('com.twitter.sdk.android:tweet-ui:1.10.0@aar') {
transitive = true;
}
将这一段代码拷到该文件的dependencies中进行程序包的下载。可以看到里面有跟Twitter毫无关系的程序包,比如crashlytics。但仍将其列在此处,说明少了它还是不行的,最起码程序无法正常通过编译。
在主程序目录下创建一个文件名为fabric.properties里面就写入
CBE2.tmp.pngapiSecret=准备工作中的secret
apiKey=准备工作中的key
到这里,这个文件就不用去动了,等下要用到插件的时候,这个文件会自动进行更新并且替换掉原来的secret值,这些都是正常的。
接下来进行代码的接入。
- 在Androidmanifest.xml中加入
<meta-data
android:name="io.fabric.ApiKey"
android:value="0460e5aa7f8a617cc33f43cdfe849cff23e18de1" />
注意此处的这个值不可改变,直接拷贝即可;
- 在自己的主程序开始处,或者是在重写的Application类的onCreate()中加入
TwitterAuthConfig authConfig = new TwitterAuthConfig(Constants.TWITTER_API_KEY, Constants.TWITTER_API_SECRET);
Fabric.with(this, new Twitter(authConfig));
Fabric.with(this, new TwitterCore(authConfig), new TweetUi());
Fabric.with(this, new TwitterCore(authConfig), new TweetComposer(), new Crashlytics());
这个是为了加载你的授权信息;
- 如果你的项目是要经过混淆的,那么就在混淆代码中加入
-dontwarn com.squareup.okhttp.**
-dontwarn com.google.appengine.api.urlfetch.**
-dontwarn rx.**
-dontwarn retrofit.**
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-keep class retrofit.** { *; }
-keepclasseswithmembers class * {
@retrofit.http.* <methods>;
}
- 将Twitter官方的登录按钮写入到你自己的布局文件中去
<com.twitter.sdk.android.core.identity.TwitterLoginButton
android:id="@+id/login_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
并且在程序中能过findViewById()找到这个按钮,通过如下方法
loginButton = (TwitterLoginButton) findViewById(R.id.login_button);
btnShowTweet = (Button) findViewById(R.id.btn_show_tweet);
llTweets = (LinearLayout) findViewById(R.id.ll_tweets);
btnShowTweet.setOnClickListener(this);
loginButton.setCallback(new Callback<TwitterSession>() {
@Override
public void success(Result<TwitterSession> result) {
// Do something with result, which provides a TwitterSession for making API calls
TwitterAuthToken authToken = result.data.getAuthToken();
String token = authToken.token;
String secret = authToken.secret;
Toast.makeText(MainActivity.this, token + " " + secret, Toast.LENGTH_LONG).show();
//compose a tweet
TweetComposer.Builder builder = new TweetComposer.Builder(MainActivity.this)
.text("just setting up my Fabric.")
.image(getImgUri());
builder.show();
//load tweets
// TweetUtils.loadTweets(tweetIds, new Callback<List<Tweet>>() {
// @Override
// public void success(Result<List<Tweet>> result) {
// for (Tweet tweet : result.data) {
// llTweets.addView(new TweetView(MainActivity.this, tweet));
// }
// }
//
// @Override
// public void failure(TwitterException e) {
//
// }
// });
//app card
// final TwitterSession session = TwitterCore.getInstance().getSessionManager().getActiveSession();
// final Card card = new Card.AppCardBuilder(MainActivity.this).imageUri(getImgUri()).googlePlayId("com.medzone.twitterpic").build();
// final Intent intent = new ComposerActivity.Builder(MainActivity.this).session(session).card(card).createIntent();
// startActivity(intent);
}
@Override
public void failure(TwitterException exception) {
// Do something on failure
Toast.makeText(MainActivity.this, "Error", Toast.LENGTH_LONG).show();
Log.d("hsc", exception.getMessage());
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Pass the activity result to the login button.
loginButton.onActivityResult(requestCode, resultCode, data);
}
稍微解释一下参数:
.text(String) 是发推的文本
.image(Uri imageUri) 上面提过是因为只支持本地文件一般Uri.fromFile(file)即可
.url(URL url)) 这个是网页链接,就是别人点击后跳转的地方,会出现在推文里.
此处需要注意的是应该将你的代码写在success()内部,不然你的登录信息将会丢失,当然了如果读者能找到解决方案,自然再好不过了。
上方代码中,笔者写了三个功能分别是发推、加载推文、Twitter card。其中一个tweetId是你发推后得到的一个值,你在Twitter官网上随便找一条推文的地址,最后一个数字就是这个ID,比如https://twitter.com/mashable/status/717019039118139393。
注意 分享结果处理
如果接收不到推特分享的结果,看下TweetComposer.Builder的可能
builder.createIntent()可以创建一个intent,然后自己调用startActivityForResult,重写onActivityResult来接受结果即可.
需要注意的是这样context的类型必须是activity了.
有时登录按钮无法点击注意检查
初始化时一定要放在布局前面,否则登录按钮无法点击
本人测试过程中出现了上面错误外,还出现了下面错误: 授权失败
07-15 20:27:01.052 27884-27884/com.example.hante.newpro I/Timeline: Timeline: Activity_launch_request time:257230679
07-15 20:27:06.354 27884-27884/com.example.hante.newpro E/Twitter: Authorization completed with an error
com.twitter.sdk.android.core.TwitterAuthException: Authorize failed.
at com.twitter.sdk.android.core.identity.AuthHandler.handleOnActivityResult(AuthHandler.java:97)
at com.twitter.sdk.android.core.identity.TwitterAuthClient.onActivityResult(TwitterAuthClient.java:161)
at com.twitter.sdk.android.core.identity.TwitterLoginButton.onActivityResult(TwitterLoginButton.java:131)
at com.example.hante.newpro.MainActivity2.onActivityResult(MainActivity2.java:391)
at android.app.Activity.dispatchActivityResult(Activity.java:5437)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3352)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3399)
at android.app.ActivityThread.access$1300(ActivityThread.java:138)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1249)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5016)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
检查 是否将应用添加到Twitter 中及获取的 TWITTER_KEY TWITTER_SECRET.
坑
当手机安装了推特客户端,那么以上代码都没有问题,但是如果没有安装,那么就不能授权!
解决办法是去推特开发者后台,把app的setting下的callback url设置一下,不论什么,可以访问即可!
网友评论