Я новичок в Android, и мне нужно подключить мое приложение к онлайн-базе данных. Я создал базу данных и файлы подключения php. Я также создал тестовый файл index.php, чтобы проверить соединение:
index.php
<?php
include_once 'connection.php';
echo 'hi';
?>
Я также использовал search.php для получения данных:
<?php
mysql_connect("localhost","****","*****");
mysql_select_db("*****");
$sql=mysql_query("select * from user where username like 'a%'");
while($row=mysql_fetch_assoc($sql)) $output[]=$row;
print(json_encode($output));
mysql_close();
?>
Это результат поиска search.php:
[{"id":"2","username":"adla","password":"123","type":null,"customer_id":null,"employee_id":null}]
Я могу подключиться к базе данных извне приложения, так что, возможно, ошибка в моем коде.
Я попробовал два метода из 2 учебников:
http://www.helloandroid.com/tutorials/connecting-mysql-database (Использование метода Post)
public void connectNow(View view)
{
String result = null;
InputStream is = null;
StringBuilder sb =null;
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
//http post
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://akmiengineering.com/insurance-app/search.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
Toast.makeText(getApplicationContext(),"Connection successful!! This is return:" +is , Toast.LENGTH_LONG).show();
}catch(Exception e){
Log.e("log_tag", "Error in http connection" + e.toString());
}
//convert response to string
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
sb = new StringBuilder();
sb.append(reader.readLine() + "\n");
String line="0";
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result=sb.toString();
Toast.makeText(getApplicationContext(),"Connection successful!! This is result:" +result , Toast.LENGTH_LONG).show();
}catch(Exception e){
Log.e("log_tag", "Error converting result "+e.toString());
}
//paring data
String fd_id;
String fd_name;
try{
jArray = new JSONArray(result);
JSONObject json_data=null;
for(int i=0;i<jArray.length();i++) {
json_data = jArray.getJSONObject(i);
fd_id = json_data.getString("username");
fd_name = json_data.getString("password");
Toast.makeText(getApplicationContext(), "I'm here!! This is name:" + fd_id + " and this is pass: " + fd_name, Toast.LENGTH_LONG).show();
}
}catch(JSONException e1){
Toast.makeText(getBaseContext(), "No Data Found", Toast.LENGTH_LONG).show();
}
}
Я попробовал отладку приложения на bluestacks, так как у меня нет андроида, поэтому я просто зависел от точек останова, чтобы обнаружить ошибку. Похоже, приложение сбой, когда код достигает этого:
HttpResponse response = httpclient.execute(httppost);
http://hmkcode.com/android-internet-connection-using-http-get-httpclient/ (с использованием GET)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_http_test);
EditText etResponse;
TextView tvIsConnected;
// get reference to the views
etResponse = (EditText) findViewById(R.id.etResponse);
tvIsConnected = (TextView) findViewById(R.id.tvIsConnected);
// check if you are connected or not
if(isConnected()){
tvIsConnected.setBackgroundColor(0xFF00CC00);
tvIsConnected.setText("You are conncted");
}
else{
tvIsConnected.setText("You are NOT conncted");
}
// show response on the EditText etResponse
etResponse.setText(GET("http://akmiengineering.com/insurance-app/index.php"));
}
public static String GET(String url){
InputStream inputStream = null;
String result = "";
try {
// create HttpClient
HttpClient httpclient = new DefaultHttpClient();
// make GET request to the given URL
HttpResponse httpResponse = httpclient.execute(new HttpGet(url));
// receive response as inputStream
inputStream = httpResponse.getEntity().getContent();
// convert inputstream to string
if(inputStream != null)
result = convertInputStreamToString(inputStream);
else
result = "Did not work!";
} catch (Exception e) {
Log.d("InputStream", e.getLocalizedMessage());
}
return result;
}
// convert inputstream to String
private static String convertInputStreamToString(InputStream inputStream) throws IOException {
BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
String line = "";
String result = "";
while((line = bufferedReader.readLine()) != null)
result += line;
inputStream.close();
return result;
}
// check network connection
public boolean isConnected(){
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(this.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected())
return true;
else
return false;
}
Кроме того, этот код приводит к сбою приложения в этот момент:
HttpResponse httpResponse = httpclient.execute(new HttpGet(url));
Это та же проблема для обоих методов, но я не знаю, что вызывает это и как ее исправить. Я попытался обнаружить ошибку с logcat, но я не могу это понять:
07-08 15:08:06.631 2750-2750/com.bluestacks.gamepophome E/bluestacksHome﹕ Hidden apps list thru binder[com.zqgame.fr.en.androidgp, com.igg.bzbee.slotsdeluxe, com.igg.clashoflords2, com.igg.pokerdeluxe, air.com.sublinet.tastytale]
07-08 15:08:06.641 2750-2750/com.bluestacks.gamepophome E/bluestacksHome﹕ Hidden list size 5
07-08 15:08:06.731 2661-2673/com.android.inputmethod.latin W/Binder﹕ Caught a RuntimeException from the binder stub implementation.
java.lang.NullPointerException
at android.inputmethodservice.IInputMethodWrapper.setSessionEnabled(IInputMethodWrapper.java:280)
at com.android.internal.view.IInputMethod$Stub.onTransact(IInputMethod.java:129)
at android.os.Binder.execTransact(Binder.java:404)
at dalvik.system.NativeStart.run(Native Method)
07-08 15:08:06.731 2533-29585/system_process W/InputMethodManagerService﹕ Got RemoteException sending setActive(false) notification to pid 7192 uid 10066
Я даже тестировал его, пытаясь подключиться к локальному хосту, но я получил ту же ошибку.
Я думаю, что вы можете столкнуться с проблемой потоковой передачи в Android. Обычно такие методы, как ваш метод GET, должны находиться внутри другого класса, который расширяет AsyncTask, который будет запускать ваш код в другом потоке, отличном от основного.
Если вы не хотите использовать AsyncTask и хотите заставить ваш код запускать все в одном потоке, вы должны иметь что-то вроде этого внутри метода onCreate:
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
Вы объявили интернет-разрешение в файле манифеста.