前言

app 未来可能有要往国外推的需求,需要做Facebook,Twitter登录,FB用umeng搞定了部分,剩下Twitter需要自己做.

Create-App

前提是你有账号,去注册Twitter
Twitter开发者平台创建开发者账号

这里有个很难搞的坑,就是创建应用需要添加手机号,否则你会得到以下错误:

Error
You must add your mobile phone to your Twitter profile before creating an application. Please read https://support.twitter.com/articles/110250-adding-your-mobile-number-to-your-account-via-web for more information.

但是令人发指的是,Twitter又不支持中国大陆+86的手机,遇到这个问题后瞬间整个人就不好了...
但是还是得完成啊,于是百般搜索,寻找解决方案,无果.
最后给twitter support(support@twitter.com)发了邮件,最终,人家给我开通了时间有限的权限.

Thank you for reaching out. We’re aware that you are not able to register a mobile phone number to your account. We have enabled access for you to create an app without doing so. Please note that this access will expire 7 days from the date of this email, so you must create your app within this time frame.While developing your application, please review our Developer Agreement and Policy to ensure that your application is compliant with our Rules.Regards,
ElliotSamuelson
Twitter Platform Operations

finally,我可以创建应用了.

Fabric

Twitter弄了个叫Fabric的插件,AS可用.
它会帮忙设置项目,帮忙生成很多必要的代码文件,挺繁琐的,这里省略了,因为已经弄完了,不想再搞了.

大致记录一些,不全,具体看我Github.
build.gradle文件:

compile('com.twitter.sdk.android:twitter:1.8.0@aar') {transitive = true;
}
compile('com.twitter.sdk.android:tweet-composer:0.9.0@aar') {transitive = true;
}buildscript {repositories {maven { url 'https://maven.fabric.io/public' }}dependencies {classpath 'io.fabric.tools:gradle:1.+'}
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'repositories {maven { url 'https://maven.fabric.io/public' }
}

APP:

public class App extends Application {// Note: Your consumer key and secret should be obfuscated in your source code before shipping.private static final String TWITTER_KEY = "RJjbqTVS5kIseg9q4jsRecf7u";private static final String TWITTER_SECRET = "dbBgVZYA4oBkmSr5jKaInMzijO2mt3uB82SHviTJ1tgK2Z5P8E";@Overridepublic void onCreate() {super.onCreate();TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
//        Fabric.with(this, new TwitterCore(authConfig), new Digits());Fabric.with(this, new TwitterCore(authConfig),new TweetComposer());}
}

集成完后,开始写代码.
PS:个人非常讨厌Twitter这种方式,而且搞的AS编译时间非常非常久,夸张的时候1个小时都没成功,不知道什么坑.

登录

最简单的方式

使用推特提供的TwitterLoginButton,自带UI效果

  1. 配置xml
<com.twitter.sdk.android.core.identity.TwitterLoginButtonandroid:id="@+id/btn_twitter"android:layout_width="match_parent"android:layout_height="wrap_content"
/>
效果
  1. 代码里设置监听回调
    调用TwitterLoginButton.setCallback即可监听,不需要设置点击事件
private void setUpTwitterButton() {mBtnTwitter.setCallback(new Callback<TwitterSession>() {//userName alancheen06   secret  4H6cMSpc59EbLSlcQ5QI0SzAUXAAZnxDZ40KUqQkJkl7s  token 3313987080-L3UPicTGjEZrNjpjsobeDQRCbWGFyczUCV2O408@Overridepublic void success(Result<TwitterSession> result) {Log.d("Twitter", "success() called with: " + "result = [" + result + "]++++data" + result.data);String name = result.data.getUserName();long userId = result.data.getUserId();//3313987080long id = result.data.getId();TwitterAuthToken token = result.data.getAuthToken();String secret = token.secret;String strToken = token.token;}@Overridepublic void failure(TwitterException exception) {Log.d("Twitter", "failure() called with: " + "exception = [" + exception.getMessage() + "]");}});
}
  1. 处理onActivityResult

如果有fragment则需要用fragment来处理,否则Activity处理

mBtnTwitter.onActivityResult(requestCode, resultCode, data);//140 requestCode
点击后效果

当手机安装了推特客户端,那么以上代码都没有问题,但是如果没有安装,那么就不能授权!
解决办法是去推特开发者后台,把app的setting下的callback url设置一下,不论什么,可以访问即可!

相关资料-->戳这里

自定义UI

但是我的需求不能使用推特提供的UI,不过貌似没看到哪里文档有提,不过幸好自己摸索出了如下方法.

其实说白了就是掰了一些TwitterLoginButton里的源码

mTvCustom.setOnClickListener(v -> {new TwitterAuthClient().authorize(TwitterActivity.this, new Callback<TwitterSession>() {@Overridepublic void success(Result<TwitterSession> result) {String name = result.data.getUserName();long userId = result.data.getUserId();//3313987080long id = result.data.getId();TwitterAuthToken token = result.data.getAuthToken();String secret = token.secret;String strToken = token.token;}@Overridepublic void failure(TwitterException e) {}});
});
}

获取更多信息

从上文也能看出来,我们只能获取一个name严格来说是screen_name,另外一个是userId,而我还需要头像等信息.
于是,还得接下去搞.
其实过程异常痛苦,因为推特并没有给出详细的例子,自己也没有弄清楚oauth,找了老半天也没有详细的文档,不过最后还是被我弄出来了.

这里直接给代码了,无非就是拿token去获取数据:

/**** {"id":3313987080,"id_str":"3313987080","name":"\u7a0b\u5e8f\u4ea6\u975e\u733fAlan","screen_name":"alancheen06","location":"","profile_location":null,"description":"An android developer from China.","url":null,"entities":{"description":{"urls":[]}},"protected":false,"followers_count":1,"friends_count":34,"listed_count":0,"created_at":"Thu Aug 13 05:29:54 +0000 2015","favourites_count":2,"utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":13,"lang":"en","status":{"created_at":"Mon Oct 12 04:23:09 +0000 2015","id":653425648577286144,"id_str":"653425648577286144","text":"@Support How to add phone num?Thanks a lot!","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":17874544,"in_reply_to_user_id_str":"17874544","in_reply_to_screen_name":"Support","geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":1,"entities":{"hashtags":[],"symbols":[],"user_mentions":[{"screen_name":"Support","name":"Twitter Support","id":17874544,"id_str":"17874544","indices":[0,8]}],"urls":[]},"favorited":false,"retweeted":false,"lang":"en"},"contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/631699830872498176\/yThxaLUe_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/631699830872498176\/yThxaLUe_normal.jpg","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"has_extended_profile":false,"default_profile":true,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false}* @param token*/private void getInfo(final TwitterAuthToken token) {new Thread(new Runnable() {@Overridepublic void run() {TwitterAuthConfig authConfig = TwitterCore.getInstance().getAuthConfig();OAuthSigning oauthSigning = new OAuthSigning(authConfig, token);Map<String, String> authHeaders = oauthSigning.getOAuthEchoHeadersForVerifyCredentials();URL url = null;try {
//                    url = new URL("https://api.twitter.com/1.1/users/show.json?");url = new URL("https://api.twitter.com/1.1/users/show.json?screen_name=alancheen06&user_id=3313987080");
//                    url = new URL("http://api.yourbackend.com/check_credentials.json");HttpURLConnection conn = (HttpsURLConnection) url.openConnection();conn.setRequestMethod("GET");
//                    for (Map.Entry<String, String> entry : authHeaders.entrySet()) {
//                        connection.setRequestProperty(entry.getKey(), entry.getValue());
//                    }
//                    connection.addRequestProperty("Authorization","OAuth oauth_consumer_key=\"7Ud4sn002Jquc6hR6XFREEqds\", oauth_nonce=\"456e1966e1db379f36f1ea9551ce0ad8\", oauth_signature=\"QWGBWcurKrLd5RvtDwjzmqtasBc%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1444727699\", oauth_token=\"3313987080-h6f0ecdEc100MCQjpKyTuiNVakj6nZ0bdV2HvUw\", oauth_version=\"1.0\"");Map<String, String> par = new HashMap<String, String>();par.put("screen_name", "alancheen06");par.put("user_id", "3313987080");OAuth1aService.signRequest(authConfig, token, conn, par);conn.connect();int status = conn.getResponseCode();//得到读取的内容(流)InputStreamReader in = new InputStreamReader(conn.getInputStream());// 为输出创建BufferedReaderBufferedReader buffer = new BufferedReader(in);String inputLine = null;String resultData = "";//使用循环来读取获得的数据while (((inputLine = buffer.readLine()) != null)) {//我们在每一行后面加上一个"\n"来换行resultData += inputLine + "\n";}JSONObject jo = new JSONObject(resultData);String imgUrl = jo.getString("profile_image_url");Log.d("Twitter", "run: resultData" + resultData);final String aa = resultData;runOnUiThread(()->mTvInfo.setText(aa));} catch (MalformedURLException e) {e.printStackTrace();} catch (ProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (JSONException e) {e.printStackTrace();}}}).start();}

Twitter分享

既然登录做了,那么分享也是需要的~

分享相对来说简单多了,只是需要注意推特分享图片只能是本地文件

TweetComposer.Builder builder = new TweetComposer.Builder(context).text(content).image(fileUri).url(url);
builder.show();

稍微解释一下参数:

  1. .text(String) 是发推的文本
  2. .image(Uri imageUri) 上面提过是因为只支持本地文件一般Uri.fromFile(file)即可
  3. .url(URL url)) 这个是网页链接,就是别人点击后跳转的地方,会出现在推文里.
分享效果

分享结果处理

上面提供的方法接收不到推特分享的结果,看了一下TweetComposer.Builder的源码后想出来了:
builder.createIntent()可以创建一个intent,然后自己调用startActivityForResult,重写onActivityResult来接受结果即可.
需要注意的是这样context的类型必须是activity了.

机智如我,搞定~

总结

做推特的功能大概花费了2天的时间,第一步添加手机号码的确实让我崩溃,后面也不顺利,但是幸好还是完成了功能~
另外也感慨一下自己的英文实在是烂,全英文的文档实在吃不消.
感谢Umeng集成了那么多第三方登录,分享功能,自己做真的累.

希望能给现在有需要or未来需要的人一些参考吧,就这样.

资料

API Console Tool
Log in with Twitter
SignIn-with-Twitter
文档
API
cannonball-android
示例-app

安利:
我的Github
我的微博
我的微信公众号:

微信公众号

Twitter相关功能集成相关推荐

  1. 【AI手机三国杀】三星Bixby闯入战场,AI功能集成颠覆人机交互

    受三星电子中国研究院邀请,新智元昨天走访研究院,了解三星的人工智能,并抢先体验了三星主推的AI技术--三星Bixby中文版部分功能.Bixby实现了对手机的多模态智能操控,以Bixby Vision. ...

  2. 【学习】PCF8563芯片资料和相关功能解析

    [学习]PCF8563芯片资料和相关功能解析 PCF8563芯片是以I2C通讯方式的实时时钟/日历芯片.它提供一个可编程时钟输出,一个中断输出和掉电检测器,所有的地址和数据通过 I2C 总线接口串行传 ...

  3. 移动支付技术崛起 多功能集成的趋势

    采宝支付核心提示:2016年在移动支付快速发展的一年,不仅仅消费者逐渐接受以二维码技术为核心的支付应用,其他支付技术也逐渐落地,其中包括NFC.MST.生物识别.IC读写等等层出不穷的支付及交互技术. ...

  4. github视频录制播放相关功能-参考

    http://www.cnblogs.com/niexiaobo/p/4933990.html github视频录制播放相关功能-参考 lookingstars/JZVideoDemo 视频播放器 U ...

  5. 痞子衡嵌入式:浅谈i.MXRT1xxx系列MCU时钟相关功能引脚的作用

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1xxx系列MCU时钟相关功能引脚作用. 如果我们从一颗 MCU 芯片的引脚分类来看芯片功能,大概可以分为三大类:电源.时钟 ...

  6. Android阿里百川返佣功能集成

    Android阿里百川返佣功能集成 百川官方的接入文档 这个是官方文档, 即使严格按照官方文档集成, 可能还是会有各种各样莫名其妙的问题 公司负责人的接入博客 (很详细) 附上他的开源项目githug ...

  7. 【Flutter】Flutter 调试 ( 调试控制相关功能 | 断点管理 | 代码运行控制 )

    文章目录 一.调试控制相关功能 二.断点管理 三.代码运行控制 四.相关资源 一.调试控制相关功能 " Return 'main.dart' " 重新运行项目 ; " S ...

  8. (仿头条APP项目)1.app载入界面相关功能实现

    app载入界面相关功能实现 模块功能 1.设置页面布局 2.初始化视频播放 //控制是否跳到主界面private boolean isjump = false;private VideoView vi ...

  9. wxWidgets:wxWidgets 示例演示网络相关功能

    wxWidgets:wxWidgets 示例演示网络相关功能 wxWidgets:wxWidgets 示例演示网络相关功能 wxWidgets:wxWidgets 示例演示网络相关功能 #includ ...

最新文章

  1. [Python]--爬虫 Resources Collection
  2. psp能装安卓软件吗_客户crm 软件能定制吗
  3. php动态写入vue,Vue自定义动态组件使用详解
  4. web容器启动过程与web.xml
  5. python 多线程并发_寻找python大神!!!python如何多线程并发?
  6. C语言 ,嵌入式 ,数据结构 面试题目(2)
  7. 【HDOJ】4541 Ten Googol
  8. 【转】Tag的创建和组织
  9. c++ 在函数中传递数组和sizeof用法注意事项
  10. vue写自定义指令(全局或者组件内部)
  11. 文件上传功能如何测试
  12. fuelux.tree,动态加载
  13. vs2010找不到服务器,在服务器上找不到Crystal Reports dll部署VS2010应用程序
  14. Go基础编程:Socket编程
  15. android wifi控制手机屏幕,如何将手机屏幕无线投射到电脑 电脑反向控制手机屏幕的详细教程...
  16. ip归属地是什么?ipv4和ipv6区别?
  17. 算法改进有多快?是否比迭代硬件收益更大?这是 MIT 的结论
  18. 华为2020软件精英挑战赛初赛、复赛、决赛代码+心得分享
  19. 谁再瞧不起搬砖的我。。
  20. LWN: 华为EROFS文件系统

热门文章

  1. CDR智能填充—图形颜色填充好帮手
  2. POJ1659 Frogs' Neighborhood(Havel定理)
  3. 解决word,ppt,excel图标为空白(适用于新电脑)
  4. 熊猫烧香攻防战 武汉男孩称不再更新版本
  5. html是什么排列规律,单数和双数是什么 有什么排列规律
  6. python-字典练习3 -数字重复统计
  7. 计算机操作员考评标准,计算机操作员职业技能鉴定标准高级.doc
  8. 2021-12-29 神经网络
  9. 关于Android证书MD5获取
  10. 面试常问集锦——Java基础部分