You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用向PHP传数据并在HTML展示的问题排查

Android向PHP传递数据并在HTML展示的问题修复

问题核心

现有实现功能失效的原因主要有三点:

  1. 请求方式不匹配:Android端发送POST请求,但PHP端用$_GET接收数据,导致无法获取到参数
  2. 旧API废弃:HttpClient、HttpPost等类已被Android官方废弃,存在兼容性问题
  3. 跳转逻辑错误:发送POST后直接跳转至PHP页面,跳转的是GET请求,不会携带之前POST的参数,页面自然无法读取到输入内容

修复方案

方案一:GET方式直接传递参数并跳转

此方案最简单,直接将输入数据拼接到URL参数中,跳转浏览器打开带参数的URL,PHP通过$_GET读取参数。

Android端代码

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

    savebtn = findViewById(R.id.savebtn);
    editTextFName = findViewById(R.id.editTextFName);
    editTextLName = findViewById(R.id.editTextLName);
    editTextAddress = findViewById(R.id.editTextAddress);

    savebtn.setOnClickListener(view -> {
        String val_Fname = editTextFName.getText().toString();
        String val_Lname = editTextLName.getText().toString();
        String val_Addr = editTextAddress.getText().toString();

        // 对参数进行URL编码,避免特殊字符导致的参数丢失
        try {
            val_Fname = URLEncoder.encode(val_Fname, "UTF-8");
            val_Lname = URLEncoder.encode(val_Lname, "UTF-8");
            val_Addr = URLEncoder.encode(val_Addr, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        // 拼接带参数的目标URL
        String url = String.format("http://xxx.xxx.xxx.xxx/webdisplay/index.php?android_Fname=%s&android_Lname=%s&android_Addr=%s",
                val_Fname, val_Lname, val_Addr);

        // 跳转至系统浏览器打开URL
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
    });
}

PHP端代码

<?php
// 先判断参数是否存在,避免报错
$dataFname = isset($_GET['android_Fname']) ? $_GET['android_Fname'] : '';
$dataLname = isset($_GET['android_Lname']) ? $_GET['android_Lname'] : '';
$dataAddr = isset($_GET['android_Addr']) ? $_GET['android_Addr'] : '';
?>

<html>
<body>
<div>
    名字:<?php echo htmlspecialchars($dataFname); ?><br>
    姓氏:<?php echo htmlspecialchars($dataLname); ?><br>
    地址:<?php echo htmlspecialchars($dataAddr); ?>
</div>
</body>
</html>

方案二:POST提交+Session存储

如果需要用POST方式传递数据,可先将数据提交到PHP存储到Session中,再跳转至展示页面读取Session内容。

Android端代码(使用OkHttp)

首先在build.gradle(Module)中添加OkHttp依赖:

implementation 'com.squareup.okhttp3:okhttp:4.12.0'

然后修改Activity代码:

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

    savebtn = findViewById(R.id.savebtn);
    editTextFName = findViewById(R.id.editTextFName);
    editTextLName = findViewById(R.id.editTextLName);
    editTextAddress = findViewById(R.id.editTextAddress);

    savebtn.setOnClickListener(view -> {
        String val_Fname = editTextFName.getText().toString();
        String val_Lname = editTextLName.getText().toString();
        String val_Addr = editTextAddress.getText().toString();

        // 构建POST表单参数
        FormBody formBody = new FormBody.Builder()
                .add("android_Fname", val_Fname)
                .add("android_Lname", val_Lname)
                .add("android_Addr", val_Addr)
                .build();

        // 构建POST请求
        Request request = new Request.Builder()
                .url("http://xxx.xxx.xxx.xxx/webdisplay/save_data.php")
                .post(formBody)
                .build();

        // 异步发送请求,避免阻塞主线程
        OkHttpClient client = new OkHttpClient();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                // 主线程提示失败
                runOnUiThread(() -> Toast.makeText(MainActivity.this, "数据提交失败", Toast.LENGTH_SHORT).show());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    // 提交成功后跳转至展示页面
                    runOnUiThread(() -> {
                        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://xxx.xxx.xxx.xxx/webdisplay/index.php"));
                        startActivity(intent);
                    });
                } else {
                    runOnUiThread(() -> Toast.makeText(MainActivity.this, "数据提交失败", Toast.LENGTH_SHORT).show());
                }
            }
        });
    });
}

PHP端代码

创建save_data.php用于接收POST数据并存入Session:

<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $_SESSION['fname'] = isset($_POST['android_Fname']) ? $_POST['android_Fname'] : '';
    $_SESSION['lname'] = isset($_POST['android_Lname']) ? $_POST['android_Lname'] : '';
    $_SESSION['addr'] = isset($_POST['android_Addr']) ? $_POST['android_Addr'] : '';
    echo "success";
}
?>

修改index.php读取Session内容:

<?php
session_start();
$dataFname = isset($_SESSION['fname']) ? $_SESSION['fname'] : '';
$dataLname = isset($_SESSION['lname']) ? $_SESSION['lname'] : '';
$dataAddr = isset($_SESSION['addr']) ? $_SESSION['addr'] : '';

// 可选:读取后清除Session,避免下次打开页面仍显示旧数据
// unset($_SESSION['fname'], $_SESSION['lname'], $_SESSION['addr']);
?>

<html>
<body>
<div>
    名字:<?php echo htmlspecialchars($dataFname); ?><br>
    姓氏:<?php echo htmlspecialchars($dataLname); ?><br>
    地址:<?php echo htmlspecialchars($dataAddr); ?>
</div>
</body>
</html>

注意事项

  • 确保Android设备与PHP服务器处于同一局域网,服务器IP地址填写正确,且PHP服务正常运行
  • Android 9及以上默认禁止明文HTTP请求,需在AndroidManifest.xml的application标签添加android:usesCleartextTraffic="true",或者配置HTTPS证书
  • 网络请求必须在子线程执行,方案二使用OkHttp异步请求符合要求,方案一的跳转是Intent动作,无需额外处理线程
  • 使用htmlspecialchars()转义输出内容,防止XSS注入攻击

内容的提问来源于stack exchange,提问作者JBA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:41:00