Если вы ответите длинным текстом, приложение для Android получит его, а также подробную версию любого предупреждения php. Если вам не нужен JSON, вы можете ответить на любой XML через PHP эхо. Спасибо за ваш вопрос, очень полезно! и спасибо за ОТЛИЧНЫЕ ответы!

тоящее время в моем приложении для 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);

?>

Поэтому вместо echo True я хочу, чтобы мое приложение сообщало, что IMEI был найден, возможно ли это, и если да, то что я должен использовать для его достижения?

Ответы на вопрос(3)

все, что вам нужно сделать, это немного его настроить. я смешал и сопоставил ответы выше, потому что мне нужно было выполнить именно то, что вы пытались. я создал базу данных, вместо проверки текстовых файлов.

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 fileName при отправке):

<?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 эхо. Спасибо за ваш вопрос, очень полезно! и спасибо за ОТЛИЧНЫЕ ответы!

хорошо это для вас или нет - но вы можете использовать заголовки. Если IMEI был найден, вы можете отправить заголовок («Status: HTTP / 1.1 200 OK»), в противном случае отправьте заголовок («Status: 404 Not Found»).

И тогда вы должны проверить статус ответа в вашем приложении.

Решение Вопроса

ты почти там. ваш php не должен меняться, ваш java должен! вам просто нужно проверить результат ответа внутри вашего Java-кода. переопределить ваш метод Java как

public String executeHttpGet() {

затем пусть этот метод возвращает переменную страницу.

Теперь вы можете создать вспомогательный метод где-нибудь. если вы поместите его в тот же класс, что и executeHttpGet, он будет выглядеть так:

public boolean imeiIsKnown(){
    return executeHttpGet().equals("True");
}

Теперь вы можете вызвать этот метод, чтобы узнать, известен ли ваш imei в вашем PHP-бэкенде.

 Donal Rafferty07 янв. 2011 г., 12:08
Спасибо, я просто удалил новую строковую переменную, чтобы на странице переменной было просто "True", спасибо. Теперь, чтобы начать смотреть на подключение к базе данных :)
 jishan18 мая 2015 г., 07:54
Предположим, что в приведенном выше сценарии спросили, что я на конце php, и устройство Android подключается ко мне и отвечает. Теперь есть ли способ, которым я могу быть уверен, что ответ достиг приложения Android. @davogotland
 jishan18 мая 2015 г., 07:41
Предположим, что в приведенном выше сценарии спросили, что я на конце php, и устройство Android подключается ко мне и отвечает. Теперь есть ли способ, которым я могу быть уверен, что ответ достиг приложения Android.
 davogotland07 янв. 2011 г., 11:49
хм ... может быть, метод imeiIsKnown должен вернуть executeHttpGet (). startWith ("True"); или, возможно, вернуть executeHttpGet (). equals ("True" + System.getProperty ("line.separator"));

Ваш ответ на вопрос