如何将响应发送回原生Android应用程序

时间:2014-08-25 16:25:26

标签: java android

我有原始Android应用程序示例。用户为用户想要访问的应用程序创建配置文件。根据应用程序设置,用户将被重定向到浏览器中的特定URL进行身份验证或在本机应用程序中显示登录屏幕。如果用户被重定向到浏览器中的URL(我正在使用webview),我想将响应发送回本机应用程序有关身份验证的状态。我怎么做?如何将侦听器添加到启动BrowserActivity的intent?

6 个答案:

答案 0 :(得分:4)

在服务器对WebView可以检测和分支的身份验证尝试的响应中寻找一致的内容。

例如,Google OAuth会将结果放入HTML响应的<title>元素中,因此您解析该结果并在WebChromeClient onReceivedTitle处理程序中返回对调用活动的响应:

public class MyChrome extends WebChromeClient {
    public void onReceivedTitle(WebView view, String title) {
        final Intent i = new Intent();
        if (title.startsWith("Denied")) {
            i.putExtra("auth2code", "");
            setResult(RESULT_OK, i);
            finish();
        } else if (title.contains("code=")) {
            final String[] stuff = title.split("=");
            if (stuff.length > 1) {
                auth2code = stuff[1];
                i.putExtra("auth2code", auth2code);
            } else {
                i.putExtra("auth2code", "");
            }
            setResult(RESULT_OK, i);
            finish();
        }
    }
}

(在onCreate中你需要说webView.setWebChromeClient(new MyChrome());

此示例显示了基本方法,但必须根据任何给定服务实际响应身份验证尝试的方式进行修改。

答案 1 :(得分:2)

为此,首先在活动中构建WebView客户端,如上所述。

接下来,使用startActivityForResult启动活动,以便从WebView客户端获取所需的数据。

接下来,在webview Activity中,设置一个Javascript桥:

https://labs.mwrinfosecurity.com/blog/2014/06/12/putting-javascript-bridges-into-android-context/

然后,您可以使用Javascript将结果网页中的数据传递给您的活动。根据传入的数据,您可以使用一种方法,从网页,表单等返回您想要的任何值。

身份验证状态是您可以传递的一件事,但使用Javascript桥接器,您可以执行更多操作。

答案 2 :(得分:2)

我使用JSON将本机Android应用与服务器进行通信。

/**
 * Represents an asynchronous login/registration task used to authenticate
 * the user.
 */
 public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {

    @Override
    protected Boolean doInBackground(Void... params) {

        //Comunicate HttpClient object to communicate with the server
        HttpClient comunicacion = new DefaultHttpClient();

        //Create a new POST request with the URL of the server service
        HttpPost peticion = new HttpPost(URL);

        try 
        {
            String idEnviado = String.valueOf(System.currentTimeMillis());
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("action", "login"));
            nameValuePairs.add(new BasicNameValuePair("id", idEnviado));
            nameValuePairs.add(new BasicNameValuePair("email", mEmail));
            nameValuePairs.add(new BasicNameValuePair("password", mPassword));

            peticion.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            peticion.setHeader("Accept", "application/json");

            //Execute request and obtain response as a string
            HttpResponse respuesta = comunicacion.execute(peticion);
            String respuestaString = EntityUtils.toString(respuesta.getEntity());

            //JSONObject to read the attributes of the response
            JSONObject respuestaJSON = new JSONObject(respuestaString);

            //The server answers authentication is valid
            if (respuestaJSON.get("result").equals("true"))
            {   
                idUsuario = respuestaJSON.getString("userId");
                insertarUsuarioEnBD(idUsuario);
                return true;
            }
            else
            {
                return false;
            }
        } catch(Exception e) {
            Log.e("Error", "Error in server response.", e);
        }
        return false;
    }

当你从eclipse创建一个至少4.0.0或更高版本的新应用时,它可以让你选择一个新的LoginActivity,几乎完全实现了,并向你显示正确的在Android应用程序中进行身份验证的方法。

我希望这有帮助!

答案 3 :(得分:1)

WebViewClient.shouldOverrideUrlLoading即将加载网址时,会调用

WebView。您可以覆盖此方法,并在用户在身份验证后重定向到指定的URL时采取相应措施。

可在此处找到一个简单示例:https://github.com/nguyenhuy/buffer/blob/master/buffer/src/main/java/org/nguyenhuy/buffer/fragment/OAuthFragment.java

答案 4 :(得分:1)

如果授权页面是您自己的网络资源,您也可以使用WebView回调,通过网页JavaScript到Android,如下所述: http://blog.objectgraph.com/index.php/2012/03/16/android-development-javascript-bridge-example-fully-explained/

并将数据从网页传回原生Android应用程序。

答案 5 :(得分:0)

如果您使用nodejs作为服务,则可以使用res.send( {data: successfulLogin} ); 或类似的东西。然后解析它,使用你想要的地方。