[Android] 使用HTTP的POST方式和網頁表單溝通

 

2011-04-21 02 04 20.png  


2012.08.13版主回覆:

底下好多留言都詢問,奇怪?怎麼模擬器上都出現文字
然後網頁上沒出現?

不要再相信沒有事實根據的說法了 (大誤
不要再說沒有小弟不才,沒有爬文 

請移步至新版:

http://j796160836.pixnet.net/blog/post/30577968

個人還是建議從本篇看起,概念比較清楚


 

 最近常常被問到這些問題

Android要怎麼接MySQL資料庫呀? MySQL在網路上

Android怎麼接上雲端的資料庫?

Android怎麼傳送表單內容?

 

這些答案都在這裡

網路上的資料庫,不太容易,也不建議直接與資料庫做溝通

因為涉及到資訊安全的東西

 

 

可以用網頁來做中間的介面,讓二者產生關聯

做類似WebServices的東西
(雖然不是真正的WebServices,但其角色是類似的)

 


伺服器端

你可以簡單寫個印字串的程式,如果收到POST的封包

就印出其內容

如果是PHP可能這樣寫

<?php

        //宣告utf-8的編碼

        header("Content-Type:text/html; charset=utf-8");

        $data=$_POST[‘data’];

        echo "data=".$data;

?>

把寫好程式,取名httpPostTest.php

把他擺到htdoc底下 (windows)

或是/var/www/ (ubuntu)

或是/var/www/html (Fedora, Cent OS)

用ASP可能這樣寫

<%@ LANGUAGE=VBScript CodePage=950%>
<%
data=request("data")
response.write "data="&data
%>

不管如何,請照你的伺服器語言撰寫

 


Android手機端

 

可以用範例程式碼來解決問題

這些範例仿間找的到

因為過於複雜,所以我又重新整理了其範例給大家看

 

關鍵程式碼不到5行,但重點是在於你對Android的UI介面認識與否

和動態網頁的語言的熟練度

 

 


照慣例,文字要放在string.xml裡

/res/values/string.xml

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <string name="app_name">httpPostTest</string>

    <string name="help_txt">請輸入文字以便使用POST傳送:</string>

    <string name="txt_message_hint">請輸入文字</string>

    <string name="send">送出</string>

</resources>


看一下Layout檔

/res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

<TextView 

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/help_txt"

    />

    <EditText

    android:id="@+id/txt_message"

    android:hint="@string/txt_message_hint"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

   />

   <Button

   android:id="@+id/send_btn"

   android:text="@string/send"

   android:layout_width="fill_parent"

   android:layout_height="wrap_content"

   />

</LinearLayout>

 

這裡沒甚麼特別,就是一個EditText來讓使用者能打入資料

然候一個按鈕讓系統傳送封包到寫死的網址路徑

 


程式碼要上了

main.java

 

package com.J_Test.httpPostTest;

 

/*

 * ====httpPostTest範例====

 * 1. 請先確認Apache有沒有正確執行

 * 2. 放入以下PHP代碼到htdoc資料夾中(或是/var/www/)等路徑

 *

 

 <?php

 //宣告utf-8的編碼

 header("Content-Type:text/html; charset=utf-8");

 $data=$_POST[‘data’];

 echo "data=".$data;

 ?>

 

 *

 * 3. 修改uriAPIIP和檔案名稱為正確 (請用電腦對外之IP)

 * (不可用127.0.0.1因為Android手機上也有本機位址)

 *

 */

 

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

 

import org.apache.http.HttpResponse;

import org.apache.http.NameValuePair;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.protocol.HTTP;

import org.apache.http.util.EntityUtils;

 

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

 

publicclass main extends Activity implements OnClickListener

{

    private EditText txtMessage;

    private Button sendBtn;

    private String uriAPI = "http://192.168.1.3/httpPostTest.php";

 

    @Override

    publicvoid onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

 

        txtMessage = (EditText) findViewById(R.id.txt_message);

        sendBtn = (Button) findViewById(R.id.send_btn);

 

        if (sendBtn != null)

        {

            sendBtn.setOnClickListener(this);

        }


    }

 

    @Override

    publicvoid onClick(View v)

    {

        if (v == sendBtn)

        {

            String msg = null;

            if (txtMessage != null)

            {

                msg = txtMessage.getEditableText().toString();

                String result = sendPostDataToInternet(msg);

 

                // 印出網路回傳的文字

                if (result != null)

                    Toast.makeText(this, result, Toast.LENGTH_LONG).show();

            }

        }

    }

 

    private String sendPostDataToInternet(String strTxt)

    {

        / 建立HTTP Post連線 /

        HttpPost httpRequest = new HttpPost(uriAPI);

        /*

         * Post運作傳送變數必須用NameValuePair[]陣列儲存

         */

        List<NameValuePair> params = new ArrayList<NameValuePair>();

        params.add(new BasicNameValuePair("data", strTxt));

        try

        {

            / 發出HTTP request /

            httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));

            / 取得HTTP response /

            HttpResponse httpResponse = new DefaultHttpClient()

                    .execute(httpRequest);

            / 若狀態碼為200 ok /

            if (httpResponse.getStatusLine().getStatusCode() == 200)

            {

                / 取出回應字串 /

                String strResult = EntityUtils.toString(httpResponse

                        .getEntity());

 

                // 回傳回應字串

                return strResult;

            }

 

        } catch (ClientProtocolException e)

        {

            Toast.makeText(this, e.getMessage().toString(), Toast.LENGTH_SHORT)

                    .show();

            e.printStackTrace();

        } catch (IOException e)

        {

            Toast.makeText(this, e.getMessage().toString(), Toast.LENGTH_SHORT)

                    .show();

            e.printStackTrace();

        } catch (Exception e)

        {

            Toast.makeText(this, e.getMessage().toString(), Toast.LENGTH_SHORT)

                    .show();

            e.printStackTrace();

        }

        returnnull;

    }

 

}

 

 


最後是AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

      package="com.J_Test.httpPostTest"

      android:versionCode="1"

      android:versionName="1.0">

    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">

        <activity android:name=".main"

                  android:label="@string/app_name">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

    <!– 這裡加入可以存取網路的權限 –>

    <uses-permission android:name="android.permission.INTERNET" />

</manifest>

 

這裡很重要也很容易疏忽

除了Activity要在這裡註冊外

能對外上網的權限也在這裡註冊

如果遇到

WARN/System.err(503): java.net.SocketException: Permission denied

就該發現權限少了這一項

<uses-permission android:name="android.permission.INTERNET" />

另一個權限也常用,但仿間書常常會遺漏

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

就是能夠存取手機記憶卡的權限

 

 


這樣有看懂嗎?

 

主要重點在這裡

  / 建立HTTP Post連線 /

  HttpPost httpRequest = new HttpPost(uriAPI);

這個HttpPost是主要的Class名,這裡要填入存取的網址

 

然後

 /*

  * Post運作傳送變數必須用NameValuePair[]陣列儲存

  */

  List<NameValuePair> params = new ArrayList<NameValuePair>();

  params.add(new BasicNameValuePair("data", strTxt));

 

使用系統指定的資料格式BasicNameValuePair

BasicNameValuePair在new的時候裡面為二個字串,一個是名稱,一個是值

這裡用"data"當名字,值就是剛剛讓使用者打的資料

 

  / 發出HTTP request /

  httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));

的  HTTP.UTF_8 可以指定編碼格式,不過要跟伺服器端相同(照我範例走的話是不用動)



2011-04-21 02 18 45.png  

其實這個Android其實是跟以下網頁的功能是相同的

有些值你可以對照看看,相關對照的字詞都用顏色標明了

可以將它另存到httpPostTest.htm

 

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”&gt;

<html xmlns="http://www.w3.org/1999/xhtml”&gt;

<head>
<meta http-equiv="Content-Language" content="zh-tw" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF_8" />
<title>httpPostTest</title>
<head></head>
<body>
請輸入文字以便使用POST傳送:<br />
<form method="POST" action="http://192.168.1.3/httpPostTest.php">
<input type="text" name="data" size="20" value="請輸入文字" /><br />
<input name="Submit1" type="submit" value="送出" /><br />
</form>
</body>
</html>

 


延伸

其實網頁大多喜歡把很多功能做在一個檔裡,就是用一個隱藏值來判斷現在進行到那個階段

本例用op當階段的旗標

 

PHP版:

請輸入文字以便使用POST傳送:<br />
<form method="POST" action="<?php echo $_SERVER[‘PHP_SELF’]; ?>">
<input type="text" name="data" size="20" value="請輸入文字" /><br />
<input type="hidden" name="op" value="showValue" />
<input name="Submit1" type="submit" value="送出" /><br />
</form>

 

ASP版:

 

請輸入文字以便使用POST傳送:<br />
<form method="POST" action="<%=Request.ServerVariables("PATH_INFO")%>">
<input type="text" name="data" size="20" value="請輸入文字" /><br />
<input type="hidden" name="op" value="showValue" />
<input name="Submit1" type="submit" value="送出" /><br />
</form>


2011-04-21 02 05 40.png

   2011-04-21 02 17 35.png  

 

2011-04-21 02 25 29.png  

 

不過還是再三的提醒

範例程式碼很簡陋,指是要讓大家看懂其中的語法

真正寫程式使用的時候

 

要記得在伺服器判斷輸入的型別

更不要直接讓表單直接下SQL指令

 

怕被資料隱碼攻擊(SQL Injection)

 

這是很危險低~~~~

 

 

參考資料
Google Android SDK開發範例大全 佘志龍等人著
悅知文化

在〈[Android] 使用HTTP的POST方式和網頁表單溝通〉中有 97 則留言

  1. 請問一下~
    我的apk有跑出那個toast
    這樣是不是代表我有把東西傳到目標的網頁
    如果是的話~
    網頁那邊要怎麼顯示出來
    我按重新整理也沒有東西出現= =
    ps:PHP初初初學者= =
    版主回覆:(05/12/2011 12:46:40 PM)
    data=
    它的後面有沒有接東西?
    網頁有送資料過去才會出現data=後面才會出現東西
    當然要配合網頁伺服器摟

  2. 沒有耶= =
    網頁那端只有
    data=
    後面沒了= =
    但apk有跑出toast
    data=yyy
    (我傳yyy)
    這不是代表有傳過去嗎?
    版主回覆:(05/12/2011 12:49:34 PM)
    有傳過去
    你可以用"延伸"的標題上面的html原始碼測試
    你直接看的話,是沒有傳資料過去的
    那就是只會有data=

  3. 呃~我現在是在學校實驗室測試的
    實驗室有防火牆~
    跟這不知道有沒有關係
    不過如果toast是代表有傳過去的話
    就應該跟防火牆無關= =
    版主回覆:(05/12/2011 12:56:48 PM)
    1. 要測試防火牆的話,要從防火牆外面做瀏覽測試
    當然要有一個對外IP,且有設定例外
    2. 如果有收到資料的話,加上資料庫的處理程式碼 (sql下Insert …)
    就可以處理資料庫了
    Android這邊就像是一個
    只會傳特定資料
    和 "看得懂" 特定資料的瀏覽器
    網址的部分你也可以直接改成別的
    假設是google.com
    toast就會跳出網頁的原始碼

  4. 我剛才拿您說的html測測看了
    有顯示data=yyy
    您真內行!!!
    那如果我想要用apk丟值出來
    然後網頁重新整理就可以看到我丟的值
    這樣是不是一定要有資料庫才可以?
    版主回覆:(05/12/2011 01:21:52 PM)
    不一定,但也大多會用資料庫
    其它方式的話,如果只是大家都能看到,可以用Application
    生命週期從http服務的啟動到http服務的關閉
    或是用檔案讀寫fopen() fread() fwrite()
    這就要查一下指令怎麼用了

  5. 不好意思
    還有就是
    request respone 他們的 再跟 server 互動的方式 邏輯 概念 我不太懂耶 可以解釋一下嗎
    先發出請求
    有了回應 用回應去做 請求 ????
    版主回覆:(03/13/2012 10:52:30 AM)
    基本上大致是這樣沒錯,所以瀏覽器才會在按下送出後會刷新頁面呀
    其餘的沒講到的細節有,OSI 7層
    因為http走tcp所以會三向交握,建立連線
    假設是登入畫面,在送出帳密後
    PHP等伺服器端程式大多會在伺服器上建立Session
    然後給你一個Session ID
    大概是這樣,如有錯誤煩請指正

  6. 已測試成功,非常感謝!
    想請問一下,如果網頁端回傳一個陣列
    手機端該如何接收呢?
    版主回覆:(05/21/2011 08:46:31 AM)
    可以做成String然後給Android去切
    要不然就是產生XML或json給Android去parse

  7. 你好 雖然不知道在寫什們==因為我是新新新新新手
    在上面的文章我跟著照做
    httpPostTest.htm
    httpPostTest.PHP
    這兩個跟著做好像是成功了
    從httpPostTest.htm打字傳送到
    httpPostTest.php應該是沒錯八@@"看了上面的對話
    (案傳送後他自己跳httpPostTest.php)
    可是問題就在這裡X-(
    因為專題目的是Android傳送至MySQL資料庫
    所以感覺這篇文章很贊可以先測試看看
    所以我就把您的程式是用了一下
    現在出現錯誤的地方是這邊
    MAIN.JAVA的這三行前面都出現紅色的(X)
    (X) setContentView(R.layout.main);
    (X) txtMessage = (EditText) findViewById(R.id.txt_message);
    (X) sendBtn = (Button) findViewById(R.id.send_btn);
    另外這邊也有一個(X)程式執行不了
    AndroidManifest.xml
    (X) android:label="@string/app_name">
    抱歉問題很多因為剛接觸程式這部份
    沒學過這個所以看不懂這類的錯誤是什們意思
    ><可以的話麻連您是否哪邊出了錯
    如果資料太大可以寄給我><
    [email protected]
    版主回覆:(05/22/2011 08:57:04 AM)
    從res/layout/main.xml下手
    xx都過了記得要project>clean

  8. 謝謝
    可是我看我的
    res/layout/main.xml裡面都沒出現XX呢!
    要如何下手 不明白
    抱歉真的不太懂 剛摸這個
    版主回覆:(05/23/2011 06:41:40 AM)
    按ctrl+b就有了
    建議你先研讀版面設計和程式抓控制項的部分
    這篇對你來說太困難了,慢點再看

  9. 版大寫得很好優~可是我的跑的程式依然只在手機上出現data=….,就是"印出網路回傳的文字"這部分,在網頁部分(php)還是沒有,我有透過html傳值是成功的,想要問一下是哪裡出了問題?如果想要知道連線有沒有建立成功要怎麼判斷呢??
    感謝喔~~~~
    版主回覆:(05/30/2011 06:43:09 AM)
    html傳值跟android傳值這二者是沒有關係的唷
    不是說html傳值成功,android傳值就會出現
    網頁部分(php)一定不會有,因為你沒有傳值給他
    傳值—-是單向的,從Client傳到Server,然後才從Server回傳結果給Client
    這裡只是舉例說你可以"印出網路回傳的文字"
    如果不要印出網路回傳文字,就要從 網頁部分(php) 下手
    調整php程式碼
    有沒有建立成功判斷可以用TCPView程式看看有沒有連進來
    或是抓封包
    所以對初學者比較簡單的方法,還是印出網路回傳的文字
    如果沒有設定錯誤
    就會看到一樣的東西

  10. 請問板大
    如果要了解android的程式再寫些什們
    還有要先讀版面設計+抓控制項的部份
    有哪些書籍是您推薦比較好上手的媽?
    謝謝版大回覆
    版主回覆:(08/03/2011 01:30:32 PM)
    我先說,我沒有在這裡幫那本書做廣告
    就只是我看過的一些分享
    ——————-
    Google! Android 2手機應用程式設計入門 / 蓋索林(Gasolin)著
    松崗
    封面有個布丁
    這本講的比較淺顯易懂,在版面的部分講得比較多
    其他的就有點少
    ——————-
    Google Android手機APP開發入門 / 趙令文著
    電腦人文化
    封面有個大機器人
    這本是講的比較全面一點
    網路傳輸的範例光碟有漏
    講View的章節有大表列出大部分常用的參數
    以放layout檔居多,比較沒有逐行講解
    ——————-
    Google Android SDK開發範例大全 佘志龍等人著
    悅知文化
    這篇的程式碼有參考這本書
    這本以範例為主,不建議初學者看
    因為會太眼花撩亂
    有部分程式碼寫的有點怪,不過這範圍很全面
    這本書章節更新變成第三版
    ——————-
    前進 Android Market!Google Android SDK 實戰演練
    何孟翰著
    悅知
    這本多加了雲端應用這部分
    相對的基本的版面設計篇幅少了許多
    供您參考

  11. 佛心來的教學文,一看就懂,非常清楚!!
    萬分的感激阿~~

  12. 請問版主
    您的
    環境設定!

    參數!
    Android的部份
    版主回覆:(08/16/2011 02:06:07 AM)
    Project Name:隨便取
    Package: com.J_Test.httpPostTest
    建立Activity,名字: main
    勾上Android 2.2 (API 8)

  13. 請問我照著上面做之後 當我按下模擬器傳值時 我的程式就會出現異常錯誤會中斷 我確定我 apache 有成功開啟 模擬器IP也更改過 但是還是不行 可以請問大概還有什麼原因會如此嗎?
    版主回覆:(07/09/2011 11:22:26 PM)
    錯誤訊息是?如果收到500伺服器內部錯誤表示你的PHP有錯
    可以看php_error.log看看

  14. 版大..我照著你打的… 之後android 模擬器按send之後 它說xxx is not responed…我應該要怎樣處理><,,,求大大教學….
    版主回覆:(07/15/2011 10:18:54 AM)
    收到ANR(Activity Not Responed)?
    用DDMS去看Log除錯…我有空再寫成一篇
    最近比較忙

  15. 版大~我上面那篇的回文不要看(因為我耍笨了~哈哈哈)
    我現在的問題是手機端可以按送出~下面也有顯示data=XXX
    不過php網頁上卻沒有接收到~是怎麼回事呢?
    版主回覆:(08/03/2011 01:28:48 PM)
    php的部份要另外寫….

  16. 請問android的部分
    按下送出後我會出現NullPointerException
    初步猜測是75行產生例外,弄好久解決不了
    請版大指點迷津

  17. 找到原因了
    似乎只支援2.x版
    版主回覆:(08/03/2011 01:32:52 PM)
    專案是用Android 2.2去建的,不確定在2.2版本以下的能不能執行
    但確定的是在2.2以上的版本是可以用的
    再debug看看吧

  18. 1.我從Android傳至網頁,但是網頁收不到傳來直,但是我用網頁去傳,收的到值,不知道是哪裡出錯,Android是可以傳出來,但就是收不到
    版主回覆:(08/03/2011 01:31:12 PM)
    再試試看吧

  19. 請問若是用IIS的話 APACHE那邊的語法會變嗎?
    版主回覆:(08/16/2011 02:03:30 AM)
    會,你的語言就不會用PHP了
    可能會改用ASP.net (C#/VB)或ASP
    可以參考ASP的寫法,用Response.write

  20. 你好 我是超級新手 不好意思 有些笨問題想請教一下
    想問一下如何把手機多筆輸入值(ex:id,name,email…)一個按鍵一次存入mysql中的同筆資料
    還有如讀用手機透過php讀取資料庫的資料 謝謝

  21. 大大不好意思,經過以上測試結果都是成功的
    但是若是要處理回傳值作為判斷的話
    該使用甚麼語法來判斷傳質內容?
    (以下1為PHP回傳直)
    目前小弟測試用result.startsWith("1")
    及result.equals("1")皆無法判別
    還請大大賜教,謝謝!
    版主回覆:(08/25/2011 01:41:14 PM)
    Android的部份…..
    回傳的是String,如果你傳的是數字 可以用Integer.parseInt()
    先初始個預設值,然後parseInt(),接個Exception避免轉換時出錯
    再拿來比對

  22. 您好,想問一下
    如果是將httpPostTest.php 存放在Appserv底下的www可以嗎?有需要改什麼嗎?
    版主回覆:(08/25/2011 01:35:59 PM)
    直接擺上去即可因為我的範例沒有接資料庫
    需要自己加上

  23. 請問httpPostTest.php沒有印出data內容,就是傳值失敗的意思嗎?
    非常感謝~~

  24. 已解決!! 感謝大大指點
    不過小弟還有一個問題煩請版主指點
    若是回傳質為多筆
    如何在手機以listview的方式接收並且呈現?

  25. 您好,想請問一下
    我在android端執行,輸入文字後,手機的toast是出現"The operation time out"
    想請問是哪裡出問題了?
    apache確定有開啟
    php也有放到資料夾
    uriAPI 也有改
    是android端程式的問題嗎?
    版主回覆:(09/09/2011 05:13:02 AM)
    你確定一下uriAPI是不是打成127.0.0.1或localhost?
    可以試試看直接用android的瀏覽器瀏覽看看你打的網頁
    (在php端修改一下,打點字上去,要不然android上會看到一片空白
    因為根本沒有資料輸出呀)
    確定android和伺服器之間溝通良好
    uriAPI不能用127.0.0.1
    因為這樣會指向android自己(不知道懂不懂我的意思)

  26. 你好!! 請問若以eclipse實作 伺服器端和httpPostTest的程式該寫在哪個開發工具裡呢 小弟是新新新新手…

  27. 上面的httpPostTest是httpPostTest.htm 不好意思~!
    版主回覆:(09/13/2011 07:31:25 AM)
    放在apache裡的htdoc裡
    環境的話可以用xampp或是appserv

  28. 版大您好!
    我的uriAPI是打自己電腦的IP位址,不是打127.0.0.1或localhost
    我也有用android的瀏覽器開我打的網頁,是可以連接的
    我之前是用android2.1版做測試
    現在換成了android2.2版做測試,是沒有出現"The operation timed out"了
    但是現在我輸入文字按送出後,toast是出現"i>>? data=hello"
    資料還是沒有傳過去
    請問版大知道問題出在哪裡嗎?
    版主回覆:(09/13/2011 07:32:52 AM)
    php的部分只是傳過去在印出來給你看
    需要善加修改…加入sql處理insert的部分

  29. Android達人大大~
    哈哈~
    你真的太酷嚕~-XD
    我趕快來刺跨賣~
    超感謝的ㄝ~
    版主回覆:(09/19/2011 02:08:42 PM)
    :目

  30. 感謝版大
    成功了:)
    版主回覆:(09/19/2011 02:08:57 PM)
    🙂

  31. 版大您好,
    想請問一下
    為什麼"印出網路回傳的文字"會出現亂碼?
    我在資料庫連線上設定
    mysql_query("SET NAMES ‘utf-8’");
    mysql_query("SET CHARACTER ‘utf-8’");
    mysql_query("SET CHARACTER_SET_CLIENT=utf-8");
    mysql_query("SET CHARACTER_SET_RESULTS=utf-8");
    在android裡也有設定
    httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
    但還是會出現亂碼,請問這是什麼問題呢?
    版主回覆:(09/19/2011 02:12:35 PM)
    看看資料庫的文字儲存是否為utf8_general_ci
    再來還有PHP檔案的儲存時的編碼
    notepad++打開來看的話應該要是ANSI as UTF-8
    (純英文的文件會顯示ANSI除外)

  32. 不好意思
    最後面三張圖
    android傳值了之後 伺服端的網頁也會保存值嗎? 會像最後一張圖一樣顯示出來嗎?
    請問你最後的圖是html傳的值還是android傳的值?
    版主回覆:(09/23/2011 12:40:22 AM)
    伺服端的網頁不會保存值嗎除非你用資料庫把它存起來
    最後一張圖是html傳的值,是測試用
    跟android無關
    ——————-
    倒數第二張是Android用類似瀏覽器的方式傳值
    這張是android傳的值
    跟html無關

  33. 請問如果我想用POST的方法登入YAHOO帳號取得個人網頁資訊該如何實做呢?
    版主回覆:(09/28/2011 03:44:04 AM)
    這有困難….因為他們會加密

  34. 版大您好:
    想教您幾個問題,
    我在android端寫http post的方法
    將資料傳到php接收
    再用php把值存入資料庫
    想請問
    我在1.php 寫 session
    在2.php echo出session的值
    這是沒問題的
    但是如果用android端做測試的話
    會抓不到session的值
    請問這個跟android端有關係嗎??
    版主回覆:(09/30/2011 01:44:29 AM)
    哈哈…被你發現到了
    android是的確有這問題
    不知道你對http連線的原理有沒有很了解?
    伺服器使用session的話,session資料會存在伺服器上(這書上都有寫)
    但是!!!!伺服器會傳一個session id給用戶端
    (像是你去寄放物品的櫃台寄放東西,櫃台會交給你一把鑰匙一樣)
    用鑰匙認顧客
    回到Android…..伺服器有吐這把鑰匙給他,但他並沒有存下
    不信的話你抓封包看看就知道了

  35. 在模擬器上面執行
    會出現異常終止……
    版主回覆:(10/04/2011 05:07:10 PM)
    看DDMS的logcat

  36. 您好!我想請教一個問題
    在android的模擬器上面執行
    結果畫面出現的是
    Connection to http://localhost:8080 refused
    請問是哪個環節出了問題呢?
    請給予指教,謝謝您
    版主回覆:(10/04/2011 05:06:47 PM)
    網址不能打localhost打實際IP

  37. 我想問一下…
    以我理解…大大的文是不是在ANDROID傳DATA去PHP,
    PHP再傳回"data = "另加在android打的字串?
    如果是我想問一下,
    如果將ANDROID的DATA送去PHP,之後用PHP記住DATA的內容…
    好像HTML用POST的方式去PHP頁一樣….

  38. 您好:
    我剛看到上面有人回應說要post到yahoo去登入,我也有相同疑問,只是說我想做的只是用手機登入一般私人網站,那我應該怎麼去撰寫程式碼呢?謝謝

  39. 今天再試終於明白,
    原本PHP已經收到了值,
    不過在網頁不能直接出,
    只在ANDROID直接出,
    用PHP的ISSET就看到其實有值在$_post[‘data’]
    真的謝謝大大這個很有用的資訊
    版主回覆:(01/23/2012 07:09:47 AM)
    🙂

  40. 我想問一下:
    ANDROID傳DATA去PHP
    為什麼在網頁的部分沒辦法顯示?
    版主回覆:(10/20/2011 03:58:12 PM)
    請爬文,留言有回覆

  41. 請問一下版主有在4.0測試過嗎?
    我是在4.0上用app會直接關閉掉
    在2.3.3上測試是OK的@@
    不知道版主有沒有問遇到這個問題
    版主回覆:(05/13/2012 03:13:16 PM)
    沒有測試過4.0耶,改天測試看看
    —-
    留言更新:
    Android 4.0抓得比較嚴謹,沒有用執行緒不行
    請參考新版文章
    http://j796160836.pixnet.net/blog/post/30577968

  42. 對不起 想請問一下
    如果兩個EditText 在傳遞的時候就必須要自己切嗎 有看到你提到JOSN的方式這個方式有具體的範例嗎??
    版主回覆:(01/23/2012 06:59:27 AM)
    JSON範例,敬請期待。

  43. 可以問你一下
    伺服器那邊大概要怎麼判斷
    android才能收到我想收到的東西呢…
    因為都會收到PHP echo的全部程式碼
    因為我主要是想要讓Android讀取資料庫的東西
    想收到我指定的東西…
    版主回覆:(01/23/2012 06:59:55 AM)
    資料庫範例,敬請期待。

  44. 您好:請問我為何會出現"@drawable/icon"錯誤呢?謝謝
    版主回覆:(01/23/2012 06:58:38 AM)
    新版的Android SDK好像到R16版就將drawable底下的
    icon.png改名叫ic_launcher.png了
    先確認是否res/drawable資料夾(drawable/drawable-hdpi/drawable-ldpi/drawable-mdpi)底下
    是否有icon.png這張圖
    然後clean掉重新Build Project看看
    如果找不到icon.png而有ic_launcher.png
    改成@drawable/ic_launcher即可

  45. 先謝版主無私的分享
    我有一個問題在取值的部分
    有取到值,但也把原始碼給取了…
    非常煩惱
    環境:ASP.NET
    code:
    Response.Write("回傳值:" + strPost);
    版主回覆:(01/23/2012 07:09:15 AM)
    朋友使用ASP.net 有遇到像你一樣的問題
    打開aspx的版面設計的原始碼 (會看到很多html語法)
    刪除其html語法只剩下 類似以下的的語法
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestProject01._Default" %>
    不能照樣copy唷,你專案的這一行會跟我的不一樣
    再試試看

  46. 可以提供JSP網頁語法嗎?
    目前我的JSP網頁顯示不出來我的資料
    拜託! 可以幫幫我嗎?

  47. 您好,感謝您的分享
    如果角色對換,也就是 Server端: Android, 該如何實作?
    版主回覆:(05/13/2012 03:18:38 PM)
    好酷的功能唷!
    我想這就要手動寫Socket了吧
    模擬Apache伺服器的運作
    學它一樣,收HTTP標頭,然後吐HTTP檔頭+內容回去
    寫的時候要用writeByte()
    改天有點空閒來寫這個範例

  48. 想請問版大 我試過用4.0是會有BUG的而改用2.3.3 是OK的
    但是在send的時候他說的IP:xxx.xxx.xxx.xxx:80 refused
    (是定址IP,PORT有無都一樣被拒),想請問會有可能是什麼原因??
    版主回覆:(05/13/2012 03:12:18 PM)
    Android 4.0抓得比較嚴謹,沒有用執行緒不行
    請參考新版文章
    http://j796160836.pixnet.net/blog/post/30577968

  49. 請問如果是HTTPS而不是HTTP
    好像需要認證
    該怎改寫?
    謝謝板大!!
    版主回覆:(05/13/2012 03:15:26 PM)
    HTTPS很難處理,小弟也在突破中

  50. 版主請問
    我用android模擬器打123.他會出現data=123
    可是桌面瀏覽器要怎麼跟著顯示data=123
    版主回覆:(05/13/2012 03:21:45 PM)
    這實在是太多人問了(汗)
    若原理會了,套這些應該不難才是
    請參考
    http://j796160836.pixnet.net/blog/post/30577968

  51. 真是佛心來的分享~一次到位~謝謝Johnny,
    如果想要主動由PHP吐字串給android,有什麼作建議呢?
    版主回覆:(05/13/2012 03:14:40 PM)
    可以循環地向伺服器抓呀,這樣就會好像PHP吐字串給Android了

  52. PHP是否也有能力,能觸發android ap去接受字串呢?

  53. 請問Server端用JSP該怎麼寫才和您的範例會有一樣的效果呢?
    我用的是Android 2.1版
    Server回傳時,連JSP中的換行符號會都顯示在模擬器中的訊息螢幕
    版主回覆:(06/26/2012 03:29:58 AM)
    最近比較忙,還沒有把JSP環境架設起來
    可否你提供你的寫法給我研究一下呢?

  54. 大大你好
    我用你的方法傳送參數到我指定的asp網頁
    但是這樣只能知道有無接收成功
    我需要的功能是在網頁顯示出傳送完的結果(前面做的是登入的動作)
    該怎麼實現呢?
    版主回覆:(06/26/2012 03:31:22 AM)
    可以參考新版,有加上資料庫
    http://j796160836.pixnet.net/blog/post/30577968

  55. 你好,上面有位朋友問,如果要將網頁的東西放入listview來呈現,該怎麼弄
    傳到android的資料可能有多筆,類似:
    123
    456
    789
    000
    111
    都要將它們弄成listview來呈現
    困擾好久了>"<
    版主回覆:(06/27/2012 03:12:53 PM)
    最簡單的方法,用字串全部串起來:
    123,456,789,000,111
    然後從Android收到之後再切開顯示
    或是使用XML,JSON…..

  56. Johnny大
    我已經把Server上的問題解決了!
    感謝您熱心提供經驗。

  57. 您好,
    我是傳值到PHP上然後回傳字串給android
    但是我想依照那字串做換頁的動作,可是好像無法去判斷成功
    我在
    if(result != null)
    {
    if(result=="回傳成功")
    { memberok();
    }}
    但是他都不會成功執行result=="回傳成功"這判斷式
    我也有用一個TextView查看result,的確是回傳成功的字串沒錯
    請問我該如何修改才能判斷字串
    版主回覆:(07/07/2012 01:37:20 AM)
    這是字串的位址(address)和值的差別
    物件類的(包含string)在內,要比較相同值用.equals()
    你可能要找些Java相關的書籍來看
    if(result=="回傳成功")
    改成
    if(result.equals("回傳成功"))

  58. 您好
    我在寫一個註冊的部分
    流程大概是註冊(android) -> 寫入資料庫(php)
    這部分沒什麼問題
    但是在修改資料的時候取值就發生錯誤了
    在取得之前註冊的資料(php從資料庫撈出來傳給android)的時候
    取的值好像跟之前的不一樣(不是亂碼的問題,表面上看起來一樣)
    但是我用php回傳的值做mysql搜尋會找不到那筆資料
    想請問是php回傳時的問題嗎?
    google很久了都找不太到解決的方法QAQ
    感謝版主
    版主回覆:(07/08/2012 03:39:30 PM)
    可能我有點看不懂你敘述的方式,跟您分享一些debug上的技巧
    取得之前註冊的資料(php從資料庫撈出來傳給android)
    1. 這一段可以用瀏覽器去模擬Android去收php出來的資料
    (光憑肉眼看html不準,要開原始碼來看)
    2. 你可以試印看看當初查找的sql語法,把他丟進phpmyadmin看有沒有甚麼異狀
    3. 至於編碼呢…剩下一個可能,Big5和UTF-8和Unicode的問題 (印象中好像是字碼不一樣),有個重點,UTF-8和Unicode感覺好像是一樣的,但其實不一樣 (曾經遇過類似的問題)

  59. 請問
    從模擬器按下送出鍵之後,要在Toast看到輸入的值,並且在php網頁上看到財表示有輸入進去嗎?
    我做出來是Toast跟php都沒看到輸入的值,但試用html就有看到
    這些輸入的值是都會輸入到mysql資料庫嗎?
    那可以從資料庫看到嗎?
    謝謝:)

  60. 請問一下~如果說~我的填寫控格有2個以上~我不管怎麼測試!!
    他都以data這個變數存取我的所有空格資料(我有在新增新的變數進去存資料)
    版主回覆:(10/25/2012 03:29:28 AM)
    可能是Android在列印的時候是data=XXXX
    所以會誤認,查看看PHP的部份

  61. 大大你好
    我的這行
    sendBtn.setOnClickListener(this);他一職是錯誤
    有顯示這行
    The method setOnClickListener(View.OnClickListener) in the type View is not
    applicable for the arguments (MainActivity)
    版主回覆:(09/27/2012 01:57:19 AM)
    你在import的時候,選到了
    import android.content.DialogInterface.OnClickListener;
    那個是給Dialog用的唷,正確的是
    import android.view.View.OnClickListener;
    平平都是OnClickListener,同款不同師傅XD

  62. 抓下來的資料是中文的,在手機顯示出來卻是"???"號!
    如何解決?

  63. 版大您好,我有個問題想請教,我從android上按下送出文字,怎麼讓他轉到網上,顯示我剛剛在textView上打的文字呢?
    這個有提到嗎?

  64. 不好意思,想請問一下。
    我的網站適用ASP.NET架設的,
    依照你的方法的確可以抓到手機端DATA的值。
    但是我想問你,
    有辦法將<%%>內抓取到的值(例如 你上面程式碼request.form的值data)
    放到我UI介面Label中嗎? (如 Label.text=data的值)
    因為小弟是新手,
    所以想請幫忙解惑。
    版主回覆:(07/04/2013 07:43:44 AM)
    寫個Handler然後把資料放上去
    詳細請參考另一篇
    http://j796160836.pixnet.net/blog/post/28766165

  65. 我用範例程式碼
    在手持裝置上會出現亂碼
    後來把
    String strResult = EntityUtils.toString(httpResponse.getEntity());
    改成
    String strResult = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);
    就好了
    原因應該是只有送訊息是UTF8
    取回訊息也應要使用UTF8
    版主回覆:(12/23/2012 10:49:46 AM)
    感謝Gohome大大分享指正

  66. 請問一下我Android手機模擬器可以把資料傳到資料庫去
    但是我放到手機裡為什麼就會當機?
    版主回覆:(12/23/2012 05:44:10 PM)
    用DDMS的Logcat抓Log出來研究研究…

  67. <html><head><title>Test web</
    title><style type="text/
    css">ol{margin:0;padding:0}.c15{vertical-align:top;width:420.8pt;border-style:solid;}
    超長的
    這是什麼意思?
    版主回覆:(12/29/2012 03:05:47 AM)
    html原始碼…建議找網頁語法相關的文章來看
    http://www.powmo.com/

  68. 大大您好:請教一下是否可以SHARE上面一直在變胖變廋的android機器人,
    好可愛哦
    版主回覆:(07/04/2013 07:41:49 AM)
    連我的招牌你也要?
    好吧拿去吧
    <embed src="http://www.android.com/swf/conveyor.swf&quot; type="application/x-shockwave-flash" width="100%" height="90">

  69. 先感謝教學,網路上找好久只有你教怎麼送資料
    我碰到的問題有3
    1)我只要按下送出就會當掉
    後來我測試了一番之後發現好像是例外接收中Toast裡的e.getMessage().toString()造成的,但是就是不知道為什麼會當。
    把Toast整個刪除就不會當掉了
    2)這時問題就來了,我現在不知道錯誤訊息是什麼
    但是應該是後面回傳回應字串的部分造成的
    刪除之後就不會跳出try了
    3)排除之後問題又來了
    我把我的PHP寫成這樣
    <?php
    //宣告utf-8的編碼
    header("Content-Type:text/html; charset=utf-8");
    $data=$_POST[‘data’];
    echo "data=".$data;
    $file = fopen("test.csv","w+"); //開啟檔案
    fwrite($file,$data);
    fclose($file);
    ?>
    將接收到的data存成檔案
    雖然把回傳回應訊息的程式碼砍了
    程式也正常執行
    但問題就是東西沒有寫進去
    不知道是PHP的問題還是Android的問題
    (ps 我沒學過PHP,是上網找code直接貼上的)
    感恩~
    版主回覆:(07/03/2013 01:10:45 PM)
    1. 你可能是在網路送出的方法裡面寫上Toast
    因為網路存取是跑在另一個Thread,它不能直接存取主執行緒的資料
    你可以用Handler去解決
    3. 看起來PHP沒什麼問題
    應該問題出在Android那邊比較大
    你說,雖然把回傳回應訊息的程式碼砍了
    但我還是有看到echo呀
    他還是會回傳資料

  70. 我剛剛測試過好像是api版本的問題
    10以下是正常的
    但是之後就會出問題
    請問有解嗎?

  71. http://stackoverflow.com/questions/14099880/httpresponse-execute-works-only-on-android-api-8-and-api-10
    我找到這篇,修改之後就能運作了,雖然看不台董原理
    版主回覆:(07/03/2013 01:03:53 PM)
    您的網址它上面有寫,我大致翻譯一下
    1) Don’t write network call in Main UI Thread, Use Async Task for that.
    不要寫網路的Method在主執行緒,因為這樣主執行緒就有可能超過5秒,被系統刪掉
    這也就是我文章裡一再提到的
    2) Write below code into your MainActivity file after setContentView(R.layout.activity_main); but this is not proper way.
    在onCreate()裡面加入以下的程式碼,但這不是很好的方法
    這個code大致就是把這個檢查給過濾掉
    就算是不正確的寫法也會通過
    謝謝你的補充。

  72. 從 PHP 網頁上抓回來給 Android 的字串,居然無法與 Android 的 String 做 equals?
    echo "成功" → String result 儲存 → result.equals("成功") → false
    嘗試過中文、英文、數值的字串比較,依然無用
    PHP網頁為 UTF-8編碼(無BOM)
    順便一提,我朋友也有弄到這部分,但神奇的是他能equals 我卻不行,一堆人幫我看都看不出所以然,連寫成功的那位朋友都看不出來
    版主回覆:(08/14/2013 12:54:04 PM)
    你有把你的result印出來看看嗎?
    你試試看在PHP那邊開頭加上
    header(‘content-type:text/html;charset=utf-8’);

  73. 請問:
    我的txtMessage=(EditText)findViewById(R.id.txt_message);
    一直出現錯誤 顯示: R cannot be resolved to a variable
    我該怎麼解決呢

  74. 大大我請問一下
    為什麼我跑模擬起的時候會中斷
    我確定我阿帕契有打開
    E/Trace(966): error opening trace file: No such file or directory (2)
    她顯示出來的錯誤(錯誤不只是這一行,因為有點多如果需要其他的錯誤不知道你有沒有信箱我記給你看)

  75. 請教版大:您的範例中只傳送一個欄位,若要傳送多個欄位(有文字也有數字),則原本範例中用來傳用的 txtMessage = (EditText) findViewById(R.id.txt_message); 及 msg = txtMessage.getEditableText().toString(); 該怎麼修改呢?謝謝版大的回覆

  76. 版主您好,
    "
    把寫好程式,取名httpPostTest.php
    把他擺到htdoc底下 (windows)
    "
    不過我找不到htdoc的資料夾(我是用php寫)
    版主回覆:(10/08/2013 01:21:07 PM)
    這路徑會因為你裝不同套apache而有所不同
    就我使用的xampp,預設路徑在
    C:\xampp\htdocs

  77. 版主您好
    想請問不知道為甚麼用電腦手機模擬器可以傳送
    但將APK檔放入手機卻沒辦法傳送
    感謝您

  78. 如果要設立兩個輸入框該怎麼做
    我有回傳回來
    文字1=4444
    文字2=5555
    但跑出data=4444 datb=
    兩秒後變成data=5555 datb=
    它們都只從data輸出而datb沒反應
    不知道該怎麼 改
    版主回覆:(08/13/2014 02:02:17 AM)
    可以參考上面的留言回文
    只要這個
    params.add(new BasicNameValuePair("data", strTxt));
    多加一行
    而不是呼叫二次
    加油

  79. 請問一下
    怎麼把POST的值傳到下一頁的android?

  80. 想請教一下,如何可以釋放連線
    其實是因為我有兩頁都有做連線,但是返回上一頁時
    系統會說很抱歉已停止,請問這該如何解決?

  81. 不好意思請問一下 這可以用來當作Eclipse的雲端資料庫嗎?! 就是資料備份那些的

  82. 你好
    我自己也有做了一個上傳的檔案
    但是我送了一千多筆資料但接收的資料庫只有收到1X筆
    想請教一下原因

  83. 請問版大,如果在HttpResponse httpResponse = httpclient.execute(method);
    這行被丟出例外,是不是有可能為連結超時的問題呢?
    如果是連結超時的問題,可能的狀況又有哪些呢?

  84. 請問一下 為什麼我import org.apache.http那幾段全部都是紅字的呢?

  85. 請問怎麼用PHP的語法撈資料然後顯示在android studio上?

留言功能已關閉。