在Android Webview中使用JS获取PHP值

hwazgwia  于 2023-03-07  发布在  PHP
关注(0)|答案(1)|浏览(124)

在问这个问题之前,我研究了很多,甚至尝试了ChatGPT。
我正在使用Volley将HTTP请求从android webview发送到在webview中运行的PHP应用程序,以插入正在生成的FCM令牌。这工作得很好,但它适用于每个页面加载,因为volley代码是在MainFragment.java文件中的onPgeFinished()方法中编写的。因此,一旦令牌成功插入,我想先检查一下webview中生成的令牌是否不同于在发出Volley请求之前插入数据库中的令牌,因为这会使页面加载变慢,并且不必要地在每次新加载/刷新页面时创建HTTP请求。为此,我需要从数据库中获取特定于用户的令牌值,并将其发送到webview的MainFragment.java文件。经过大量研究和chatGPT使用,我尝试了以下方法:
JS在我的网站:

<script>
  MyApp.userToken("<?php echo $token; ?>");
</script>

然后在网络视图中:
JavaScriptAPI.java

public class JavaScriptAPI {
    private Activity mActivity;
    private volatile String activeToken;

    public JavaScriptAPI(Activity activity) {
        mActivity = activity;
    }
    
    @JavascriptInterface
    public void userToken(String token){
        activeToken = token; // RECEIVES TOKEN SUCCESSFULLY AND OUTPUTS IN THE LOG BELOW
        Logcat.d("Received Token: " + activeToken);
    }

    public String getActiveToken() {
        return activeToken; // DOESN'T SET THE TOKEN RECEIVED IN THE ABOVE METHOD AND ALWAYS RETURNS NULL ( WHY ? )
    }
}

然后在www.example.com中MainFragment.java我尝试调用getActiveToken()来获取值,以便使用它。
MainFragment.java

JavaScriptAPI javaScriptAPI = new JavaScriptAPI(getActivity());
String phpVariableValue = javaScriptAPI.getActiveToken();
Logcat.d("PHP token value: " + phpVariableValue); // ALWAYS RETURNS NULL

我需要获取phpVariableValue中的令牌值,以便在if语句中使用它,并在创建volley请求之前将其与webview生成的令牌值匹配。解决方案是什么?

svmlkihl

svmlkihl1#

没关系。我有一个替代的解决方案。我不知道为什么它总是发生,当我挣扎了几天寻找一个解决方案,我从来没有得到它。但只要我张贴一个问题stackoverflow,我找到解决方案自己😑😑😑。
无论如何,解决方法是,我在文本字段中获取令牌值(如果需要,可以使用div或span或任何带有data属性的命令。随你的便!)
在网站中:

<input type="text" id="token" value="<?php echo $token; ?>">

在Web视图中:

private class MyWebViewClient extends WebViewClient {
  private String kvToken;

  @Override
  public void onPageFinished(final WebView view, final String url) {
   
    // GET TOKEN VALUE FROM WEBSITE
    mWebView.evaluateJavascript(
    "(function() { return document.getElementById('kvToken').value; })();",
    new ValueCallback<String>() {
      @Override
      public void onReceiveValue(String value) {
        kvToken = value.replaceAll("^\"|\"$", "");
      }
    });

    Logcat.d("KV: " + kvToken);

    // USE kvToken HERE AS YOU WANT
  }
}

就是这样,我奋斗了整整一个星期,就是为了这样一个解决办法,祝你好运。
哦,是的,谢谢你ChatGPT😋。

相关问题