从PHP发送响应到Android / Java移动应用程序?

时间:2011-01-07 10:12:50

标签: java php android

我目前在我的Android应用程序中有一段代码,用于获取IMEI设备并将该IMEI作为参数发送到Internet上托管的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脚本,该脚本成功获取并成功运行对文件的检查,但是如果IMEI匹配,我需要能够从PHP脚本发回肯定响应一个在文件中。

这是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);

?>

因此,我希望能够让我的应用程序知道已找到IMEI,这是否可行,如果可以,我应该使用什么来实现它呢?

3 个答案:

答案 0 :(得分:3)

这是好事!实际上,你几乎就在那里。你的php不应该改变,你的java应该!你只需要检查java代码中的响应结果。将您的java方法重新声明为

public String executeHttpGet() {

然后,让这个方法返回变量页面。

现在你可以在某处创建一个帮助方法。如果你把它放在与executeHttpGet相同的类中,它将如下所示:

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

现在你可以调用这个方法来查明你的php后端是否知道你的imei。

答案 1 :(得分:2)

我不确定它对你有好处 - 但你可以使用标题。如果发现IMEI,您可以发送标题(“状态:HTTP / 1.1 200 OK”),否则发送标题(“状态:404未找到”)。

然后您应该检查应用程序中的响应状态。

答案 2 :(得分:0)

你的代码基本上是合理的,所有你需要做的就是调整一下。我混合并匹配上面的答案,因为我需要完成你想要的。我创建了一个数据库,而不是检查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 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,你可以通过php echo回答任何xml。 thanx为您的问题,非常有用!和thanx的优秀答案!