Android webview实现QQ一键登录授权
2015-07-23 16:49
1346 查看
Android webview实现QQ一键登录授权
最近公司要求的新需求,要实现webview中的的QQ登录,大脑没经过就习惯的百度,奈何找了两天的资料也没发现个完整的demo,只能自己写,好吧,还要去学JS,醉了。public class MainActivity extends Activity { private static final String LOG_TAG = "WebViewDemo"; private String url = "https://graph.qq.com/user/get_user_info"; private String SCOPE = "https://graph.qq.com/user/get_user_info,get_user_profile,add_share,add_topic,list_album,upload_pic,add_album";//授权范围 private WebView mWebView; private Handler mHandler = new Handler(); private Activity thisActivity; /** *qq登录 */ private Tencent mTencent; public static QQAuth mQQAuth; public static String mAppid; //测试用的ID,可改成你的ID private String APP_ID = "222222"; /** * 返回授权信息 */ private String code; private String openid; private String access_token; @SuppressLint("SetJavaScriptEnabled") @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.activity_main); // 启用一个新线程用于回调登录信息用 final Context context = MainActivity.this; final Context ctxContext = context.getApplicationContext(); mAppid = APP_ID; // 绑定ID mQQAuth = QQAuth.createInstance(mAppid, ctxContext); mTencent = Tencent.createInstance(mAppid, MainActivity.this); mWebView = (WebView) findViewById(R.id.webview); WebViewClient wvClient = new WebViewClient(); mWebView.setWebViewClient(wvClient); mWebView.setWebChromeClient(new WebChromeClient() { public boolean onJsAlert(WebView view, String url, String message, JsResult result) { return super.onJsAlert(view, url, message, result); } }); WebSettings webSettings = mWebView.getSettings(); webSettings.setSaveFormData(false); webSettings.setJavaScriptEnabled(true); webSettings.setDefaultTextEncodingName("utf-8"); webSettings.setSupportZoom(true); /**添加自定义的JavaJS函数接口,注意 * AndroidJSInterface 必须和JS写的一样 */ AndroidJSInterface ajsi = new AndroidJSInterface(this); mWebView.addJavascriptInterface(ajsi, ajsi.getInterface()); mWebView.loadUrl("file:///android_asset/login.html"); // 初始化activity //此步将直接绑定Main,不写将调不了SDK thisActivity=this; } final class AndroidJSInterface { private Context mContext; public AndroidJSInterface(Context context){ mContext = context; } // 该方法名称是JS自定义的interface后面的方法 //必须加上这句注释 @JavascriptInterface public void Login() { //这是要调用qqsdk的方法 if (!mTencent.isSessionValid()) { IUiListener listener = new IUiListener() { //授权失败的回调 @Override public void onError(UiError arg0) { Toast.makeText(MainActivity.this, "授权失败", 1000).show(); Message msg = new Message(); msg.arg1 = 2; mHandler.sendMessage(msg); } /** 取消授权的回调 */ @Override public void onCancel() { Toast.makeText(MainActivity.this, "取消授权", 1000).show(); Message msg = new Message(); msg.arg1 = 3; mHandler.sendMessage(msg); } /** 授权成功的回调 */ @Override public void onComplete(Object arg0) { Toast.makeText(MainActivity.this, "授权成功", 1000).show(); Message msg = new Message(); msg.arg1 = 1; msg.obj = arg0; mHandler.sendMessage(msg); } }; int res=mTencent.login(thisActivity, SCOPE, listener); }else { //登出 mTencent.logout(thisActivity); } } /** * 授权完成后回传给后台 */ @SuppressLint("HandlerLeak") Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.arg1) { case 1: { // 成功 final JSONObject jsobjStr = (JSONObject) msg.obj; try { //返回数据给后台 code = jsobjStr.optString("succcess").toString(); openid = jsobjStr.optString("openid").toString(); access_token = jsobjStr.optString("access_token").toString(); System.out.println(jsobjStr); //调用json方法, 调用js并传参 final JSONObject json = new JSONObject(); json.put("openid", openid); json.put("accesstoken", access_token); mHandler.post(new Runnable() { public void run() { mWebView.loadUrl("javascript:wave("+ json+")"); } }); } catch (Exception e) { e.printStackTrace(); } //没有做失败的操作 }; }; } }; /** * 根据一个网络连接(String)获取bitmap图像 */ public Bitmap getbitmap(String imageUri) { Log.v(LOG_TAG, "getbitmap:" + imageUri); // 显示网络上的图片 Bitmap bitmap = null; try { URL myFileUrl = new URL(imageUri); HttpURLConnection conn = (HttpURLConnection) myFileUrl .openConnection(); conn.setDoInput(true); conn.connect(); InputStream is = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(is); is.close(); Log.v(LOG_TAG, "image download finished." + imageUri); } catch (IOException e) { e.printStackTrace(); Log.v(LOG_TAG, "getbitmap bmp fail---"); return null; } return bitmap; } /** * 根据js按钮接口执行按钮监听操作 * 该名称必须和JS的window.(android_js_interface)一致 */ @JavascriptInterface public String getInterface(){ return "android_js_interface"; } }
最后要记得添加权限
<uses-permission android:name="android.permission.INTERNET" />
- **
JS的代码:
function init() {} function wave(jsobjStr) { document.getElementById("output").innerHTML="返回值:"+jsobjStr; alert("像服务器传入数据"); } function OnClick() { window.android_js_interface.Login(); } <input type="submit" value="QQ登录" onclick="window.android_js_interface.Login();"/>
资源我已上传,不过好像审核要时间,不明白的可加我QQ:943511917
相关文章推荐
- 移动端消息推送原理浅析及问题思考
- 在Cocos2d-x工程中嵌套使用Lua
- Android Studio快捷键大全
- Git fatal: failed to read object ..... : Invalid argument
- iOS URLEcode,URLDecode
- 【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载
- IOS-Block
- android双卡发短信,基于5.1.1实现
- swift extension
- 统计数组中元素出现的次数——Java小程序
- Android4.4 WifiP2pSettings 中调用流程
- iOS for循环创建button,button的宽度根据上面的文字来自适应.
- 在64位ubuntu15.04中安装android studio 开发环境
- Android碎片第二期
- Android 抽屉效果的导航菜单实现
- 浅谈android应用性能之内存(转)
- BaseActivity框架搭建
- unity 之2D游戏简单操作
- android 切换至surfaceView闪屏(黑屏)
- iOS开发个人独立博客收集