1. 先分析html 表单
12345678910
<form method="POST" id="login-form" class="adjacent" action="/accounts/login/?force_classic_login=&next=/oauth/authorize/%3Fclient_id%3Dcf2cd88a0b7745a4b4f8ac673190f659%26redirect_uri%3Dhttp%253A%252F%252Finstafollow.elasticbeanstalk.com%252Fredirect.php%253FclientKey%253Dcf2cd88%26response_type%3Dcode"><input type="hidden" name="csrfmiddlewaretoken" value="fd942039c72570e71786a8a5a13566b5"/><p><label for="id_username">��ㄦ�峰��:</label> <input name="username" maxlength="30" autocapitalize="off" autocorrect="off" type="text" id="id_username" /></p><p><label for="id_password">瀵����:</label> <input autocapitalize="off" autocorrect="off" type="password" name="password" id="id_password" /></p><p class="form-actions"><a href="/accounts/password/reset/">蹇�璁板�����锛�</a><input type="submit" class="button-green" value="��诲��" /></p></form>
写js代码
123456
String javascript = "javascript: document.getElementsByClassName(\"button-green\")[0].onclick = function() {\n" +" var username = document.getElementById(\"id_username\").value;\n" +" var password = document.getElementById(\"id_password\").value;\n" +" bridge.saveData(username, password);\n" +" };";
2. js调用的java代码
123456789101112131415161718192021222324
public class MyBridge {private static String mUsername;private static String mPassword;Context mContext;public MyBridge(Context context) {mContext = context;}@JavascriptInterfacepublic void saveData(String username, String password) {Toast.makeText(mContext, username + " " + password, Toast.LENGTH_SHORT).show();mUsername = username;mPassword = password;}public static String getUsername() {return mUsername;}public static String getPassword() {return mPassword;}}
3. 完整的webview布局及实现
布局
123456
<?xml version="1.0" encoding="utf-8"?><WebView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/webview"android:layout_width="fill_parent"android:layout_height="fill_parent"/>
实现
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
public class OAuthActivity extends Activity {private static final String OAUTH_URI = "https://instagram.com/oauth/authorize/";public static final String INTENT_KEY_USERNAME = "username";public static final String INTENT_KEY_PASSWORD = "password";public static final String INTENT_KEY_REGISTER_DATA = "registerData";private RegisterData mRegisterData;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_oauth);init();}@SuppressLint("SetJavaScriptEnabled")private void init() {mRegisterData = (RegisterData) getIntent().getSerializableExtra(INTENT_KEY_REGISTER_DATA);WebView myWebView = (WebView) findViewById(R.id.webview);WebSettings webSettings = myWebView.getSettings();webSettings.setJavaScriptEnabled(true);myWebView.addJavascriptInterface(new MyBridge(OAuthActivity.this), "bridge");myWebView.setWebViewClient(new MyWebViewClient());myWebView.loadUrl(getOAuthUrl());}private String getOAuthUrl() {// https://instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=tokenStringBuilder builder = new StringBuilder();builder.append(OAUTH_URI);builder.append("?client_id=" + mRegisterData.getClientId());builder.append("&redirect_uri=" + Uri.encode(mRegisterData.getRedirectUri()));builder.append("&response_type=" + mRegisterData.getReponseCode());String url = builder.toString();System.out.println("====== getOAuthUrl ====" + url);return url;}private class MyWebViewClient extends WebViewClient {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {System.out.println("====== shouldOverrideUrlLoading url ====" + url);if (Uri.parse(url).getHost().equals(Uri.parse(mRegisterData.getRedirectUri()).getHost())) {String error = Uri.parse(url).getQueryParameter("error");handleReturnCode(error);CookieSyncManager.createInstance(OAuthActivity.this);CookieManager cookieManager = CookieManager.getInstance();cookieManager.removeAllCookie();return true;} else {return false;}}@Overridepublic void onPageFinished(WebView view, String url) {//System.out.println("====== onPageFinished url====" + url);if (url.contains("login")) {view.addJavascriptInterface(new MyBridge(OAuthActivity.this), "bridge");String javascript = "javascript: document.getElementsByClassName(\"button-green\")[0].onclick = function() {\n" +" var username = document.getElementById(\"id_username\").value;\n" +" var password = document.getElementById(\"id_password\").value;\n" +" bridge.saveData(username, password);\n" +" };";view.loadUrl(javascript);}super.onPageFinished(view, url);}}private void handleReturnCode(String error) {System.out.println("====== handleReturnCode error ====" + error);Intent intent = new Intent();if (error == null) {intent.putExtra(INTENT_KEY_USERNAME, MyBridge.getUsername());intent.putExtra(INTENT_KEY_PASSWORD, MyBridge.getPassword());setResult(RESULT_OK, intent);} else {setResult(RESULT_CANCELED, intent);}finish();}}
4. 调用OAuth 的Activtiy
12345678910111213141516171819202122232425262728293031323334
public class MainActivity extends ActionBarActivity {private static final String CLIENT_ID = "cf2cd88a0b7745a4b4f8ac673190f659";private static final String REDIRECT_URI = "http://instafollow.elasticbeanstalk.com/redirect.php?clientKey=cf2cd88";private static final String RESPONSE_TYPE = "code";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void onClickLogin(View v) {Intent intent = new Intent(this, OAuthActivity.class);RegisterData registerData = new RegisterData();registerData.setClientId(CLIENT_ID);registerData.setRedirectUri(REDIRECT_URI);registerData.setReponseCode(RESPONSE_TYPE);intent.putExtra(OAuthActivity.INTENT_KEY_REGISTER_DATA,registerData);startActivityForResult(intent, 200);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode != 200) return;if (resultCode == RESULT_OK) {Toast.makeText(this, "success " + data.getStringExtra(OAuthActivity.INTENT_KEY_USERNAME)+ data.getStringExtra(OAuthActivity.INTENT_KEY_PASSWORD), Toast.LENGTH_SHORT).show();} else {Toast.makeText(this, "fail ", Toast.LENGTH_SHORT).show();}}}