В настоящее время у меня есть часть кода в приложении для Android, которое подбирает устройства IMEI и отправляет этот IMEI в качестве параметра скрипту PHP, размещенному в Интернете.
Сценарий PHP затем принимает параметр IMEI и проверяет файл, чтобы увидеть, существует ли IMEI в файле, если я хочу, чтобы мое приложение Android узнало, что IMEI существует. Поэтому я просто хочу вернуть True в свое приложение.
Возможно ли это с помощью PHP?
Вот мой код:
Android / Java
//Test HTTP Get for PHP public void executeHttpGet() throws Exception { BufferedReader in = null; try { HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(); request.setURI(new URI("http://testsite.com/" + "imei_script.php?imei=" + telManager.getDeviceId() )); HttpResponse response = client.execute(request); in = new BufferedReader (new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String line = ""; String NL = System.getProperty("line.separator"); while ((line = in.readLine()) != null) { sb.append(line + NL); } in.close(); String page = sb.toString(); System.out.println(page); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Вышеописанное отправляет IMEI в качестве параметра скрипту PHP, который успешно подбирает его и успешно запускает проверку файла, однако я не смог отправить положительный ответ из PHP-скрипта, если IMEI соответствует одному в файл.
Вот PHP:
<?php // to return plain text header("Content-Type: plain/text"); $imei = $_GET["imei"]; $file=fopen("imei.txt","r") or exit("Unable to open file!"); while(!feof($file)) { if ($imei==chop(fgets($file))) echo "True"; } fclose($file); ?>
в<?php // to return plain text header("Content-Type: plain/text"); $imei = $_GET["imei"]; $file=fopen("imei.txt","r") or exit("Unable to open file!"); while(!feof($file)) { if ($imei==chop(fgets($file))) echo "True"; } fclose($file); ?>
Поэтому вместо echo True, я хочу, чтобы мое приложение могло узнать, что IMEI был найден, возможно ли это, и если да, то что я должен использовать для его достижения?
это хороший материал! на самом деле, вы почти там. ваш php не должен меняться, ваша Java должна! вам просто нужно проверить результат ответа внутри вашего java-кода. переопределите свой java-метод как
public String executeHttpGet() {
то пусть этот метод возвращает страницу переменной.
теперь вы можете где-то создать вспомогательный метод. если вы поместите его в тот же класс, что и executeHttpGet, он будет выглядеть так:
public boolean imeiIsKnown(){ return executeHttpGet().equals("True"); }
теперь вы можете вызвать этот метод, чтобы узнать, известен ли ваш imei в вашем php-сервере.
Я не уверен, что это хорошо для вас или нет, но вы можете использовать заголовки. Если IMEI был найден, вы можете отправить заголовок («Status: HTTP / 1.1 200 OK»), в противном случае отправить заголовок («Status: 404 Not Found»).
И тогда вы должны проверить статус ответа в своем приложении.
ваш код в основном звучит, все, что вам нужно сделать, это немного подправить его. я смешал и сопоставил ответы выше, потому что мне нужно было выполнить именно то, что вы пытались сделать. Я создал базу данных вместо проверки файлов txt.
CREATE TABLE IF NOT EXISTS `user_device` ( `Id_User_Device` int(11) NOT NULL auto_increment, `Nr_User_Device` varchar(60) collate utf8_bin NOT NULL, `Ic_User_Device_Satus` int(11) NOT NULL default '1', PRIMARY KEY (`Id_User_Device`), KEY `Nr_User_Device` (`Nr_User_Device`,`Ic_User_Device_Satus`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=20 ;
код java android был бы (не забудьте создать правильные настройки в файле макета main.xml, вставив 2 элемента в классический экран helloworld:
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URI; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; public class ZdeltestEMEIActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); DeviceUuidFactory deviceUuidFactory = new DeviceUuidFactory(this); String deviceUuid = deviceUuidFactory.getDeviceUuid().toString(); Log.d("tgpost",deviceUuid); try { String webPostAnswer = deviceIdCheck(deviceUuid); if (webPostAnswer != null) { TextView tv1 = (TextView) findViewById(R.id.textdisplay01); TextView tv2 = (TextView) findViewById(R.id.textdisplay02); tv1.setText(webPostAnswer); tv2.setText(deviceUuid); Log.d("tgpost", "okok "+webPostAnswer); } else { Log.d("tgpost", "nono empty"); } } catch (Exception e) { // TODO Auto-generated catch block Log.i("tgpost", "exc " + e.getMessage()); Log.i("tgpost", e.toString()); Log.e("tgpost", e.getStackTrace().toString()); e.printStackTrace(); } } public String deviceIdCheck(String deviceUuidIn) throws Exception { boolean flagOK = false; BufferedReader in = null; try { HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(); Log.v("tgpost", "okok"); //"imei_script.php?deviceId="; + telManager.getDeviceId() request.setURI(new URI("http://www.you.net/" + "deviceIdCheck.php?deviceId=" + deviceUuidIn )); HttpResponse response = client.execute(request); Log.d("tgpost", "php answered> "+response); in = new BufferedReader (new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String line = ""; String NL = System.getProperty("line.separator"); while ((line = in.readLine()) != null) { sb.append(line + NL); } in.close(); String page = sb.toString(); Log.d("tgpost", "php answered HUMAN> "+page); return page; } catch (Exception e) { return "problems with connection "+e.getMessage(); } } }
с дополнительным классом
import android.content.Context; import android.content.SharedPreferences; import android.provider.Settings.Secure; import android.telephony.TelephonyManager; import java.io.UnsupportedEncodingException; import java.util.UUID; public class DeviceUuidFactory { protected static final String PREFS_FILE = "device_id.xml"; protected static final String PREFS_DEVICE_ID = "device_id"; protected static UUID uuid; public DeviceUuidFactory(Context context) { if( uuid ==null ) { synchronized (DeviceUuidFactory.class) { if( uuid == null) { final SharedPreferences prefs = context.getSharedPreferences( PREFS_FILE, 0); final String id = prefs.getString(PREFS_DEVICE_ID, null ); if (id != null) { // Use the ids previously computed and stored in the prefs file uuid = UUID.fromString(id); } else { final String androidId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID); // Use the Android ID unless it's broken, in which case fallback on deviceId, // unless it's not available, then fallback on a random number which we store // to a prefs file try { if (!"9774d56d682e549c".equals(androidId)) { uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8")); } else { final String deviceId = ((TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId(); uuid = deviceId!=null ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")) : UUID.randomUUID(); } } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } // Write the value out to the prefs file prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString() ).commit(); } } } } } /** * Returns a unique UUID for the current android device. As with all UUIDs, this unique ID is "very highly likely" * to be unique across all Android devices. Much more so than ANDROID_ID is. * * The UUID is generated by using ANDROID_ID as the base key if appropriate, falling back on * TelephonyManager.getDeviceID() if ANDROID_ID is known to be incorrect, and finally falling back * on a random UUID that's persisted to SharedPreferences if getDeviceID() does not return a * usable value. * * In some rare circumstances, this ID may change. In particular, if the device is factory reset a new device ID * may be generated. In addition, if a user upgrades their phone from certain buggy implementations of Android 2.2 * to a newer, non-buggy version of Android, the device ID may change. Or, if a user uninstalls your app on * a device that has neither a proper Android ID nor a Device ID, this ID may change on reinstallation. * * Note that if the code falls back on using TelephonyManager.getDeviceId(), the resulting ID will NOT * change after a factory reset. Something to be aware of. * * Works around a bug in Android 2.2 for many devices when using ANDROID_ID directly. * * @see http://code.google.com/p/android/issues/detail?id=10603 * * @return a UUID that may be used to uniquely identify your device for most purposes. */ public UUID getDeviceUuid() { return uuid; } }
на стороне php:
<?php // to return plain text // header("Content-Type: plain/text"); include('/home/public_html/ConnStrDB.php'); $deviceId = $_GET["deviceId"]; $sql = "SELECT Nr_User_Device FROM user_device WHERE Nr_User_Device = '".$deviceId."'"; $result = mysql_query($sql); if ($result) { $row = mysql_fetch_array($result); if ($row[0]) {$deviceIdFile = $row[0];} else {$deviceIdFile = "device not found";} } else { $deviceIdFile = "no check was made, empty set"; } echo $_GET["deviceId"]." ".$deviceIdFile; ?>
в<?php // to return plain text // header("Content-Type: plain/text"); include('/home/public_html/ConnStrDB.php'); $deviceId = $_GET["deviceId"]; $sql = "SELECT Nr_User_Device FROM user_device WHERE Nr_User_Device = '".$deviceId."'"; $result = mysql_query($sql); if ($result) { $row = mysql_fetch_array($result); if ($row[0]) {$deviceIdFile = $row[0];} else {$deviceIdFile = "device not found";} } else { $deviceIdFile = "no check was made, empty set"; } echo $_GET["deviceId"]." ".$deviceIdFile; ?>
и (так что вам не нужно вставлять номера вручную (просто измените имя файла php в submit):
<?php // to return plain text // header("Content-Type: plain/text"); include('/home/public_html/ConnStrDB.php'); $deviceId = $_GET["deviceId"]; $sql = "SELECT Nr_User_Device, Ic_User_Device_Status FROM user_device WHERE Nr_User_Device = ".$deviceId; $sql = "INSERT INTO user_device (Nr_User_Device) VALUES ('".$deviceId."')"; $result = mysql_query($sql); if ($result) { $deviceIdFile = "device inserted"; } else { $deviceIdFile = "not inserted"; } echo $_GET["deviceId"]." ".$deviceIdFile; ?>
в<?php // to return plain text // header("Content-Type: plain/text"); include('/home/public_html/ConnStrDB.php'); $deviceId = $_GET["deviceId"]; $sql = "SELECT Nr_User_Device, Ic_User_Device_Status FROM user_device WHERE Nr_User_Device = ".$deviceId; $sql = "INSERT INTO user_device (Nr_User_Device) VALUES ('".$deviceId."')"; $result = mysql_query($sql); if ($result) { $deviceIdFile = "device inserted"; } else { $deviceIdFile = "not inserted"; } echo $_GET["deviceId"]." ".$deviceIdFile; ?>
если удастся, ваш мобильный экран отобразит imei 3 раза (тот, который на устройстве, тот, который получен в php и тот, который был получен в базе данных).
ConnStrDB.php – это файл, который содержит ваше полное соединение с базой данных MySQL.
если вы ответите длинным текстом, приложение android получит его, а также подробную версию любого предупреждения php. если вам не нужен json, вы можете ответить на любой xml через php-эхо. спасибо за ваш вопрос, очень полезно! и спасибо за ОТЛИЧНЫЕ ответы!