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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4624440/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 07:16:04  来源:igfitidea点击:

Sending a response from PHP to an Android/Java mobile app?

javaphpandroid

提问by Donal Rafferty

I currently have a piece of code in my Android application that picks up the devices IMEI and sends that IMEI as a parameter to a PHP script that is hosted on the Internet.

我目前在我的 Android 应用程序中有一段代码,用于获取设备 IMEI 并将该 IMEI 作为参数发送到托管在 Internet 上的 PHP 脚本。

The PHP script then takes the IMEI parameter and checks a file to see if the IMEI exists in the file, if it does I want to be able to let my Android application know that the IMEI exists. So essentially I just want to be able to return True to my application.

PHP 脚本然后采用 IMEI 参数并检查文件以查看文件中是否存在 IMEI,如果存在,我希望能够让我的 Android 应用程序知道 IMEI 存在。所以基本上我只想能够将 True 返回到我的应用程序。

Is this possible using PHP?

这可以使用 PHP 吗?

Here is my code so far:

到目前为止,这是我的代码:

Android/Java

安卓/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();
                    }
                }
            }
        }


The above sends the IMEI as a parameter to the PHP script which picks it up successfully and runs a check against the file successfully, however I neeed to then be able to send a positive response back from the PHP script if the IMEI matches one in the file.

以上将 IMEI 作为参数发送到 PHP 脚本,该脚本成功获取并成功检查文件,但是如果 IMEI 与文件。

Here is the 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);

?>


So instead of echo True I want to be able to let my application know that the IMEI was found, is this possible and if so what should I be using to achieve it?

因此,我希望能够让我的应用程序知道找到了 IMEI,而不是 echo True,这可能吗?如果可以,我应该使用什么来实现它?

采纳答案by davogotland

this is good stuff! actually, you're nearly there. your php shouldn't change, your java should! you just need to check the result of the response inside your java code. redeclare your java method as

这是好东西!实际上,您就快到了。你的 php 不应该改变,你的 java 应该!您只需要检查 Java 代码中的响应结果。将您的 java 方法重新声明为

public String executeHttpGet() {

then, let this method return the variable page.

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

now you can create a helper method somewhere. if you put it in the same class as executeHttpGet, it will look like this:

现在您可以在某处创建一个辅助方法。如果你把它和executeHttpGet放在同一个类中,它看起来像这样:

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

now you can call this method to find out if your imei is known in your php backend.

现在您可以调用此方法来确定您的 imei 在您的 php 后端是否已知。

回答by Igor

I'm not sure is it good for you or not - but you can use headers. If the IMEI was found you can send header("Status: HTTP/1.1 200 OK") otherwise send header("Status: 404 Not Found").

我不确定它是否对你有好处 - 但你可以使用标题。如果找到 IMEI,您可以发送 header("Status: HTTP/1.1 200 OK") 否则发送 header("Status: 404 Not Found")。

And then you should check response status in your application.

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

回答by tony gil

your code is basically sound, all you need to do is tweak it up a bit. i mixed and matched the answers above, because i needed to accomplish exactly what you were trying to. i created a database, instead of checking txt files.

你的代码基本上是健全的,你需要做的就是稍微调整一下。我混合并匹配了上面的答案,因为我需要完全完成你想要的。我创建了一个数据库,而不是检查 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 ;

the java android code would be (dont forget to create the proper adjustements in the main.xml layout file, inserting 2 elements to a classical helloworld screen:

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();
        }  
    }
}

with an addtional class

额外的课程

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;
    }
}

on the php side:

在 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;
?>

and (so that you dont have to insert the numbers manually (just change the php fileName in the submit):

和(这样您就不必手动插入数字(只需更改提交中的 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, 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;
?>

if succesful, your mobile screen will display the imei 3 times (the one on the device, the one received in php and the one retrieved on the database).

如果成功,您的手机屏幕将显示 imei 3 次(设备上的一次,php 中收到的一次,以及数据库中检索到的一次)。

ConnStrDB.php is a file that contains your complete connection to MySQL database.

ConnStrDB.php 是一个包含您与 MySQL 数据库的完整连接的文件。

if you reply with long text, the android application will receive it, as well as the verbose version of any php warning. if you dont need json, you can answer any xml thru a php echo. thanx for your question, very useful! and thanx for the EXCELLENT answers!

如果您用长文本回复,android 应用程序将收到它,以及任何 php 警告的详细版本。如果您不需要 json,您可以通过 php echo 回答任何 xml。感谢您的问题,非常有用!并感谢优秀的答案!