Android 设备无法连接到本地主机中的 mysql
Android device can't connect to mysql in localhost
我正在 android 工作室开发一个 android 应用程序,我的本地主机上有一个 mysql 数据库。
我正在使用 XAMPP 所以我正在使用 MariaDB 和 Apache。
当我 运行 模拟器时一切正常,但当我在我的物理设备上使用该应用程序时却无法正常工作。
我已打开端口 80 和 3306 并在应用程序清单中授予权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Java in android activity(我正在为 http 请求使用 volley):
public static void Register(String email,String password,Context context){
StringRequest request = new StringRequest(Request.Method.POST, "http://xx.xx.x.x/android/register.php",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
User.setEmail(email);
User.setPassword(password);
Toast.makeText(context, "Registrado con éxito", Toast.LENGTH_SHORT).show();
context.startActivity(new Intent(context, MainActivity.class));
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context, "Ha ocurrido un error",Toast.LENGTH_SHORT).show();
}
}
){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> params = new HashMap<>();
params.put("email",email);
params.put("password",password);
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
String date = sdf.format(new Date());
params.put("date",date);
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(context);
requestQueue.add(request);
}
xx.xx.x.x 是我的 public ip.
register.php:
<?php
if ($_SERVER ['REQUEST_METHOD'] == 'POST'){
require_once("db.php");
$email = $_POST['email'];
$password = $_POST['password'];
$date = $_POST['date'];
$query = "INSERT INTO user (email, password, date) VALUES
('$email','$password','$date')";
$result = $mysql->query($query);
if ($result == TRUE){
echo "user created";
}
else{
echo "user not created";
}
$mysql->close();
}
db.php:
我数据库中的用户 rafa 拥有所有权限,可以通过任何地址连接。 (我曾尝试将“localhost”更改为我的 public ip,但它也不起作用)
<?php
$mysql = new mysqli(
"localhost",
"rafa",
"1234",
"eduk"
);
if ( $mysql->connect_error){
die( "failed to connect" . $mysql->connect_error);
}
我得到的错误是:Ljava.lang.StackTraceElement;
我读到了这个问题,人们说我需要一个主机,一切都会正常,但我为什么需要它?
模拟器应该像另一台设备一样运行,但没有实体,这是唯一的区别。
我可以使用 pyshical 设备访问我的 apache 服务器,问题一定出在与数据库的连接或其他东西上。
也许我需要使用其他库?
我已经解决了在清单中添加这个问题...
android:usesCleartextTraffic="true"
我正在 android 工作室开发一个 android 应用程序,我的本地主机上有一个 mysql 数据库。 我正在使用 XAMPP 所以我正在使用 MariaDB 和 Apache。
当我 运行 模拟器时一切正常,但当我在我的物理设备上使用该应用程序时却无法正常工作。
我已打开端口 80 和 3306 并在应用程序清单中授予权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Java in android activity(我正在为 http 请求使用 volley):
public static void Register(String email,String password,Context context){
StringRequest request = new StringRequest(Request.Method.POST, "http://xx.xx.x.x/android/register.php",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
User.setEmail(email);
User.setPassword(password);
Toast.makeText(context, "Registrado con éxito", Toast.LENGTH_SHORT).show();
context.startActivity(new Intent(context, MainActivity.class));
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context, "Ha ocurrido un error",Toast.LENGTH_SHORT).show();
}
}
){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> params = new HashMap<>();
params.put("email",email);
params.put("password",password);
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
String date = sdf.format(new Date());
params.put("date",date);
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(context);
requestQueue.add(request);
}
xx.xx.x.x 是我的 public ip.
register.php:
<?php
if ($_SERVER ['REQUEST_METHOD'] == 'POST'){
require_once("db.php");
$email = $_POST['email'];
$password = $_POST['password'];
$date = $_POST['date'];
$query = "INSERT INTO user (email, password, date) VALUES
('$email','$password','$date')";
$result = $mysql->query($query);
if ($result == TRUE){
echo "user created";
}
else{
echo "user not created";
}
$mysql->close();
}
db.php: 我数据库中的用户 rafa 拥有所有权限,可以通过任何地址连接。 (我曾尝试将“localhost”更改为我的 public ip,但它也不起作用)
<?php
$mysql = new mysqli(
"localhost",
"rafa",
"1234",
"eduk"
);
if ( $mysql->connect_error){
die( "failed to connect" . $mysql->connect_error);
}
我得到的错误是:Ljava.lang.StackTraceElement;
我读到了这个问题,人们说我需要一个主机,一切都会正常,但我为什么需要它?
模拟器应该像另一台设备一样运行,但没有实体,这是唯一的区别。 我可以使用 pyshical 设备访问我的 apache 服务器,问题一定出在与数据库的连接或其他东西上。 也许我需要使用其他库?
我已经解决了在清单中添加这个问题...
android:usesCleartextTraffic="true"