- 浏览: 591179 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (154)
- java (31)
- Struts (3)
- Hibernate (8)
- Spring (6)
- JS (14)
- DWR (1)
- Oracle (1)
- SQL Server (0)
- JSF (0)
- JPA (0)
- Grails (3)
- Ajax (1)
- Extjs (0)
- jQuery (4)
- MySQL (2)
- 正则表达式 (2)
- 其他 (6)
- 计算机应用 (7)
- Groovy (8)
- Google (1)
- Web (2)
- MongoDB Java Driver (1)
- mongodb (1)
- Linux (3)
- HTML (1)
- Tomcat (3)
- Eclipse (2)
- JSP (1)
- 缓存 (1)
- 动态 (1)
- 问题与解决 (3)
- HY (1)
- Android (35)
- LBS (1)
最新评论
-
u012136165:
list 方法:纠正:[2,5].add(1,9) ...
Groovy的list和map -
bruce.yuan:
误人子弟的文章。已经看到N个人转了这个帖子,这要贻害多少新人啊 ...
理解并解决GBK转UTF-8奇数中文乱码 -
思念-悲伤:
特意登录上来,感谢下!
理解String的compareTo()方法返回值 -
bo_hai:
总结的好,有效。
理解String的compareTo()方法返回值 -
u012678420:
在onCreate方法中获取某个View的宽度和高度
#新浪官方下载SDK(weibo4android)
http://open.weibo.com/wiki/index.php/SDK
#申请应用KEY
登录新浪微博,进入http://open.weibo.com/申请应用,获取KEY和SECRET。
#准备
在项目中导入commons-httpclient-3.x.jar并加入weibo4android、weibo4android.http、weibo4android.org.json、weibo4android.util包文件(这些都是官方下载的SDK提供的文件)
在跳转到新浪微博授权页面时会使用默认浏览器,这个不太好看,也有些用户手机用其他如UC等浏览器。因此,我决定用WebView代换默认浏览器。
默认浏览器
WebView代换
在我的项目中,有多个应用项目需要OAuth登录,因此需要做成共通,也考虑到应用今后可能会支持如腾讯微博、人人网、支付宝等多种方式登录,所以我的代码考虑了“开-闭原则”。
package com.oauth; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; public class ShareWithOAuthActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.share_button).setOnClickListener(new OnClickListener() { @Override public void onClick(View button) { OAuth.share(ShareWithOAuthActivity.this); } }); } }
package com.oauth; import com.db.DbHelper; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.widget.Toast; public class Share { public static final String SINA = "sina"; public static final String TENCENT = "tencent"; private static AlertDialog alertDialog = null; private static String[] shareList = null; private static String[] fullShareList = null; public static void share(final Context context, final String content) { if (shareList == null) { shareList = context.getResources().getStringArray(R.array.share_list); fullShareList = new String[shareList.length]; for (int i=0; i<shareList.length; i++) { fullShareList[i] = "分享到" + shareList[i]; } } if (alertDialog == null) { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context); dialogBuilder.setTitle("分享"); dialogBuilder.setItems(fullShareList, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int position) { String flag = text2Flag(context, shareList[position]); if (flag != null) { oauthLogin(context, flag, content); } } }); alertDialog = dialogBuilder.create(); } alertDialog.show(); } public static String text2Flag(Context context, String text) { String result = null; if ("新浪微博".equals(text)) { result = SINA; } else if ("腾讯微博".equals(text)) { result = TENCENT; } else { Toast.makeText(context, "没有匹配的类型", Toast.LENGTH_SHORT).show(); } return result; } public static void oauthLogin(Context context, String flag, String content) { Intent intent = new Intent(); intent.putExtra("oauth_type", flag); intent.putExtra("share_content", content); Cursor cursor = DbHelper.getUserByFlag(flag); if (cursor != null && cursor.moveToFirst()) { intent.putExtra("token", cursor.getString(cursor.getColumnIndex("token"))); intent.putExtra("secret", cursor.getString(cursor.getColumnIndex("secret"))); intent.setClass(context, ShareActivity.class); } else { if (SINA.equals(flag)) { intent.setClass(context, SinaOAuth.class); } else if (TENCENT.equals(flag)) { intent.setClass(context, TencentOAuth.class); } } if(cursor != null) cursor.close(); context.startActivity(intent); } }
res/layout/oauth_webview_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/oauth_webview_title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#996633" android:textColor="#000" android:textSize="18dp" /> <WebView android:id="@+id/oauth_webview" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>
package com.oauth; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.webkit.WebView; import android.widget.TextView; import android.webkit.WebViewClient; public abstract class OAuthActivity extends Activity { protected static OAuthActivity oauthActivity; protected TextView titleView; protected WebView oauthWebView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.oauth_webview_layout); initViews(); oauthLogin(); } private void initViews() { titleView = (TextView)findViewById(R.id.oauth_webview_title); oauthWebView = (WebView)findViewById(R.id.oauth_webview); oauthWebView.getSettings().setJavaScriptEnabled(true); oauthWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url == null) return false; if (url.startsWith("weibo4android")) { Intent intent = new Intent(OAuthActivity.this, CallbackActivity.class); intent.setData(Uri.parse(url)); OAuthActivity.this.startActivity(intent); } else { view.loadUrl(url);//腾讯微博在载入授权页面时会跳转,这里不写会用默认浏览器加载页面 } return true; } }); } protected abstract void oauthLogin(); protected abstract void callback(Intent callbackIntent); public static void postLogin(Intent callbackIntent) { if (oauthActivity != null) { oauthActivity.callback(callbackIntent); } oauthActivity = null; } }
package com.oauth; import com.db.DbHelper; import weibo4android.Weibo; import weibo4android.WeiboException; import weibo4android.http.AccessToken; import weibo4android.http.RequestToken; import android.content.Intent; import android.net.Uri; import android.os.Bundle; public class SinaOAuth extends OAuthActivity { private RequestToken requestToken; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); titleView.setText("新浪微博登录"); } @Override protected void oauthLogin() { System.setProperty("weibo4j.oauth.consumerKey", Weibo.CONSUMER_KEY); System.setProperty("weibo4j.oauth.consumerSecret", Weibo.CONSUMER_SECRET); Weibo weibo = new Weibo(); try { requestToken = weibo.getOAuthRequestToken("weibo4android://CallbackActivity"); Uri uri = Uri.parse(requestToken.getAuthenticationURL()+ "&display=mobile"); oauthWebView.loadUrl(uri.toString());//自定义WebView } catch (WeiboException e) { e.printStackTrace(); } oauthActivity = this;//此处很关键 } @Override public void callback(Intent callbackIntent) { Uri uri = callbackIntent.getData(); AccessToken accessToken = null; try { accessToken = requestToken.getAccessToken(uri.getQueryParameter("oauth_verifier")); } catch (WeiboException e) { e.printStackTrace(); return; } DbHelper.persistUser(Share.SINA, accessToken.getUserId(), accessToken.getToken(), accessToken.getTokenSecret()); Intent intent = this.getIntent(); intent.putExtra("oauth_type", Share.SINA); intent.putExtra("token", accessToken.getToken()); intent.putExtra("secret", accessToken.getTokenSecret()); intent.setClass(this, ShareActivity.class); this.startActivity(intent); this.finish(); } }
package com.oauth; import android.app.Activity; import android.os.Bundle; public class CallbackActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); OAuthActivity.postLogin(this.getIntent()); } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.oauth" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="7" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:name="com.application.CommonApplication" android:icon="@drawable/icon" android:theme="@style/theme" android:label="@string/app_name"> <activity android:name=".ShareWithOAuthActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".CallbackActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="weibo4android" android:host="CallbackActivity" /> </intent-filter> </activity> <activity android:name=".SinaOAuth" android:theme="@android:style/Theme.NoTitleBar" /> <activity android:name=".TencentOAuth" android:theme="@android:style/Theme.NoTitleBar" /> <activity android:name=".ShareActivity" android:launchMode="singleTask"/> <activity android:name=".ChangeAccountActivity" /> </application> </manifest>
评论
4 楼
ok_lanyan
2012-07-10
你好,我最近也在弄新浪分享,源码能给我一份吗?急求。。。。。ok_lanyan@163.com,谢谢
3 楼
浪迹随风
2012-05-28
可以不使用webVIEW方式达到授权认证的效果吗?有什么好的办法解决?请教下
2 楼
chenfeng0104
2012-02-28
yautah 写道
这种做法,网速稍微慢一点,应该很容易出anr的情况
url请求可以在异步线程中执行
1 楼
yautah
2011-12-09
这种做法,网速稍微慢一点,应该很容易出anr的情况
发表评论
-
深入分析AIDL原理
2011-11-13 16:14 25357在上一篇文章(Service使用方式)中,介绍了Android ... -
Service使用方式
2011-11-13 15:23 6022使用Service的场合: ... -
在onCreate方法中获取某个View的宽度和高度
2011-10-08 14:54 14414有时候需要在onCreate方法中知道某个View组件的宽度和 ... -
不加载图片,仅仅获取图片文件分辨率
2011-10-08 11:09 3925当从SD卡中获取图片时,如果图片太大,加载会出现溢出异常。因此 ... -
图片移动和缩放
2011-09-29 22:15 2101import android.graphics.Matr ... -
定时任务
2011-09-28 00:53 1482定时任务有执行一次和重复执行两种 public cla ... -
几种创建LayoutInflater对象的方法
2011-09-28 00:51 1836LayoutInflater layoutInflate ... -
判断网络类型及是否有网络
2011-09-28 00:49 2738判断当前是否有可用网络 public boolean ... -
设置全屏
2011-09-26 23:40 18861.编程方式 public void setFullS ... -
dip与px单位之间转换
2011-09-25 10:11 1611//转换dip为px public static in ... -
屏幕尺寸(高、宽)
2011-09-25 10:11 1863Display display = getWindowM ... -
判断手机外存(SD卡)状态
2011-09-25 10:07 2134public int getExternalStorag ... -
SQLite数据类型
2011-09-25 10:03 9317一般数据采用的固 ... -
使用WebView实现腾讯微博OAuth登录
2011-09-24 21:11 4847接着上一篇文章"使用WebView实现新浪微博OAu ... -
高效率下载图片——防止内存溢出
2011-09-18 13:09 2176在应用中经常需要下载很多的图片,因此,写好图片下载部分的代码非 ... -
PopupWindow使用
2011-09-16 14:05 1760使用PopupWindow来显示一个浮层 点击按钮后弹出 ... -
Android通知
2011-09-07 17:56 1884private void showNotification() ... -
AlarmManager.RTC和ELAPSED_REALTIME的区别
2011-09-04 17:33 30031AlarmManager.RTC,硬件闹钟,不唤醒手机( ... -
开机自启动
2011-09-04 13:55 1618经常会有这样的需求,当手机开机后立刻启动一个服务或者一个活动。 ... -
Android虚拟机(DVM)内存分配——内存溢出问题
2011-09-03 17:19 9863大家都知道Android的上层应用是基于 Dalvik ...
相关推荐
RT,使用WebView实现新浪微博Oauth2.0认证,非截取html代码获取验证码 界面跳转无副作用
Android WebView 新浪微博自动登陆
android 腾讯微博Oauth2.0认证以及自定义webview认证
Android新浪微博,通过WebView来截取授权验证码 ~~~~ Android新浪微博,通过WebView来截取授权验证码 ~~~~
Android版新浪、网易、腾讯、搜狐微博OAuth认证实例集,想更多了解OAuth认证的朋友,请下载java源码包,在示例中完整解析了OAuth认证的过程:定义URL编码方式,请求url,得到注册应用后服务商提供的key和secret,...
自己写的使用WebView授权DEMO 与上一版相比,该demo取消使用safari授权、取消使用asi进行http访问;同时保留了aes加密模块;增加了腾讯微博的授权,分享微博功能
oauth2.0授权界面,大致流程图: 前提准备: 在新浪开放平台申请appkey和...大致思路如下:建立一个webview加载授权界面,授权回调地址请参考Constants.java里面有详细注解。页面加载时会回调该方法,如果用户同意
Android简单基于WebView的OAuth身份验证库
weibo文件夹为android端代码,weiboios文件夹为ios端代码
react native高德地图拖拽定位demo,使用webview实现
Android上开发新浪微博分享功能,授权时不使用webview以及浏览器,直接在EditText里输入登录名和密码即可授权发微博(带图片及不带图片)
android使用webView实现java程序与js脚本的相互调用,
三个Button,一个EditText,一个WebView实现输入网址打开网址,返回后退功能
不必担心,不需要自己去写WebView去加载授权页面,新浪、腾讯微博SDK都已封装好了,他们的SDK里面已经完成了这些操作。新浪微博使用的dialog加载的授权页面,而腾讯使用的是Activity加载的授权页面。无论双方方式...
仿天天动听用WebView实现的引导页面 网页 (Webview)
在安卓开发过程中,会出现对接H5需要拍照及选择本地图片上传的需求。这个功能的实现需要调用安卓的相关操作,然后将获取到的图片路径传给H5。
仿新浪微博Android客户端主界面的源码。
使用android studio 3.1.2 ,利用webview,实现登录界面。采用本地html 页面
相关博客地址:http://blog.csdn.net/qq_25193681/article/details/52117281
// 20_帅哥no微博 // // Created by beyond on 14-8-5. // Copyright (c) 2014年 com.beyond. All rights reserved. // 授权控制器,仅运行一次,取得了当前用户的access_token和uid之后,存档,切换窗口的主控制器 #...