package com.weibo.sdk.android; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnKeyListener; import android.content.Intent; import android.graphics.Bitmap; import android.net.http.SslError; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.Window; import android.webkit.SslErrorHandler; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.RelativeLayout; import com.weibo.sdk.android.util.Utility; public class WeiboLoginActivity extends Activity{ private static final FrameLayout.LayoutParams FILL = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); static final int MARGIN = 4; static final int PADDING = 2; private final Weibo mWeibo = Weibo.getInstance(Weibo.app_key , Weibo.redirecturl); private static String mUrl; private static WeiboAuthListener mListener; private ProgressDialog mSpinner; private ImageView mBtnClose; private WebView mWebView; private RelativeLayout webViewContainer; private RelativeLayout mContent; private RelativeLayout top ; private final static String TAG = "Weibo-WebView"; public static void Luanch(Context context , String url , WeiboAuthListener listener){ Intent intent = new Intent(context , WeiboLoginActivity.class); mUrl = url ; mListener = listener ; context.startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { mSpinner = new ProgressDialog(this); mSpinner.requestWindowFeature(Window.FEATURE_NO_TITLE); mSpinner.setMessage(getResources().getString(R.string.loading)); mSpinner.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { onBack(); return false; } }); requestWindowFeature(Window.FEATURE_NO_TITLE); mContent = new RelativeLayout(this); // mContent = (RelativeLayout) getLayoutInflater().inflate(R.layout.login, null, false); top = (RelativeLayout) getLayoutInflater().inflate(R.layout.top_sina_back, null, false); setUpWebView(); // setUpCloseBtn(); mContent.setBackgroundResource(R.drawable.content_bg); addContentView(mContent, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); super.onCreate(savedInstanceState); } protected void onBack() { try { mSpinner.dismiss(); if (null != mWebView) { mWebView.stopLoading(); mWebView.destroy(); } } catch (Exception e) { } // mSpinner.dismiss(); } private void setUpWebView() { webViewContainer = new RelativeLayout(this); mWebView = new WebView(this); mWebView.setVerticalScrollBarEnabled(false); mWebView.setHorizontalScrollBarEnabled(false); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.setWebViewClient(new WeiboWebViewClient()); mWebView.loadUrl(mUrl); mWebView.setLayoutParams(FILL); mWebView.setVisibility(View.INVISIBLE); webViewContainer.addView(mWebView); final float scale = WeiboLoginActivity.this.getResources().getDisplayMetrics().density; RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); lp.leftMargin = -10; lp.topMargin =(int) (40 * scale - 14); lp.rightMargin = -10; lp.bottomMargin = -10; mContent.addView(webViewContainer, lp); mContent.addView(top); } private void handleRedirectUrl(WebView view, String url) { Bundle values = Utility.parseUrl(url); String error = values.getString("error"); String error_code = values.getString("error_code"); if (error == null && error_code == null) { mListener.onComplete(values); } else if (error.equals("access_denied")) { // 用户或授权服务器拒绝授予数据访问权限 mListener.onCancel(); } else { mListener.onWeiboException(new WeiboException(error, Integer .parseInt(error_code))); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (mWebView != null) { try{ mWebView.stopLoading(); }catch (Exception e) { } } try{ if (mSpinner != null && mSpinner.isShowing()) { mSpinner.dismiss(); } }catch (Exception e) { } finish(); } return super.onKeyDown(keyCode, event); } 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"); startActivity(sendIntent); return true; } return super.shouldOverrideUrlLoading(view, url); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); mListener.onError(new WeiboDialogError(description, errorCode, failingUrl)); finish(); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.d(TAG, "onPageStarted URL: " + url); if (url.startsWith(Weibo.redirecturl)) { handleRedirectUrl(view, url); view.stopLoading(); finish(); return; } super.onPageStarted(view, url, favicon); try{ mSpinner.show(); }catch(Exception e){ } } @Override public void onPageFinished(WebView view, String url) { Log.d(TAG, "onPageFinished URL: " + url); super.onPageFinished(view, url); try{ if (mSpinner.isShowing()) { mSpinner.dismiss(); } }catch(Exception e){ } mWebView.setVisibility(View.VISIBLE); } public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); } } }