android新浪微博开发最新OAuth2.0认证

新浪微博最近采用了新的OAuth2.0认证登录,之前并且发布了最新的SDK开发文档,对于初次接触android新浪微博开发的程序员来说这并不是一个好的事情。本身,OAuth2.0认证登录就不同于OAuth1.0认证,引用了新的认证机制,而网络上基于OAuth2.0认证登录的讲解确实是少的可怜,而对于新浪最新的android版微博SDK的讲解就基本是没有,这对于一些初学者来说实在是很麻烦的一个难题。

我自己摸索了2天,基本把android版的新浪微博OAuth2.0认证登录实现了。写下我的探索过程,希望帮助更多的初次接触新浪微博开发的程序员少走弯路,当然,这些弯路也未必不是好的。不过还是能够有一些提示的作用吧。

对于android版新浪微博的开发,首先最好还是先运行一下java版的OAuth2.0认证,我也进行了我的讲解,详情参考我上一篇博客。

话不多说,开始说点干货。


首先,在新浪微博开发平台下载下来最新版android新浪微博官方SDK。

下载好之后,里边有5个文件,有一个demo是新浪官方做的一个基本的登录演示,我这里基本就讲解如何运行成功这个demo,能够成功运行这个demo,就基本掌握了OAuth2.0的认证方法。


PS:新浪很贴心的为开发者准备了一份开发资料,最好好好研究一下里面的东西,很有用处。


接下来,导入其中的文件weibo.sdk.android和weibo.sdk.android.api文件夹到eclipse,不要动其中的内容。

将这两个文件,分别右键点击进入properties---->android---->将Is Library打勾。


接着,导入weibo.sdk.android.demo文件到eclipse,右键进入properties---->android---->不要将Is Library打勾!点击右边的add,添加刚刚导入的两个weibo.sdk.android和weibo.sdk.android.api文件,这是在看demo工程,在MainActivity中会有报错,是因为,在官方给出的MainActivity中同时调用了sso认证方法(具体的新浪微博的认证方法可以参考给出的官方开发文档)。那么我们只要删除其中有关的两行调用代码即可,具体为:

package com.weibo.sdk.android.demo;

import java.text.SimpleDateFormat;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.weibo.sdk.android.Oauth2AccessToken;
import com.weibo.sdk.android.Weibo;
import com.weibo.sdk.android.WeiboAuthListener;
import com.weibo.sdk.android.WeiboDialogError;
import com.weibo.sdk.android.WeiboException;
import com.weibo.sdk.android.keep.AccessTokenKeeper;
//import com.weibo.sdk.android.sso.SsoHandler;
import com.weibo.sdk.android.util.Utility;

public class MainActivity extends Activity {
	

    private Weibo mWeibo;
	private static final String CONSUMER_KEY = "";// 替换为开发者的appkey,例如"1646212860";
	private static final String REDIRECT_URL = "";//替换为开发者的回调地址
	private Intent it = null;
	private Button authBtn,apiBtn,ssoBtn,cancelBtn;
	private TextView mText;
	public static Oauth2AccessToken accessToken ;
	public static final String TAG="sinasdk";
	/**
	 * SsoHandler 仅当sdk支持sso时有效,
	 */
//	 SsoHandler mSsoHandler;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mWeibo = Weibo.getInstance(CONSUMER_KEY, REDIRECT_URL);
		
		authBtn = (Button)findViewById(R.id.auth);
		authBtn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				mWeibo.authorize(MainActivity.this, new AuthDialogListener());
			}
		});
		ssoBtn=(Button)findViewById(R.id.sso);//触发sso的按钮
		try {
            Class sso=Class.forName("com.weibo.sdk.android.sso.SsoHandler");
            ssoBtn.setVisibility(View.VISIBLE);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            Log.i(TAG, "com.weibo.sdk.android.sso.SsoHandler not found");
           
        }
		ssoBtn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                /**
                 * 下面两个注释掉的代码,仅当sdk支持sso时有效,
                 */
                
//                mSsoHandler =new SsoHandler(MainActivity.this,mWeibo);
//                mSsoHandler.authorize( new AuthDialogListener());
            }
        });
		cancelBtn=(Button)findViewById(R.id.apiCancel);
		cancelBtn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                AccessTokenKeeper.clear(MainActivity.this);
                apiBtn.setVisibility(View.INVISIBLE);
                authBtn.setVisibility(View.VISIBLE);
                ssoBtn.setVisibility(View.VISIBLE);
                cancelBtn.setVisibility(View.INVISIBLE);
                mText.setText("");
            }
        });
		
		Button send = (Button) findViewById(R.id.sendBtn);
		send.setOnClickListener(new OnClickListener() {
		    
			@Override
			public void onClick(View v) {
				startActivity(it);
			}
		});
		
		apiBtn=(Button)findViewById(R.id.apiBtn);
		apiBtn.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setClass(MainActivity.this, APITypeListActivity.class);
                startActivity(intent);
            }
        });
		 mText =(TextView)findViewById(R.id.show);
		MainActivity.accessToken=AccessTokenKeeper.readAccessToken(this);
        if(MainActivity.accessToken.isSessionValid()){
        	Weibo.isWifi=Utility.isWifi(this);
            try {
                Class sso=Class.forName("com.weibo.sdk.android.api.WeiboAPI");//如果支持weiboapi的话,显示api功能演示入口按钮
                apiBtn.setVisibility(View.VISIBLE);
            } catch (ClassNotFoundException e) {
//                e.printStackTrace();
                Log.i(TAG, "com.weibo.sdk.android.api.WeiboAPI not found");
               
            }
            authBtn.setVisibility(View.INVISIBLE);
            ssoBtn.setVisibility(View.INVISIBLE);
            cancelBtn.setVisibility(View.VISIBLE);
            String date = new java.text.SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new java.util.Date(MainActivity.accessToken.getExpiresTime()));
            mText.setText("access_token 仍在有效期内,无需再次登录: \naccess_token:"+ MainActivity.accessToken.getToken() + "\n有效期:"+date);
        }
        else{
            mText.setText("使用SSO登录前,请检查手机上是否已经安装新浪微博客户端,目前仅3.0.0及以上微博客户端版本支持SSO;如果未安装,将自动转为Oauth2.0进行认证");
        }
		
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

	class AuthDialogListener implements WeiboAuthListener {

		@Override
		public void onComplete(Bundle values) {
			String token = values.getString("access_token");
			String expires_in = values.getString("expires_in");
			MainActivity.accessToken = new Oauth2AccessToken(token, expires_in);
			if (MainActivity.accessToken.isSessionValid()) {
				String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new java.util.Date(MainActivity.accessToken.getExpiresTime()));
				mText.setText("认证成功: \r\n access_token: "+ token + "\r\n" + "expires_in: " + expires_in+"\r\n有效期:"+date);
				try {
	                Class sso=Class.forName("com.weibo.sdk.android.api.WeiboAPI");//如果支持weiboapi的话,显示api功能演示入口按钮
	                apiBtn.setVisibility(View.VISIBLE);
	            } catch (ClassNotFoundException e) {
//	                e.printStackTrace();
	                Log.i(TAG, "com.weibo.sdk.android.api.WeiboAPI not found");
	               
	            }
				cancelBtn.setVisibility(View.VISIBLE);
				AccessTokenKeeper.keepAccessToken(MainActivity.this, accessToken);
				Toast.makeText(MainActivity.this, "认证成功", Toast.LENGTH_SHORT).show();
			}
		}

		@Override
		public void onError(WeiboDialogError e) {
			Toast.makeText(getApplicationContext(), "Auth error : " + e.getMessage(),
					Toast.LENGTH_LONG).show();
		}

		@Override
		public void onCancel() {
			Toast.makeText(getApplicationContext(), "Auth cancel", Toast.LENGTH_LONG).show();
		}

		@Override
		public void onWeiboException(WeiboException e) {
			Toast.makeText(getApplicationContext(), "Auth exception : " + e.getMessage(),
					Toast.LENGTH_LONG).show();
		}

	}

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        
        /**
         * 下面两个注释掉的代码,仅当sdk支持sso时有效,
         */
//        if(mSsoHandler!=null){
//            mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
//        }
    }

}

修改之后,工程文件不会提示有错误,这时运行demo工程文件。


那么在我的环境下,在运行时会报错,在logcat中可以看到错误信息,大约是在WeiboDialog.java中setUpWebView()函数下有方法找不到资源的包,我就把具体的错误部分注释掉,如下:


private void setUpWebView() { 
		webViewContainer = new RelativeLayout(getContext());
		mWebView = new WebView(getContext());
		mWebView.setVerticalScrollBarEnabled(false);
		mWebView.setHorizontalScrollBarEnabled(false);
		mWebView.getSettings().setJavaScriptEnabled(true);
		mWebView.setWebViewClient(new WeiboDialog.WeiboWebViewClient());
		mWebView.loadUrl(mUrl);
		mWebView.setLayoutParams(FILL);
		mWebView.setVisibility(View.INVISIBLE);
		
		RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,
				LayoutParams.FILL_PARENT);
		
		RelativeLayout.LayoutParams lp0 = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.FILL_PARENT);
		
        mContent.setBackgroundColor(Color.TRANSPARENT);
        AssetManager asseets=WeiboDialog.this.getContext().getAssets();
        InputStream is=null;
        try {
             try {
               is=asseets.open("weibosdk_dialog_bg.9.png");
               DisplayMetrics dm = this.getContext().getResources()
                       .getDisplayMetrics();
               float density=dm.density;
               lp0.leftMargin =(int) (10*density);
               lp0.topMargin = (int) (10*density);
               lp0.rightMargin =(int) (10*density);
               lp0.bottomMargin = (int) (10*density);
           } catch (Exception e) {
               e.printStackTrace();
           }
//             if(is==null){
//                     webViewContainer.setBackgroundResource(R.drawable.weibosdk_dialog_bg);
//             }
//            else{
                   Bitmap bitmap = BitmapFactory.decodeStream(is);
                   NinePatchDrawable npd=new NinePatchDrawable(bitmap, bitmap.getNinePatchChunk(), new Rect(0,0,0,0), null); 
                   webViewContainer.setBackgroundDrawable(npd);
//             }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
		
        webViewContainer.addView(mWebView,lp0);
		webViewContainer.setGravity(Gravity.CENTER);
		
//		if(parseDimens()){
		    lp.leftMargin = left_margin;
	        lp.topMargin = top_margin;
	        lp.rightMargin =right_margin;
	        lp.bottomMargin = bottom_margin;
//		}
//		else{
//		    Resources resources = getContext().getResources();
//		    lp.leftMargin=resources.getDimensionPixelSize(R.dimen.weibosdk_dialog_left_margin);
//		    lp.rightMargin=resources.getDimensionPixelSize(R.dimen.weibosdk_dialog_right_margin);
//		    lp.topMargin=resources.getDimensionPixelSize(R.dimen.weibosdk_dialog_top_margin);
//		    lp.bottomMargin=resources.getDimensionPixelSize(R.dimen.weibosdk_dialog_bottom_margin);
//		}
        mContent.addView(webViewContainer, lp);
	}

	private class WeiboWebViewClient extends WebViewClient {

		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			Log.d(TAG, "Redirect URL: " + url);
			 if (url.startsWith("sms:")) {  //针对webview里的短信注册流程,需要在此单独处理sms协议
	                Intent sendIntent = new Intent(Intent.ACTION_VIEW);  
	                sendIntent.putExtra("address", url.replace("sms:", ""));  
	                sendIntent.setType("vnd.android-dir/mms-sms");  
	                WeiboDialog.this.getContext().startActivity(sendIntent);  
	                return true;  
	            }  
			return super.shouldOverrideUrlLoading(view, url);
		}


再次运行demo工程,即可成功获取到授权认证。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值