【问题标题】:How can I obtain a json request using a webview on android studio?如何使用 android studio 上的 webview 获取 json 请求?
【发布时间】:2017-11-20 03:35:53
【问题描述】:

我在尝试从 Webview 上的提交中获取 JsonRequest 时遇到了一点问题。我看过一些代码,但它们都不起作用,所以到目前为止我是从零开始的。我知道这个问题是重复的,但我还是不明白。

我的 html.php

<?php
require_once('../Con/Conexion.php');
$username = $_POST['userName'];
$passw = $_POST['userPwd'];
       $statement=mysqli_prepare($connection,"SELECT idTrabajador,`Nombre del Trabajador`,`Unidades por Vender`  FROM `tablausuario` WHERE `Usuario`=? AND Contrasena=?");
mysqli_stmt_bind_param($statement,"ss",$username,$passw);
mysqli_stmt_execute($statement);
mysqli_stmt_store_result($statement);
mysqli_stmt_bind_result($statement,$idTrabajador,$name,$uxv);
$response = array();
$response["success"] = false;
while(mysqli_stmt_fetch($statement)){
$response["success"] = true;
$response["idTrabajador"] = $idTrabajador;
$response["Nombre del Trabajador"] = $name;
$response["Unidades por Vender"] = $uxv;
}
echo json_encode($response);
mysqli_close($connection);
?>

我知道要调用和 URL Web 查看它

    WebView web = (WebView) findViewById(R.id.miVisor3);
    web.setWebViewClient(new ConsultaFacturas.MyWebViewClient());
    WebSettings settings = web.getSettings();
    settings.setJavaScriptEnabled(true);
    web.loadUrl(URL_LISTA_CLIENTE);

但是,我怎样才能得到这个,使用 webview 登录系统的 Json 响应

try {
                        JSONObject jsonResponse = new JSONObject(response);
                        boolean success = jsonResponse.getBoolean("success");
                        if (success) {
                            String idTra = jsonResponse.getString("idTrabajador");
                            String naMe = jsonResponse.getString("Nombre del Trabajador");
                            String uxv = jsonResponse.getString("Unidades por Vender");
                            Intent openLog = new Intent(LoginActivity.this, MenuPrincipal.class);
                            openLog.putExtra("idTrabajador", idTra);
                            openLog.putExtra("Nombre del Trabajador", naMe);
                            openLog.putExtra("Unidades por Vender", uxv);
                            LoginActivity.this.startActivity(openLog);
                        } else {
                            AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
                            builder.setMessage("Error de Login, Verifique su conexion o los datos ingresados")
                                    .setNegativeButton("Reintentar", null).create().show();

                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

*更新 *

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    WebView web = (WebView) findViewById(R.id.miVisor30);
    web.setWebViewClient(new LoginActivity.MyWebViewClient());
    WebSettings settings = web.getSettings();
    settings.setJavaScriptEnabled(true);
    web.addJavascriptInterface(new WebViewResultListener(), "ANDROID");**SHOWS ERROR**
    ADNROID.onResult(request.status, request.responseText);**SHOWS ERROR**
    web.loadUrl(URL_LISTA_CLIENTE);


}

private class MyWebViewClient extends WebViewClient {
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}

public class WebViewResultListener {
    @JavascriptInterface
    public void onResult(int code, String response) {
        if (code == HttpURLConnection.HTTP_OK) {
            try {
                JSONObject jsonResponse = new JSONObject(response);
                boolean success = jsonResponse.getBoolean("success");
                if (success) {
                    String idTra = jsonResponse.getString("idTrabajador");
                    String naMe = jsonResponse.getString("Nombre del Trabajador");
                    String uxv = jsonResponse.getString("Unidades por Vender");
                    Intent openLog = new Intent(LoginActivity.this, MenuPrincipal.class);
                    openLog.putExtra("idTrabajador", idTra);
                    openLog.putExtra("Nombre del Trabajador", naMe);
                    openLog.putExtra("Unidades por Vender", uxv);
                    LoginActivity.this.startActivity(openLog);
                } else {
                    AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
                    builder.setMessage("Error de Login, Verifique su conexion o los datos ingresados")
                            .setNegativeButton("Reintentar", null).create().show();

                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            Log.e("WebViewResultListener", "Error code=" + code);
        }
    }

}

@Override
public void onBackPressed() {
    super.onBackPressed();
    finish();
}
}

【问题讨论】:

    标签: php android mysql json


    【解决方案1】:

    您无法直接从 WebView 读取 JSON 响应,但您可以使用 JavascriptInterface 将其从 WebView 内部的 JavaScript 传递给 Java。

    首先,创建JavascriptInterface类:

    public static class WebViewResultListener {
    
        @JavascriptInterface
        public void onResult(int code, String response) {
            if (code == HttpURLConnection.HTTP_OK) {
                JSONObject jsonResponse = new JSONObject(response);
                // and so on
            } else {
                Log.e("WebViewResultListener", "Error code=" + code);
            }
        }
    }
    

    并将其添加到 WebView:

    web.addJavascriptInterface(new WebViewResultListener(), "ANDROID");
    

    WebView (JavaScript) 中,您向用户询问用户名和密码。

    WebView (JavaScript) 中,您将这些用户名和密码发送到您的服务器 (PHP) 并监听结果。 当您收到结果时,您会将其从 JavaScript 传递给 Java:

    ADNROID.onResult(request.status, request.responseText);
    

    其中 ANDROIDJavascriptInterface 的名称,由 addJavascriptInterface() 方法添加。

    【讨论】:

    • 你好@fishbone,我正在检查你给我的答案,但我不明白“并将其添加到 WebView:”中的部分,因为我是新来的米很迷茫。 “询问”过程如何准确地进行? ,我正在下面更新我的代码
    • Line ADNROID.onResult(request.status, request.responseText);必须在WebView.显示的网页上使用JavaScript执行它允许您将查询结果从JavaScript传输到Java。我提醒您,与服务器的所有操作(输入和发送用户名和密码)都应在 JavaScript 中执行。方法WevView.loadUrl() 只能用于加载带有登录表单和JavaScript 代码的网页,它将向服务器发送请求,获取结果并将结果传输到Java。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多