新浪微博Android客户端学习记录四:完成OAuth认证

       本课主要讲解了在Android 中如何完成用户OAuth认证。

       微博操作的流程图:

      点击了开始后:

 

       首先是获取新浪微博的OAuth授权(WebViewActivity.java):

package haiyang.project.iweibo.ui;

import haiyang.project.iweibo.R;
import haiyang.project.iweibo.util.AuthUtil;
import haiyang.project.iweibo.util.JavascriptInterface;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

/*
 * 新浪微博OAuth授权页面
 */
public class WebViewActivity extends Activity{
	
	private WebView webView;
	private ProgressDialog progressDialog;
	private static final int CLOSE_DLG=1;
	private Handler handler;
	String url=null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.webview);
		
		url=AuthUtil.getAuthorizationURL();
		if(url==null){
			Toast.makeText(this, R.string.auth_url_empty, 3000).show();
			return;
		}
		
		init();
		load(url,webView);
		
		handler=new Handler(){
			public void handleMessage(android.os.Message msg) {
				if(msg.what==CLOSE_DLG){
					progressDialog.dismiss();
				}
			};
		};
	}
	
	public void init(){
		if(progressDialog==null){
			progressDialog=new ProgressDialog(this);
		}
		progressDialog.setMessage("正在加载");
		progressDialog.show();
		
		webView=(WebView) this.findViewById(R.id.wv_oauth); 
		webView.getSettings().setJavaScriptEnabled(true);
		webView.addJavascriptInterface(new JavascriptInterface(), "Methods");
		
		webView.setWebViewClient(new WebViewClient(){
			@Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				load(url,webView);
				return true;
			}
			
			@Override
			public void onPageFinished(WebView view, String url) {
				if(url.equals("http://api.t.sina.com.cn/oauth/authorize")){
					String load="javascript:window.Methods.getPin('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>')";
					view.loadUrl(load);
					
					Intent intent=new Intent(WebViewActivity.this,AccessTokenActivity.class);
					startActivity(intent);
				}
				super.onPageFinished(view, url);
			}
			
		});
		
		webView.setWebChromeClient(new WebChromeClient(){

			public void onProgressChanged(WebView view, int newProgress) {
				if(newProgress==100){
					handler.sendEmptyMessage(CLOSE_DLG);
				}
				super.onProgressChanged(view, newProgress);
			}
		});
	}
	
	public void load(final String url,final WebView view){
		if(url==null||"".equals(url)){
			return;
		}
		new Thread(){
			public void run() {
				view.loadUrl(url);
			}
		}.start();
	}
}

      获取授权URL(AuthUtil.java)

package haiyang.project.iweibo.util;

import weibo4android.Weibo;
import weibo4android.WeiboException;
import weibo4android.http.AccessToken;
import weibo4android.http.RequestToken;

public class AuthUtil {
	
	private static Weibo weibo;
	private static RequestToken requestToken;
	static{
		System.setProperty("weibo4j.oauth.consumerKey", Weibo.CONSUMER_KEY);
		System.setProperty("weibo4j.oauth.consumerSecret", Weibo.CONSUMER_SECRET);
		weibo=new Weibo();
	}
	
	/**
	 * 获取授权URL
	 * @return
	 */
	public static String getAuthorizationURL(){
		try {
			requestToken=weibo.getOAuthRequestToken();
			return requestToken.getAuthorizationURL();
		} catch (WeiboException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	public static void getAccessToken(String pin){
		try {
			AccessToken accessToken=requestToken.getAccessToken(pin);
			System.out.println("Access token: "+ accessToken.getToken());
			System.out.println("Access token secret: "+ accessToken.getTokenSecret());
			System.out.println("userID: "+accessToken.getUserId());
		} catch (WeiboException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}

         获取PIN值

package haiyang.project.iweibo.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 获取PIN值
 * @author Administrator
 *
 */
public class JavascriptInterface {
	
	//授权码
	public static String PIN=null;

	public void getPin(String html){

		String pin=null;
		String reg="[0-9]{6}";
		
		Pattern pattern=Pattern.compile(reg);
		Matcher matcher=pattern.matcher(html);
	
		if(matcher.find()){//find each match in turn
			pin=matcher.group(0);//Access a submatch group
		}
		PIN=pin;
	}
}

   获取AccessToken

package haiyang.project.iweibo.ui;

import haiyang.project.iweibo.util.AuthUtil;
import haiyang.project.iweibo.util.JavascriptInterface;
import android.app.Activity;
import android.os.Bundle;

public class AccessTokenActivity extends Activity{
	protected void onCreate(Bundle savedInstanceState) {
		
		String pin=JavascriptInterface.PIN;
		AuthUtil.getAccessToken(pin);
		super.onCreate(savedInstanceState);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值