我目前正在开发 Android Studio。只是尝试制作一个应用程序来注册帐户并使用 LAMP 堆栈将数据保存在数据库中。
我使用的代码适用于本地主机(我使用的是 XAMPP),它将数据发布到数据库。
但是,当我更改 AWS 上的 EC2 计算机的 URL 时,应用程序显示“java.io.Exception Unexpected End Of Stream on com.android.okhttp”并且没有将数据发布到数据库。我测试并验证了 URL 是否正确。
对于这个问题我还应该尝试什么?任何帮助将非常感激!
这是应用程序用户界面: Click to see image
代码如下:
<小时/>package com.example.androidphp;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText editTextUserName, editTextEmail, editTextPassword;
private Button buttonRegister;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editTextEmail = (EditText) findViewById(R.id.editTextEmail);
editTextUserName = (EditText) findViewById(R.id.editTextUserName);
editTextPassword = (EditText) findViewById(R.id.editTextPassword);
buttonRegister = (Button) findViewById(R.id.buttonRegister);
progressDialog = new ProgressDialog(this);
buttonRegister.setOnClickListener(this);
}
private void registerUser(){
final String email = editTextEmail.getText().toString().trim();
final String username = editTextUserName.getText().toString().trim();
final String password = editTextPassword.getText().toString().trim();
progressDialog.setMessage("Registering User....");
progressDialog.show();
// class from volley
StringRequest stringRequest = new StringRequest(Request.Method.POST,
Constants.URL_REGISTER,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
progressDialog.dismiss();
try {
JSONObject jsonObject = new JSONObject(response);
Toast.makeText(getApplicationContext(), jsonObject.getString("message"),
Toast.LENGTH_LONG).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressDialog.hide();
Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> params = new HashMap<>();
params.put("username", username);
params.put("email", email);
params.put("password", password);
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
@Override
public void onClick(View v) {
if(v == buttonRegister)
registerUser();
}
}
最佳答案
我的 Android 10 设备也有同样的问题,如果您的协议(protocol) URL 是 http
,则必须在 list 中添加 android:usesCleartextTraffic="true"
。
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/AppTheme">
</Application>
在 android 9 pi [API Level 28] 及更高版本中,您必须在 Manifest 应用程序标记中设置 networkSecurityConfig
,如下所示:
<application android:networkSecurityConfig="@xml/network_security_config">
然后在您的 xml 文件夹中创建您的 xml 文件,并且应如下所示以启用所有不加密的请求:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">secure.example.com</domain>
</domain-config>
</network-security-config>
关于java.io.Exception com.android.okhttp 上的流意外结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58859334/