android新浪微博开发最新OAuth2.0认证
2012-11-15 19:55
330 查看
新浪微博最近采用了新的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认证方法(具体的新浪微博的认证方法可以参考给出的官方开发文档)。那么我们只要删除其中有关的两行调用代码即可,具体为:
修改之后,工程文件不会提示有错误,这时运行demo工程文件。
那么在我的环境下,在运行时会报错,在logcat中可以看到错误信息,大约是在WeiboDialog.java中setUpWebView()函数下有方法找不到资源的包,我就把具体的错误部分注释掉,如下:
再次运行demo工程,即可成功获取到授权认证。
我自己摸索了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工程,即可成功获取到授权认证。
相关文章推荐
- Android上开发新浪微博OAuth2.0认证
- Android上开发新浪微博OAuth2.0认证
- 【转载】android开发新浪微博客户端 完整攻略
- Android新浪微博开发(一)OAnth认证及账户管理、sdk的使用
- Android实战技巧之九:最新Android开发环境(Eclipse+ADT+Android 5.0)
- android开发我的新浪微博客户端-用户授权页面UI篇(3.1)
- 《新浪微博Android客户端开发完整视频 Touch Android版》
- 10本最新的Android开发电子书免费下载
- android ReactNative混合开发之最新教程
- android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录
- android开发新浪微博客户端 完整攻略 [新手必读]
- 使用Android ADT最新开发工具后,新建项目出现appcompat v7 他是什么?
- 最新Android 4.x 搭建开发环境
- android开发我的新浪微博客户端-登录页面UI篇(4.1)
- 最新Android 4.x 搭建开发环境
- android开发我的新浪微博客户端-用户首页面UI篇(5.1)
- Android NDK开发扫盲及最新CMake的编译使用
- 【Cocos2d-X(2.x) 游戏开发系列之二】cocos2dx最新2.0.1版本跨平台整合NDK+Xcode编译到Android 推荐
- 【Android UI设计与开发】第08期:底部菜单栏(三)Fragment+FragmentTabHost实现仿新浪微博底部菜单栏
- 2012年全国最新Android开发工程师薪资水平调查分析