android 腾讯微博分享功能实现及自定义webview认证

最近腾讯微博官方网站API有的更新,不过也好久了.网上想找些案例,可是都没有介绍,好是郁闷,不过现在解决了,如果有类似问题的同学们,可以参考下,

      这次的比较简单,对我们开发应用的程序员比较不错.下面我简单介绍下微博API的应用。

官方网址

       为了顾全所有版本,我们就就用括号里面的jar包.

       这里我就不详细介绍了,不懂的可以参考官方文档,很详细的.

       下面这个是发表一条微博的接口参数:

          首先我们就要获取Oauth或者是openid&openkey,但是我研究了好久没有弄出来,官方文档说,在请求时候callback不为空,在授权后redirect_url中会包含这两个值,但我看了官方给出例子的源码,他们根本就没有运用openid和openkey,他们用的是Oauth对象.所以我也跟着用Oauth对象请求.

        不明白的可以参考源码.(其实官方已经给出很好的例子.)

       不想看官方的我在这里简单演示一下:

 我们首先创建OAuthV1对象.很简单,就是将oauthConsumeKey,oauthConsumerSecret设置进去.

[java] view plain copy
  1. @Override

  2. publicvoid onCreate(Bundle savedInstanceState) {  

  3. super.onCreate(savedInstanceState);  

  4.        setContentView(R.layout.main);  

  5.        button = (Button) findViewById(R.id.button);  

  6.        editText = (EditText) findViewById(R.id.edit);  

  7.        but_send = (Button) findViewById(R.id.but_send);  

  8.        but_logout = (Button) findViewById(R.id.but_logout);  

  9.        but_custom = (Button) findViewById(R.id.but_custom);  

  10.        button.setOnClickListener(this);  

  11.        but_logout.setOnClickListener(this);  

  12.        but_send.setOnClickListener(this);  

  13.        but_custom.setOnClickListener(this);  

  14.        preferences = getSharedPreferences(file, 0);  

  15.        token = preferences.getString(TOKEN_KEY, "");  

  16.        token_secret = preferences.getString(TOKEN_SECRET_KEY, "");  

  17.        oAuth = new OAuthV1(oauthCallback);  

  18.        oAuth.setOauthConsumerKey(oauthConsumeKey);  

  19.        oAuth.setOauthConsumerSecret(oauthConsumerSecret);  

  20. if (token != null && !token.equals("") && !token_secret.equals("")  

  21.                && token_secret != null) {  

  22.            button.setVisibility(View.GONE);  

  23.            but_custom.setVisibility(View.GONE);  

  24. // 将认证后的值set进去就可以调用了.

  25.            oAuth.setOauthToken(token);  

  26.            oAuth.setOauthTokenSecret(token_secret);  

  27.            System.out.println("token=" + token);  

  28.            System.out.println("token_secret=" + token_secret);  

  29.        }  

  30.    }  


[java] view plain copy
  1. // 向腾讯微博开放平台请求获得未授权的Request_Token

  2. try {  

  3.                oAuth = OAuthV1Client.requestToken(oAuth);  

  4.            } catch (Exception e) {  

  5.                e.printStackTrace();  

  6.            }  

  7. // 创建Intent,使用WebView让用户授权

  8.            intent = new Intent(MainActivity.this,  

  9.                    OAuthV1AuthorizeWebView.class);  

  10.            intent.putExtra("oauth", oAuth);  

  11.            startActivityForResult(intent, 1);  

这一点也很好理解,就是将获取到的未授权的oauth传到OAuthV1AuthorizeWebView.java中. 这里我不过多解释,一会我们自定义webview在解释.


最后我们要重写onActivityResult来接收OAuth对象.

[java] view plain copy
  1. protectedvoid onActivityResult(int requestCode, int resultCode, Intent data) {  

  2. if (requestCode == 1) {  

  3. if (resultCode == OAuthV1AuthorizeWebView.RESULT_CODE) {  

  4.                button.setVisibility(View.GONE);  

  5.                but_custom.setVisibility(View.GONE);  

  6. // 从返回的Intent中获取验证码

  7.                oAuth = (OAuthV1) data.getExtras().getSerializable("oauth");  

  8. /*

  9.                 * 注意:此时oauth中的Oauth_token和Oauth_token_secret将发生变化,用新获取到的

  10.                 * 已授权的access_token和access_token_secret替换之前存储的未授权的request_token

  11.                 * 和request_token_secret.

  12.                 */

  13. // 在这里要保存access_token,access_token_secret

  14. try {  

  15.                    oAuth = OAuthV1Client.accessToken(oAuth);  

  16.                    token = oAuth.getOauthToken();  

  17.                    token_secret = oAuth.getOauthTokenSecret();  

  18.                    editor = preferences.edit();  

  19.                    editor.putString(TOKEN_KEY, token);  

  20.                    editor.putString(TOKEN_SECRET_KEY, token_secret);  

  21.                    editor.commit();  

  22.                } catch (Exception e) {  

  23.                    e.printStackTrace();  

  24.                }  

  25.            }  

  26.        }  

  27.    }  

我写的有点小乱,不过相信你也看的明白.我们将返回的Oauth执行:oAuth = OAuthV1Client.accessToken(oAuth);


这个时候我们需要保存token = oAuth.getOauthToken();
token_secret = oAuth.getOauthTokenSecret(); 这样以后我们就不用每次认证,只需要将这两个值set进去就可以直接调用相应接口,简单吧。

效果图:


不过这样有几点小不爽,打开认证页面不够友好,还有认证页面不能够很好控制,比如我想让他融入到我的项目里面,等等,所以我们需要对Oauth认证页面自定义,因此我们就用到了自定义webview.

我简单说明下自定义webview认证.其实简单,把官方代码copy下来,稍做变动就ok了.


[java] view plain copy
  1. package com.jj.tencent;  

  2. import android.app.Activity;  

  3. import android.content.Intent;  

  4. import android.graphics.Bitmap;  

  5. import android.os.Bundle;  

  6. import android.util.Log;  

  7. import android.view.View;  

  8. import android.view.Window;  

  9. import android.view.ViewGroup.LayoutParams;  

  10. import android.webkit.WebSettings;  

  11. import android.webkit.WebView;  

  12. import android.webkit.WebViewClient;  

  13. import android.widget.LinearLayout;  

  14. import com.tencent.weibo.constants.OAuthConstants;  

  15. import com.tencent.weibo.oauthv1.OAuthV1;  

  16. /***

  17. * 腾讯微webview 认证

  18. *

  19. * @author zhangjia

  20. *

  21. */

  22. publicclass MyTencentWebViewActivity extends Activity {  

  23. publicfinalstaticint RESULT_CODE = 1;  

  24. privatestaticfinal String TAG = "OAuthV1AuthorizeWebView";  

  25. private OAuthV1 oAuth;  

  26. private LinearLayout linearLayout;// 进度条

  27. private WebView mWebView;  

  28. /***

  29.     * 初始化 webview

  30.     */

  31. publicvoid InitWebView() {  

  32.        linearLayout = (LinearLayout) findViewById(R.id.ll_webview);  

  33.        mWebView = (WebView) findViewById(R.id.mywebview);  

  34.        mWebView.setVerticalScrollBarEnabled(false);  

  35.        mWebView.setHorizontalScrollBarEnabled(false);  

  36.        mWebView.getSettings().setJavaScriptEnabled(true);  

  37.        mWebView.getSettings().setSupportZoom(true);  

  38.        mWebView.requestFocus();  

  39.        Intent intent = this.getIntent();  

  40.        oAuth = (OAuthV1) intent.getExtras().getSerializable("oauth");  

  41.        String urlStr = OAuthConstants.OAUTH_V1_AUTHORIZE_URL + "?oauth_token="

  42.                + oAuth.getOauthToken();  

  43.        mWebView.loadUrl(urlStr);  

  44.        mWebView.setWebViewClient(client);  

  45.    }  

  46. @Override

  47. publicvoid onCreate(Bundle savedInstanceState) {  

  48. super.onCreate(savedInstanceState);  

  49.        requestWindowFeature(Window.FEATURE_NO_TITLE);  

  50.        setContentView(R.layout.mywebview);  

  51.        InitWebView();  

  52.    }  

  53.    WebViewClient client = new WebViewClient() {  

  54. @Override

  55. publicvoid onPageStarted(WebView view, String url, Bitmap favicon) {  

  56.            Log.i(TAG, "WebView onPageStarted...");  

  57.            Log.i(TAG, "URL = " + url);  

  58. if (url.indexOf("checkType=verifycode") != -1) {  

  59. int start = url.indexOf("checkType=verifycode&v=") + 23;  

  60.                String verifyCode = url.substring(start, start + 6);  

  61.                oAuth.setOauthVerifier(verifyCode);  

  62.                Intent intent = new Intent();  

  63.                intent.putExtra("oauth", oAuth);  

  64.                setResult(RESULT_CODE, intent);  

  65.                view.destroyDrawingCache();  

  66.                finish();  

  67.            }  

  68. super.onPageStarted(view, url, favicon);  

  69.        }  

  70. @Override

  71. publicvoid onPageFinished(WebView view, String url) {  

  72. super.onPageFinished(view, url);  

  73.            linearLayout.setVisibility(View.GONE);  

  74.        }  

  75.    };  

  76. }  

实现效果:




这是演示效果,也许你看不出来有什么不同,下面请看这种情况:



(这是我正在开发的项目.)如果你单纯引用他给的webview是无法实现这种效果吧。就介绍这么多了,至于一些接口调用,发送,分享,获取好友等等只要参考API就好了.


你可能感兴趣的:(android,程序员,认证,腾讯微博,官方网站)