使用twitter sdk实现分享功能,twittersdk实现分享,申请后要获得CONSUM
使用twitter sdk实现分享功能,twittersdk实现分享,申请后要获得CONSUM
twitter的申请部分,这里就不在说了,大家可以到twitter开发者申请。申请后要获得CONSUMER_KEY、CONSUMER_SECRET , 这俩个在开发中要用到。
twitter的分享功能如果要使用sdk开发的画要比facebook的复杂一些,代码量和逻辑都不是一时半会就能弄清楚了,我可是用了一天的功夫才整明白的。
另外,首先提醒下,如果要分享链接的话, 链接的主机名部分不能写ip,必须是域名,否则twitter不认为他是一个链接。这点上我吃了很大的亏,所以要首先提出来。
其实,如果要是没有严格要求一定要使用sdk开发的,到是有个很简单的分享的实现:
String tweetUrl = "https://twitter.com/intent/tweet?text=&url="; Uri uri = Uri.parse(tweetUrl); startActivity(new Intent(Intent.ACTION_VIEW, uri));此方法会打开浏览器或twitter客户端进行推送分享内容, 十分简单,没有特别情况,我一般使用的就是这种方法。
下面就着重介绍下如何使用twitter sdk进行开发。
第一步:导入jar包
将下载的开发包解压后,里边会有一些jar包,如果我们只是使用分享功能的话,只导入twitter4j-core-4.0.2.jar 这个核心包就行。
第二步:修改AndroidManifest.xml
主要是添加权限:
<!-- Permission - Internet Connect --> <uses-permission android:name="android.permission.INTERNET" /> <!-- Network State Permissions --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
添加网络访问权限。
接下来就可以写java代码了。
第三步:初始化twitter实例
新建个activity,然后加入如下方法,
/** * 初始化twitter实例 */ private void initializeTwitter() { ConfigurationBuilder builder = new ConfigurationBuilder(); builder.setOAuthConsumerKey(ConstantValues.TWITTER_CONSUMER_KEY); //我们申请的consumer_key builder.setOAuthConsumerSecret(ConstantValues.TWITTER_CONSUMER_SECRET); //我们申请的consumer_secret Configuration conf = builder.build(); twitter = new TwitterFactory(conf).getInstance(); twitter.setOAuthAccessToken(null); }利用我们在twitter开发者申请的consumer_key和cunsumer_secret 创建twitter实例。之后的所有操作都是通过这个twitter实例来完成的。
第四步:获得requestToken
从第四步开始实际上是应用授权的过程,只有我们的app通过了授权才能发送推文。
private void reOauth() { final Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { if (requestToken != null) { Intent i = new Intent(MainActivity.this, BrowserActivity.class); i.putExtra("href", requestToken.getAuthenticationURL()); startActivityForResult(i, 10); } } }; new Thread(){ public void run(){ try { twitter.setOAuthAccessToken(null); requestToken = twitter.getOAuthRequestToken(ConstantValues.TWITTER_CALLBACK_URL); //获取requestToken } catch (TwitterException e) { e.printStackTrace(); } handler.sendMessage(new Message()); } }.start(); }注意,由于授权过程需要访问网络,所以不能再主线程完成,这样就需要单独起个线程。获得requestToken后通过message发送出去。在消息处理中,如果成果获得了requestToken,可通过requestToken.getAuthenticationURL()获得认证的url,之后打开这个url。这里边我自己定义了个浏览器BrowserActivity,里边其实只有个webview,之所以要使用webview而不是第三方的浏览器(如uc),是因为测试经常发现调用url后没反应,无法返回。所以建议最好用webview。之后打开如下页面,输入你的twitter账号和密码。
点击"授权应用程序"。
第五步:获得access_token和access_token_secret
public class BrowserActivity extends Activity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); this.setContentView(R.layout.browser); webView = (WebView)this.findViewById(R.id.browser_webview); webView.getSettings().setJavaScriptEnabled(true); webView.setWebViewClient(new MyWebViewClient()); String href = this.getIntent().getStringExtra("href"); webView.loadUrl(href); } private class MyWebViewClient extends WebViewClient{ @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { } @Override public void onPageFinished(WebView view, String url) { if (url != null && url.startsWith(ConstantValues.TWITTER_CALLBACK_URL)) { String oauthVerifer = Uri.parse(url). getQueryParameter(ConstantValues.URL_TWITTER_OAUTH_VERIFIER); Intent i = new Intent(); i.putExtra(ConstantValues.URL_TWITTER_OAUTH_VERIFIER, oauthVerifer); setResult(RESULT_OK, i); //把获取的oauth_verifer finish(); } } } }onCreate中的href就是requestToken.getAuthenticationURL(),调用这个href后twitter会调用ConstantValues.TWITTER_CALLBACK_URL的地址将参数传回给我们,参数主要就是oauthVerifer。ConstantValues.TWITTER_CALLBACK_URL可以是个任意的地址,只要和开始设置的一样就行。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); final Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { AccessToken at = (AccessToken)msg.obj; if(at == null) return ; String accessToken = at.getToken(); String accessTokenSecret = at.getTokenSecret(); twitter.setOAuthAccessToken(at); //这里要设置access_token Editor editor = sharedPreferences.edit(); editor.putString("access_token", accessToken); editor.putString("access_token_secret", accessTokenSecret); editor.commit(); } }; if (requestCode == 10) { if (resultCode == Activity.RESULT_OK) { final String oauthVerifier = data.getStringExtra(ConstantValues.URL_TWITTER_OAUTH_VERIFIER); new Thread(){ public void run(){ try { AccessToken at = twitter.getOAuthAccessToken(requestToken, oauthVerifier); Message msg = new Message(); msg.obj = at; handler.sendMessage(msg); } catch (TwitterException e) { e.printStackTrace(); } } }.start(); } } }
接收oauthVerifier, 在连同requestToken一起,通过twitter.getOAuthAccessToken(requestToken, oauthVerifier)方法去获得AccessToken,通过AccessToken就可以获得access_token和access_token_secret, 有了这俩个东西授权就成功,我们就可以发送分享或推文了。access_token和access_token_secret最好是保存到sharedPreferences里,这样以后拿来用就行了。
第六步:发送推文
twitter.updateStatus("http://www.google.com");这样就可以将google的分享发送出去了。
最后要注意由于是要和twitter打交道,所以需要翻墙,使用facebook sdk实现分享功能我们介绍了一些翻墙的工具。需要的可以下载。
完整demo
优化后的demo
用户评论