package com.itap.voiceemoticon.weibo; import org.tadpoleframework.view.TadpoleWebView; import android.Manifest; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.net.http.SslError; import android.os.Bundle; import android.os.Message; import android.util.AttributeSet; import android.util.Log; import android.webkit.CookieManager; import android.webkit.CookieSyncManager; import android.webkit.SslErrorHandler; import android.webkit.WebView; import android.webkit.WebViewClient; import com.weibo.sdk.android.Oauth2AccessToken; import com.weibo.sdk.android.WeiboException; import com.weibo.sdk.android.WeiboParameters; import com.zenip.weibo.sdk.android.util.Utility; public class WeiboLoginWebView extends TadpoleWebView { public static final String KEY_TOKEN = "access_token"; public static final String KEY_EXPIRES = "expires_in"; public static final String KEY_REFRESHTOKEN = "refresh_token"; public static String URL_OAUTH2_ACCESS_AUTHORIZE = "https://open.weibo.cn/oauth2/authorize"; private IWeiboLoginListener mListener; private Oauth2AccessToken mToken; private Object mTag; public WeiboLoginWebView(Context context) { super(context); init(); } public WeiboLoginWebView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public WeiboLoginWebView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { getSettings().setSaveFormData(false); getSettings().setSavePassword(false); setVerticalScrollBarEnabled(false); setHorizontalScrollBarEnabled(false); getSettings().setJavaScriptEnabled(true); setWebViewClient(new WeiboWebViewClient()); } private class WeiboWebViewClient extends WebViewClient { private static final String TAG = "WeiboWebViewClient"; @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"); view.getContext().startActivity(sendIntent); return true; } return super.shouldOverrideUrlLoading(view, url); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Log.d(TAG, "onReceivedError URL: " + failingUrl); super.onReceivedError(view, errorCode, description, failingUrl); if (null == mListener) { return; } mListener.onWebViewError(errorCode, failingUrl, description); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.d(TAG, "onPageStarted URL: " + url); if (url.startsWith(TPAccountManager.REDIRECT_URL)) { handleRedirectUrl(view, url); view.stopLoading(); return; } super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { Log.d(TAG, "onPageFinished URL: " + url); super.onPageFinished(view, url); } public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); } } public void setTag(Object tag) { mTag = tag; } private void handleRedirectUrl(WebView view, String url) { Bundle values = Utility.parseUrl(url); TPAccountManager.getInstance().weiboLoginFinish(values, mTag); } public void login() { Context context = getContext(); WeiboParameters parameters = new WeiboParameters(); parameters.add("client_id", TPAccountManager.APP_KEY); parameters.add("response_type", "code"); parameters.add("redirect_uri", TPAccountManager.REDIRECT_URL); parameters.add("display", "mobile"); parameters.add("scope", ""); parameters.add("packagename", context.getPackageName()); parameters.add("key_hash", com.weibo.sdk.android.util.Utility.getSign(context, context.getPackageName())); CookieSyncManager.createInstance(getContext()); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.removeAllCookie(); Oauth2AccessToken token = WeiboLoginAcountManager.getInstance() .getLastLoginAccessToken(); System.out.println("accessToken = " + token); if (token != null && token.isSessionValid()) { parameters.add(KEY_TOKEN, token.getToken()); } String url = URL_OAUTH2_ACCESS_AUTHORIZE + "?" + Utility.encodeUrl(parameters); if (context.checkCallingOrSelfPermission(Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) { Utility.showAlert(context, "Error", "Application requires permission to access the Internet"); } else { loadUrl(url); } } }