package com.keju.maomao.activity; import java.io.ByteArrayOutputStream; import java.io.IOException; import org.json.JSONException; import org.json.JSONObject; import android.Manifest; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.net.Uri; import android.net.http.SslError; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.Window; import android.webkit.CookieSyncManager; import android.webkit.SslErrorHandler; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; import com.keju.maomao.CommonApplication; import com.keju.maomao.Constants; import com.keju.maomao.R; import com.keju.maomao.activity.base.BaseActivity; import com.keju.maomao.util.SharedPrefUtil; import com.umeng.analytics.MobclickAgent; 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.WeiboParameters; import com.weibo.sdk.android.net.AsyncWeiboRunner; import com.weibo.sdk.android.net.RequestListener; import com.weibo.sdk.android.sso.SsoHandler; import com.weibo.sdk.android.util.Utility; /** * 授权界面 * * @author Zhoujun * */ public class AuthorizeActivity extends BaseActivity { private final static String TAG = "AuthorizeActivity"; // -------------------------sina_weibo // start-------------------------------------// private Oauth2AccessToken accessToken = null; private String mRedirectUrl; private static String WEIBO_APP_KEY; private static String WEIBO_APP_SECRET; 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://api.weibo.com/oauth2/authorize"; private static final String get_token_url = "https://api.weibo.com/oauth2/access_token";// 获取token private static Oauth2AccessToken oauth2AccessToken; private static final int WEIBO_BIND_SUCCESS = 1;//微博授权 private WeiboAuthListener mListener; /** * SsoHandler 仅当sdk支持sso时有效, */ SsoHandler mSsoHandler; // -------------------------sina_weibo // end-------------------------------------// WebView mWebView; private String mUrl;// dialogUrl private View progress; private ProgressDialog mSpinner; String fromType; private static final int DEFAULT_AUTH_ACTIVITY_CODE = 32973; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.authorize); findView(); fillData(); // 添加到容器中 ((CommonApplication) getApplicationContext()).addActivity(this); } private void fillData() { fromType = getIntent().getExtras().getString(Constants.EXTRA_BIND_FROM); if (Constants.BIND_WEIBO.equals(fromType)) { authorizeWeibo(this, new AuthDialogListener()); } } private void findView() { mWebView = (WebView) findViewById(R.id.weibo_webview); mWebView.setVerticalScrollBarEnabled(false); mWebView.setHorizontalScrollBarEnabled(false); mWebView.getSettings().setJavaScriptEnabled(true); progress = this.findViewById(R.id.progress); progress.setVisibility(View.GONE); mSpinner = new ProgressDialog(this); mSpinner.requestWindowFeature(Window.FEATURE_NO_TITLE); mSpinner.setMessage("加载中..."); } Handler hander = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case WEIBO_BIND_SUCCESS: showShortToast(R.string.account_bind_success); break; } } }; // --------------------------------------sina_weibo_start----------------------------// public void authorizeWeibo(Context context, final WeiboAuthListener listener){ mRedirectUrl = Constants.WEIBO_REDIRECT_URL; WEIBO_APP_KEY = Constants.WEIBO_CONSUMER_KEY; WEIBO_APP_SECRET = Constants.WEIBO_CONSUMER_SECRET; // startAuthDialog(context, listener); String scope = "email,direct_messages_read,direct_messages_write," + "friendships_groups_read,friendships_groups_write,statuses_to_me_read," + "follow_app_official_microblog," + "invitation_write"; Weibo mWeibo = Weibo.getInstance(WEIBO_APP_KEY, mRedirectUrl,scope); /** * 下面两个注释掉的代码,仅当sdk支持sso时有效, */ try { Class sso = Class.forName("com.weibo.sdk.android.sso.SsoHandler"); mSsoHandler = new SsoHandler(this, mWeibo); mSsoHandler.authorize(new AuthDialogListener()); } catch (ClassNotFoundException e) { startAuthDialog(context, listener); } } public void startAuthDialog(Context context, final WeiboAuthListener listener) { WeiboParameters params = new WeiboParameters(); // CookieSyncManager.createInstance(context); startDialog(context, params, new WeiboAuthListener() { @Override public void onComplete(Bundle values) { // ensure any cookies set by the dialog are saved CookieSyncManager.getInstance().sync(); if (null == accessToken) { accessToken = new Oauth2AccessToken(); } accessToken.setToken(values.getString(KEY_TOKEN)); accessToken.setExpiresIn(values.getString(KEY_EXPIRES)); accessToken.setRefreshToken(values.getString(KEY_REFRESHTOKEN)); if (accessToken.isSessionValid()) { Log.d("Weibo-authorize", "Login Success! access_token=" + accessToken.getToken() + " expires=" + accessToken.getExpiresTime() + " refresh_token=" + accessToken.getRefreshToken()); listener.onComplete(values); } else { Log.d("Weibo-authorize", "Failed to receive access token"); listener.onWeiboException(new WeiboException("Failed to receive access token.")); } } @Override public void onError(WeiboDialogError error) { Log.d("Weibo-authorize", "Login failed: " + error); listener.onError(error); } @Override public void onWeiboException(WeiboException error) { Log.d("Weibo-authorize", "Login failed: " + error); listener.onWeiboException(error); } @Override public void onCancel() { Log.d("Weibo-authorize", "Login canceled"); listener.onCancel(); } }); } public void startDialog(Context context, WeiboParameters parameters, final WeiboAuthListener listener) { parameters.add("client_id", WEIBO_APP_KEY); parameters.add("response_type", "token"); parameters.add("redirect_uri", mRedirectUrl); parameters.add("display", "mobile"); if (accessToken != null && accessToken.isSessionValid()) { parameters.add(KEY_TOKEN, accessToken.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 { mUrl = url; mListener = listener; mWebView.setWebViewClient(new WeiboWebViewClient()); mWebView.loadUrl(mUrl); } } /** * 微博验证 * * @author Aizhimin * */ class AuthDialogListener implements WeiboAuthListener { @Override public void onComplete(Bundle values) { if(values.containsKey("code")){ String code = values.getString("code"); WeiboParameters bundle = new WeiboParameters(); bundle.add("client_id", Constants.WEIBO_CONSUMER_KEY); bundle.add("client_secret", Constants.WEIBO_CONSUMER_SECRET); bundle.add("code", code); bundle.add("redirect_uri", Constants.WEIBO_REDIRECT_URL); AsyncWeiboRunner.request(get_token_url, bundle, "POST", getTokenListener); }else{ String sina_uid = values.getString("uid"); String token = values.getString("access_token"); String expires_in = values.getString("expires_in"); String currTime = System.currentTimeMillis() + ""; SharedPrefUtil.setWeiboInfo(AuthorizeActivity.this, sina_uid, token, expires_in, currTime); long time= Long.parseLong(expires_in)*1000+ System.currentTimeMillis(); hander.sendEmptyMessage(WEIBO_BIND_SUCCESS); setResult(RESULT_OK); AuthorizeActivity.this.finish(); } } @Override public void onError(WeiboDialogError e) { Log.e(TAG, "Auth error : " + e.getMessage()); Toast.makeText(AuthorizeActivity.this, R.string.weibo_bind_faild, Toast.LENGTH_SHORT).show(); } @Override public void onCancel() { AuthorizeActivity.this.finish(); } @Override public void onWeiboException(WeiboException e) { Log.e(TAG, "Auth exception : " + e.getMessage()); } } /** * 获取token */ RequestListener getTokenListener = new RequestListener() { @Override public void onIOException(IOException arg0) { } @Override public void onError(WeiboException arg0) { } @Override public void onComplete(String arg0) { try { JSONObject obj = new JSONObject(arg0); String sina_uid = obj.getString("uid"); String token = obj.getString("access_token"); String expires_in = obj.getString("expires_in"); String currTime = System.currentTimeMillis() + ""; SharedPrefUtil.setWeiboInfo(AuthorizeActivity.this, sina_uid, token, expires_in, currTime); long time= Long.parseLong(expires_in)*1000+ System.currentTimeMillis(); hander.sendEmptyMessage(WEIBO_BIND_SUCCESS); setResult(RESULT_OK); AuthorizeActivity.this.finish(); } catch (JSONException e) { } } @Override public void onComplete4binary(ByteArrayOutputStream arg0) { // TODO Auto-generated method stub } }; private class WeiboWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.d(TAG, "Redirect URL: " + url); // 待后台增加对默认重定向地址的支持后修改下面的逻辑 if (url.startsWith(mRedirectUrl)) { handleRedirectUrl(view, url); return true; } // launch non-dialog URLs in a full browser startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); return true; } @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)); // WeiboDialog.this.dismiss(); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.d(TAG, "onPageStarted URL: " + url); // google issue. shouldOverrideUrlLoading not executed if (url.startsWith(mRedirectUrl)) { handleRedirectUrl(view, url); view.stopLoading(); return; } super.onPageStarted(view, url, favicon); mSpinner.show(); } @Override public void onPageFinished(WebView view, String url) { Log.d(TAG, "onPageFinished URL: " + url); super.onPageFinished(view, url); // progress.setVisibility(View.GONE); if (mSpinner != null && mSpinner.isShowing()) { mSpinner.dismiss(); } // mBtnClose.setVisibility(View.VISIBLE); mWebView.setVisibility(View.VISIBLE); } public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); } } 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))); } } // --------------------------------------sina_weibo_end----------------------------// @Override protected void onResume() { super.onResume(); MobclickAgent.onResume(this); } @Override protected void onPause() { super.onPause(); MobclickAgent.onPause(this); } @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); } } }