你我都是Android專家

 

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">

<html xmlns="http://www.w3.org/1999/xhtml">


<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開發範例大全 佘志龍等人著
悅知文化

創作者介紹

清新下午茶

Johnny 鋼鍊 發表在 痞客邦 PIXNET 留言(108) 人氣()


留言列表 (108)

發表留言
  • 張文瑋
  • 請問一下~
    我的apk有跑出那個toast
    這樣是不是代表我有把東西傳到目標的網頁

    如果是的話~
    網頁那邊要怎麼顯示出來
    我按重新整理也沒有東西出現= =

    ps:PHP初初初學者= =
  • data=
    它的後面有沒有接東西?

    網頁有送資料過去才會出現data=後面才會出現東西

    當然要配合網頁伺服器摟

    Johnny 鋼鍊 於 2011/05/12 20:46 回覆

  • 張文瑋
  • 沒有耶= =
    網頁那端只有
    data=
    後面沒了= =

    但apk有跑出toast
    data=yyy
    (我傳yyy)
    這不是代表有傳過去嗎?
  • 有傳過去

    你可以用"延伸"的標題上面的html原始碼測試
    你直接看的話,是沒有傳資料過去的
    那就是只會有data=

    Johnny 鋼鍊 於 2011/05/12 20:49 回覆

  • 張文瑋
  • 呃~我現在是在學校實驗室測試的
    實驗室有防火牆~
    跟這不知道有沒有關係
    不過如果toast是代表有傳過去的話
    就應該跟防火牆無關= =
  • 1. 要測試防火牆的話,要從防火牆外面做瀏覽測試
    當然要有一個對外IP,且有設定例外

    2. 如果有收到資料的話,加上資料庫的處理程式碼 (sql下Insert ...)
    就可以處理資料庫了

    Android這邊就像是一個
    只會傳特定資料
    和 "看得懂" 特定資料的瀏覽器

    網址的部分你也可以直接改成別的
    假設是google.com
    toast就會跳出網頁的原始碼

    Johnny 鋼鍊 於 2011/05/12 20:56 回覆

  • 張文瑋
  • 我剛才拿您說的html測測看了
    有顯示data=yyy
    您真內行!!!

    那如果我想要用apk丟值出來
    然後網頁重新整理就可以看到我丟的值
    這樣是不是一定要有資料庫才可以?
  • 不一定,但也大多會用資料庫


    其它方式的話,如果只是大家都能看到,可以用Application
    生命週期從http服務的啟動到http服務的關閉

    或是用檔案讀寫fopen() fread() fwrite()
    這就要查一下指令怎麼用了

    Johnny 鋼鍊 於 2011/05/12 21:21 回覆

  • Omework Roots
  • 不好意思
    還有就是
    request respone 他們的 再跟 server 互動的方式 邏輯 概念 我不太懂耶 可以解釋一下嗎

    先發出請求
    有了回應 用回應去做 請求 ????
  • 基本上大致是這樣沒錯,所以瀏覽器才會在按下送出後會刷新頁面呀

    其餘的沒講到的細節有,OSI 7層
    因為http走tcp所以會三向交握,建立連線
    假設是登入畫面,在送出帳密後
    PHP等伺服器端程式大多會在伺服器上建立Session
    然後給你一個Session ID
    大概是這樣,如有錯誤煩請指正

    Johnny 鋼鍊 於 2012/03/13 18:52 回覆

  • Omework Roots
  • 先 謝了 有問題再問 哈!!
  • Elaine
  • 已測試成功,非常感謝!
    想請問一下,如果網頁端回傳一個陣列
    手機端該如何接收呢?
  • 可以做成String然後給Android去切
    要不然就是產生XML或json給Android去parse

    Johnny 鋼鍊 於 2011/05/21 16:46 回覆

  • sars200332
  • 你好 雖然不知道在寫什們==因為我是新新新新新手

    在上面的文章我跟著照做
    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">

    抱歉問題很多因為剛接觸程式這部份
    沒學過這個所以看不懂這類的錯誤是什們意思
    ><可以的話麻連您是否哪邊出了錯

    如果資料太大可以寄給我><
    speed0032HOTMAIL .com.tw
  • 從res/layout/main.xml下手
    xx都過了記得要project>clean

    Johnny 鋼鍊 於 2011/05/22 16:57 回覆

  • sars200332
  • ><板大有解嗎?
    真的不知道這幾行錯宰哪!
    麻煩板大一下
    感謝無私分享
  • sars200332
  • 謝謝
    可是我看我的
    res/layout/main.xml裡面都沒出現XX呢!
    要如何下手 不明白
    抱歉真的不太懂 剛摸這個
  • 按ctrl+b就有了
    建議你先研讀版面設計和程式抓控制項的部分
    這篇對你來說太困難了,慢點再看

    Johnny 鋼鍊 於 2011/05/23 14:41 回覆

  • Cris
  • 版大寫得很好優~可是我的跑的程式依然只在手機上出現data=....,就是"印出網路回傳的文字"這部分,在網頁部分(php)還是沒有,我有透過html傳值是成功的,想要問一下是哪裡出了問題?如果想要知道連線有沒有建立成功要怎麼判斷呢??
    感謝喔~~~~
  • html傳值跟android傳值這二者是沒有關係的唷
    不是說html傳值成功,android傳值就會出現
    網頁部分(php)一定不會有,因為你沒有傳值給他

    傳值----是單向的,從Client傳到Server,然後才從Server回傳結果給Client
    這裡只是舉例說你可以"印出網路回傳的文字"

    如果不要印出網路回傳文字,就要從 網頁部分(php) 下手
    調整php程式碼

    有沒有建立成功判斷可以用TCPView程式看看有沒有連進來
    或是抓封包
    所以對初學者比較簡單的方法,還是印出網路回傳的文字
    如果沒有設定錯誤
    就會看到一樣的東西

    Johnny 鋼鍊 於 2011/05/30 14:43 回覆

  • sars200332
  • 請問板大
    如果要了解android的程式再寫些什們
    還有要先讀版面設計+抓控制項的部份
    有哪些書籍是您推薦比較好上手的媽?

    謝謝版大回覆
  • 我先說,我沒有在這裡幫那本書做廣告
    就只是我看過的一些分享
    -------------------
    Google! Android 2手機應用程式設計入門 / 蓋索林(Gasolin)著
    松崗
    封面有個布丁
    這本講的比較淺顯易懂,在版面的部分講得比較多
    其他的就有點少

    -------------------
    Google Android手機APP開發入門 / 趙令文著
    電腦人文化
    封面有個大機器人
    這本是講的比較全面一點
    網路傳輸的範例光碟有漏
    講View的章節有大表列出大部分常用的參數
    以放layout檔居多,比較沒有逐行講解

    -------------------
    Google Android SDK開發範例大全 佘志龍等人著
    悅知文化

    這篇的程式碼有參考這本書
    這本以範例為主,不建議初學者看
    因為會太眼花撩亂
    有部分程式碼寫的有點怪,不過這範圍很全面

    這本書章節更新變成第三版


    -------------------
    前進 Android Market!Google Android SDK 實戰演練
    何孟翰著
    悅知

    這本多加了雲端應用這部分
    相對的基本的版面設計篇幅少了許多


    供您參考


    Johnny 鋼鍊 於 2011/08/03 21:30 回覆

  • sars200332
  • 謝謝板大提供參考
    有問題我再問您 謝謝
  • 訪客
  • 佛心來的教學文,一看就懂,非常清楚!!

    萬分的感激阿~~
  • sars200332
  • 請問版主
    您的
    環境設定!

    參數!
    Android的部份
  • Project Name:隨便取
    Package: com.J_Test.httpPostTest
    建立Activity,名字: main
    勾上Android 2.2 (API 8)

    Johnny 鋼鍊 於 2011/08/16 10:06 回覆

  • likimwo
  • GOOD!!!!GOOD!!!
  • gg
  • 請問我照著上面做之後 當我按下模擬器傳值時 我的程式就會出現異常錯誤會中斷 我確定我 apache 有成功開啟 模擬器IP也更改過 但是還是不行 可以請問大概還有什麼原因會如此嗎?
  • 錯誤訊息是?如果收到500伺服器內部錯誤表示你的PHP有錯
    可以看php_error.log看看

    Johnny 鋼鍊 於 2011/07/10 07:22 回覆

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

    Johnny 鋼鍊 於 2011/07/15 18:18 回覆

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

    Johnny 鋼鍊 於 2011/08/03 21:28 回覆

  • 小猴子
  • 請問android的部分
    按下送出後我會出現NullPointerException

    初步猜測是75行產生例外,弄好久解決不了

    請版大指點迷津
  • 小猴子
  • 找到原因了
    似乎只支援2.x版
  • 專案是用Android 2.2去建的,不確定在2.2版本以下的能不能執行
    但確定的是在2.2以上的版本是可以用的

    再debug看看吧

    Johnny 鋼鍊 於 2011/08/03 21:32 回覆

  • ss40278
  • 1.我從Android傳至網頁,但是網頁收不到傳來直,但是我用網頁去傳,收的到值,不知道是哪裡出錯,Android是可以傳出來,但就是收不到
  • 再試試看吧

    Johnny 鋼鍊 於 2011/08/03 21:31 回覆

  • 訪客
  • 請問若是用IIS的話 APACHE那邊的語法會變嗎?
  • 會,你的語言就不會用PHP了
    可能會改用ASP.net (C#/VB)或ASP
    可以參考ASP的寫法,用Response.write

    Johnny 鋼鍊 於 2011/08/16 10:03 回覆

  • 訪客
  • 你好 我是超級新手 不好意思 有些笨問題想請教一下
    想問一下如何把手機多筆輸入值(ex:id,name,email...)一個按鍵一次存入mysql中的同筆資料
    還有如讀用手機透過php讀取資料庫的資料 謝謝
  • cat
  • 大大不好意思,經過以上測試結果都是成功的
    但是若是要處理回傳值作為判斷的話
    該使用甚麼語法來判斷傳質內容?
    (以下1為PHP回傳直)
    目前小弟測試用result.startsWith("1")
    及result.equals("1")皆無法判別
    還請大大賜教,謝謝!
  • Android的部份.....
    回傳的是String,如果你傳的是數字 可以用Integer.parseInt()
    先初始個預設值,然後parseInt(),接個Exception避免轉換時出錯
    再拿來比對

    Johnny 鋼鍊 於 2011/08/25 21:41 回覆

  • 訪客
  • 您好,想問一下
    如果是將httpPostTest.php 存放在Appserv底下的www可以嗎?有需要改什麼嗎?
  • 直接擺上去即可因為我的範例沒有接資料庫
    需要自己加上

    Johnny 鋼鍊 於 2011/08/25 21:35 回覆

  • 李韻紫
  • 請問httpPostTest.php沒有印出data內容,就是傳值失敗的意思嗎?
    非常感謝~~
  • cat
  • 已解決!! 感謝大大指點

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

  • Hsuan
  • 您好,想請問一下

    我在android端執行,輸入文字後,手機的toast是出現"The operation time out"

    想請問是哪裡出問題了?
    apache確定有開啟
    php也有放到資料夾
    uriAPI 也有改

    是android端程式的問題嗎?
  • 你確定一下uriAPI是不是打成127.0.0.1或localhost?
    可以試試看直接用android的瀏覽器瀏覽看看你打的網頁
    (在php端修改一下,打點字上去,要不然android上會看到一片空白
    因為根本沒有資料輸出呀)
    確定android和伺服器之間溝通良好

    uriAPI不能用127.0.0.1
    因為這樣會指向android自己(不知道懂不懂我的意思)

    Johnny 鋼鍊 於 2011/09/09 13:13 回覆

  • Hsuan
  • 附:網路權限也有設定了
  • 悄悄話
  • 悄悄話
  • 訪客
  • 你好!! 請問若以eclipse實作 伺服器端和httpPostTest的程式該寫在哪個開發工具裡呢 小弟是新新新新手...
  • 訪客
  • 上面的httpPostTest是httpPostTest.htm 不好意思~!
  • 放在apache裡的htdoc裡
    環境的話可以用xampp或是appserv

    Johnny 鋼鍊 於 2011/09/13 15:31 回覆

  • Hsuan
  • 版大您好!

    我的uriAPI是打自己電腦的IP位址,不是打127.0.0.1或localhost
    我也有用android的瀏覽器開我打的網頁,是可以連接的

    我之前是用android2.1版做測試
    現在換成了android2.2版做測試,是沒有出現"The operation timed out"了
    但是現在我輸入文字按送出後,toast是出現"i>>? data=hello"
    資料還是沒有傳過去

    請問版大知道問題出在哪裡嗎?
  • php的部分只是傳過去在印出來給你看
    需要善加修改...加入sql處理insert的部分

    Johnny 鋼鍊 於 2011/09/13 15:32 回覆

  • redbluewhite13
  • Android達人大大~
    哈哈~
    你真的太酷嚕~-XD
    我趕快來刺跨賣~
    超感謝的ㄝ~
  • :目

    Johnny 鋼鍊 於 2011/09/19 22:08 回覆

  • Hsuan
  • 感謝版大
    成功了:)
  • :)

    Johnny 鋼鍊 於 2011/09/19 22:08 回覆

  • Justin
  • 版大您好,
    想請問一下
    為什麼"印出網路回傳的文字"會出現亂碼?

    我在資料庫連線上設定
    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));

    但還是會出現亂碼,請問這是什麼問題呢?
  • 看看資料庫的文字儲存是否為utf8_general_ci
    再來還有PHP檔案的儲存時的編碼
    notepad++打開來看的話應該要是ANSI as UTF-8
    (純英文的文件會顯示ANSI除外)

    Johnny 鋼鍊 於 2011/09/19 22:12 回覆

  • fish
  • 不好意思
    最後面三張圖
    android傳值了之後 伺服端的網頁也會保存值嗎? 會像最後一張圖一樣顯示出來嗎?
    請問你最後的圖是html傳的值還是android傳的值?
  • 伺服端的網頁不會保存值嗎除非你用資料庫把它存起來
    最後一張圖是html傳的值,是測試用
    跟android無關
    -------------------
    倒數第二張是Android用類似瀏覽器的方式傳值
    這張是android傳的值
    跟html無關

    Johnny 鋼鍊 於 2011/09/23 08:40 回覆

  • magicx12
  • 請問如果我想用POST的方法登入YAHOO帳號取得個人網頁資訊該如何實做呢?
  • 這有困難....因為他們會加密

    Johnny 鋼鍊 於 2011/09/28 11:44 回覆

  • Hsuan
  • 版大您好:

    想教您幾個問題,
    我在android端寫http post的方法
    將資料傳到php接收
    再用php把值存入資料庫

    想請問

    我在1.php 寫 session
    在2.php echo出session的值
    這是沒問題的

    但是如果用android端做測試的話
    會抓不到session的值
    請問這個跟android端有關係嗎??
  • 哈哈...被你發現到了
    android是的確有這問題
    不知道你對http連線的原理有沒有很了解?
    伺服器使用session的話,session資料會存在伺服器上(這書上都有寫)

    但是!!!!伺服器會傳一個session id給用戶端
    (像是你去寄放物品的櫃台寄放東西,櫃台會交給你一把鑰匙一樣)
    用鑰匙認顧客

    回到Android.....伺服器有吐這把鑰匙給他,但他並沒有存下
    不信的話你抓封包看看就知道了

    Johnny 鋼鍊 於 2011/09/30 09:44 回覆

  • 悄悄話
  • 劉大凱
  • 在模擬器上面執行
    會出現異常終止......
  • 看DDMS的logcat

    Johnny 鋼鍊 於 2011/10/05 01:07 回覆

  • 訪客
  • 您好!我想請教一個問題
    在android的模擬器上面執行
    結果畫面出現的是
    Connection to http://localhost:8080 refused
    請問是哪個環節出了問題呢?
    請給予指教,謝謝您
  • 網址不能打localhost打實際IP

    Johnny 鋼鍊 於 2011/10/05 01:06 回覆

  • Hung Siu Keung
  • 我想問一下...
    以我理解...大大的文是不是在ANDROID傳DATA去PHP,
    PHP再傳回"data = "另加在android打的字串?
    如果是我想問一下,
    如果將ANDROID的DATA送去PHP,之後用PHP記住DATA的內容...
    好像HTML用POST的方式去PHP頁一樣....
  • 訪客
  • 您好:
    我剛看到上面有人回應說要post到yahoo去登入,我也有相同疑問,只是說我想做的只是用手機登入一般私人網站,那我應該怎麼去撰寫程式碼呢?謝謝
  • Hung Siu Keung
  • 今天再試終於明白,
    原本PHP已經收到了值,
    不過在網頁不能直接出,
    只在ANDROID直接出,
    用PHP的ISSET就看到其實有值在$_post['data']
    真的謝謝大大這個很有用的資訊
  • :)

    Johnny 鋼鍊 於 2012/01/23 15:09 回覆

  • doris79313
  • 我想問一下:
    ANDROID傳DATA去PHP
    為什麼在網頁的部分沒辦法顯示?
  • 請爬文,留言有回覆

    Johnny 鋼鍊 於 2011/10/20 23:58 回覆

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

    Johnny 鋼鍊 於 2012/05/13 23:13 回覆

  • 倉銘
  • 對不起 想請問一下
    如果兩個EditText 在傳遞的時候就必須要自己切嗎 有看到你提到JOSN的方式這個方式有具體的範例嗎??


  • JSON範例,敬請期待。

    Johnny 鋼鍊 於 2012/01/23 14:59 回覆

  • ice
  • 可以問你一下
    伺服器那邊大概要怎麼判斷
    android才能收到我想收到的東西呢...
    因為都會收到PHP echo的全部程式碼
    因為我主要是想要讓Android讀取資料庫的東西
    想收到我指定的東西...
  • 資料庫範例,敬請期待。

    Johnny 鋼鍊 於 2012/01/23 14:59 回覆

  • 訪客
  • 您好:請問我為何會出現"@drawable/icon"錯誤呢?謝謝
  • 新版的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即可

    Johnny 鋼鍊 於 2012/01/23 14:58 回覆

  • 抖抖抖
  • 先謝版主無私的分享

    我有一個問題在取值的部分
    有取到值,但也把原始碼給取了...
    非常煩惱
    環境:ASP.NET
    code:
    Response.Write("回傳值:" + strPost);
  • 朋友使用ASP.net 有遇到像你一樣的問題
    打開aspx的版面設計的原始碼 (會看到很多html語法)

    刪除其html語法只剩下 類似以下的的語法
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestProject01._Default" %>

    不能照樣copy唷,你專案的這一行會跟我的不一樣
    再試試看




    Johnny 鋼鍊 於 2012/01/23 15:09 回覆

  • ㄚ豪
  • 可以提供JSP網頁語法嗎?
    目前我的JSP網頁顯示不出來我的資料
    拜託! 可以幫幫我嗎?
  • 抖抖抖
  • 非常感謝版主的答案

    解決了
  • J
  • 您好,感謝您的分享

    如果角色對換,也就是 Server端: Android, 該如何實作?
  • 好酷的功能唷!
    我想這就要手動寫Socket了吧
    模擬Apache伺服器的運作
    學它一樣,收HTTP標頭,然後吐HTTP檔頭+內容回去
    寫的時候要用writeByte()

    改天有點空閒來寫這個範例

    Johnny 鋼鍊 於 2012/05/13 23:18 回覆

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

    Johnny 鋼鍊 於 2012/05/13 23:12 回覆

  • dadaliu
  • 請問如果是HTTPS而不是HTTP
    好像需要認證
    該怎改寫?
    謝謝板大!!
  • HTTPS很難處理,小弟也在突破中

    Johnny 鋼鍊 於 2012/05/13 23:15 回覆

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

    Johnny 鋼鍊 於 2012/05/13 23:21 回覆

  • KZ
  • 真是佛心來的分享~一次到位~謝謝Johnny,
    如果想要主動由PHP吐字串給android,有什麼作建議呢?
  • 可以循環地向伺服器抓呀,這樣就會好像PHP吐字串給Android了

    Johnny 鋼鍊 於 2012/05/13 23:14 回覆

  • KZ
  • PHP是否也有能力,能觸發android ap去接受字串呢?
  • Daniel
  • 請問Server端用JSP該怎麼寫才和您的範例會有一樣的效果呢?
    我用的是Android 2.1版
    Server回傳時,連JSP中的換行符號會都顯示在模擬器中的訊息螢幕
  • 最近比較忙,還沒有把JSP環境架設起來
    可否你提供你的寫法給我研究一下呢?

    Johnny 鋼鍊 於 2012/06/26 11:29 回覆

  • 阿佘
  • 大大你好

    我用你的方法傳送參數到我指定的asp網頁
    但是這樣只能知道有無接收成功
    我需要的功能是在網頁顯示出傳送完的結果(前面做的是登入的動作)

    該怎麼實現呢?
  • 可以參考新版,有加上資料庫
    http://j796160836.pixnet.net/blog/post/30577968

    Johnny 鋼鍊 於 2012/06/26 11:31 回覆

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

    Johnny 鋼鍊 於 2012/06/27 23:12 回覆

  • 悄悄話
  • 悄悄話
  • Daniel
  • Johnny大
    我已經把Server上的問題解決了!
    感謝您熱心提供經驗。
  • JS
  • 您好,
    我是傳值到PHP上然後回傳字串給android
    但是我想依照那字串做換頁的動作,可是好像無法去判斷成功
    我在
    if(result != null)
    {
    if(result=="回傳成功")
    { memberok();
    }}
    但是他都不會成功執行result=="回傳成功"這判斷式
    我也有用一個TextView查看result,的確是回傳成功的字串沒錯
    請問我該如何修改才能判斷字串
  • 這是字串的位址(address)和值的差別
    物件類的(包含string)在內,要比較相同值用.equals()
    你可能要找些Java相關的書籍來看
    if(result=="回傳成功")
    改成
    if(result.equals("回傳成功"))

    Johnny 鋼鍊 於 2012/07/07 09:37 回覆

  • kokoala1027
  • 您好
    我在寫一個註冊的部分
    流程大概是註冊(android) -> 寫入資料庫(php)
    這部分沒什麼問題
    但是在修改資料的時候取值就發生錯誤了
    在取得之前註冊的資料(php從資料庫撈出來傳給android)的時候
    取的值好像跟之前的不一樣(不是亂碼的問題,表面上看起來一樣)
    但是我用php回傳的值做mysql搜尋會找不到那筆資料

    想請問是php回傳時的問題嗎?
    google很久了都找不太到解決的方法QAQ
    感謝版主
  • 可能我有點看不懂你敘述的方式,跟您分享一些debug上的技巧
    取得之前註冊的資料(php從資料庫撈出來傳給android)
    1. 這一段可以用瀏覽器去模擬Android去收php出來的資料
    (光憑肉眼看html不準,要開原始碼來看)
    2. 你可以試印看看當初查找的sql語法,把他丟進phpmyadmin看有沒有甚麼異狀
    3. 至於編碼呢...剩下一個可能,Big5和UTF-8和Unicode的問題 (印象中好像是字碼不一樣),有個重點,UTF-8和Unicode感覺好像是一樣的,但其實不一樣 (曾經遇過類似的問題)

    Johnny 鋼鍊 於 2012/07/08 23:39 回覆

  • Tree
  • 請問
    從模擬器按下送出鍵之後,要在Toast看到輸入的值,並且在php網頁上看到財表示有輸入進去嗎?
    我做出來是Toast跟php都沒看到輸入的值,但試用html就有看到

    這些輸入的值是都會輸入到mysql資料庫嗎?
    那可以從資料庫看到嗎?
    謝謝:)
  • 疑問
  • 請問是否有提供JSP接收的語法呢?!
  • 張國源
  • 請問一下~如果說~我的填寫控格有2個以上~我不管怎麼測試!!

    他都以data這個變數存取我的所有空格資料(我有在新增新的變數進去存資料)

  • 可能是Android在列印的時候是data=XXXX
    所以會誤認,查看看PHP的部份

    Johnny 鋼鍊 於 2012/10/25 11:29 回覆

  • 小郭
  • 大大你好
    我的這行
    sendBtn.setOnClickListener(this);他一職是錯誤
    有顯示這行
    The method setOnClickListener(View.OnClickListener) in the type View is not
    applicable for the arguments (MainActivity)
  • 你在import的時候,選到了
    import android.content.DialogInterface.OnClickListener;
    那個是給Dialog用的唷,正確的是
    import android.view.View.OnClickListener;
    平平都是OnClickListener,同款不同師傅XD

    Johnny 鋼鍊 於 2012/09/27 09:57 回覆

  • 悄悄話
  • 悄悄話
  • 悄悄話
  • 悄悄話
  • francy
  • 抓下來的資料是中文的,在手機顯示出來卻是"???"號!
    如何解決?
  • francy
  • MySQL資料庫設定校正: utf8_unicode_ci
  • ss
  • 為什麼一案送出程式就會停止?
  • 顏振翔
  • 版大您好,我有個問題想請教,我從android上按下送出文字,怎麼讓他轉到網上,顯示我剛剛在textView上打的文字呢?
    這個有提到嗎?
  • 苦惱的人
  • 不好意思,想請問一下。
    我的網站適用ASP.NET架設的,
    依照你的方法的確可以抓到手機端DATA的值。
    但是我想問你,
    有辦法將<%%>內抓取到的值(例如 你上面程式碼request.form的值data)
    放到我UI介面Label中嗎? (如 Label.text=data的值)
    因為小弟是新手,
    所以想請幫忙解惑。
  • 寫個Handler然後把資料放上去
    詳細請參考另一篇
    http://j796160836.pixnet.net/blog/post/28766165

    Johnny 鋼鍊 於 2013/07/04 15:43 回覆

  • Gohome
  • 我用範例程式碼
    在手持裝置上會出現亂碼
    後來把
    String strResult = EntityUtils.toString(httpResponse.getEntity());
    改成
    String strResult = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);
    就好了

    原因應該是只有送訊息是UTF8
    取回訊息也應要使用UTF8
  • 感謝Gohome大大分享指正

    Johnny 鋼鍊 於 2012/12/23 18:49 回覆

  • 訪客
  • 請問一下我Android手機模擬器可以把資料傳到資料庫去
    但是我放到手機裡為什麼就會當機?
  • 用DDMS的Logcat抓Log出來研究研究...

    Johnny 鋼鍊 於 2012/12/24 01:44 回覆

  • 訪客
  • <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;}
    超長的
    這是什麼意思?
  • html原始碼...建議找網頁語法相關的文章來看
    http://www.powmo.com/

    Johnny 鋼鍊 於 2012/12/29 11:05 回覆

  • KK
  • 大大您好:請教一下是否可以SHARE上面一直在變胖變廋的android機器人,
    好可愛哦
  • 連我的招牌你也要?
    好吧拿去吧

    <embed src="http://www.android.com/swf/conveyor.swf" type="application/x-shockwave-flash" width="100%" height="90">

    Johnny 鋼鍊 於 2013/07/04 15:41 回覆

  • Daniel Chen
  • 先感謝教學,網路上找好久只有你教怎麼送資料

    我碰到的問題有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直接貼上的)

    感恩~
  • 1. 你可能是在網路送出的方法裡面寫上Toast
    因為網路存取是跑在另一個Thread,它不能直接存取主執行緒的資料
    你可以用Handler去解決

    3. 看起來PHP沒什麼問題
    應該問題出在Android那邊比較大
    你說,雖然把回傳回應訊息的程式碼砍了
    但我還是有看到echo呀
    他還是會回傳資料

    Johnny 鋼鍊 於 2013/07/03 21:10 回覆

  • Daniel Chen
  • 我剛剛測試過好像是api版本的問題
    10以下是正常的
    但是之後就會出問題
    請問有解嗎?
  • Daniel Chen
  • http://stackoverflow.com/questions/14099880/httpresponse-execute-works-only-on-android-api-8-and-api-10
    我找到這篇,修改之後就能運作了,雖然看不台董原理

  • 您的網址它上面有寫,我大致翻譯一下
    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大致就是把這個檢查給過濾掉
    就算是不正確的寫法也會通過

    謝謝你的補充。

    Johnny 鋼鍊 於 2013/07/03 21:03 回覆

  • Nastu
  • 從 PHP 網頁上抓回來給 Android 的字串,居然無法與 Android 的 String 做 equals?
    echo "成功" → String result 儲存 → result.equals("成功") → false

    嘗試過中文、英文、數值的字串比較,依然無用
    PHP網頁為 UTF-8編碼(無BOM)

    順便一提,我朋友也有弄到這部分,但神奇的是他能equals 我卻不行,一堆人幫我看都看不出所以然,連寫成功的那位朋友都看不出來
  • 你有把你的result印出來看看嗎?
    你試試看在PHP那邊開頭加上
    header('content-type:text/html;charset=utf-8');

    Johnny 鋼鍊 於 2013/08/14 20:54 回覆

  • Rita
  • 請問:
    我的txtMessage=(EditText)findViewById(R.id.txt_message);
    一直出現錯誤 顯示: R cannot be resolved to a variable
    我該怎麼解決呢
  • 淼
  • 大大我請問一下
    為什麼我跑模擬起的時候會中斷
    我確定我阿帕契有打開
    E/Trace(966): error opening trace file: No such file or directory (2)
    她顯示出來的錯誤(錯誤不只是這一行,因為有點多如果需要其他的錯誤不知道你有沒有信箱我記給你看)
  • 不理不理包子
  • 請教版大:您的範例中只傳送一個欄位,若要傳送多個欄位(有文字也有數字),則原本範例中用來傳用的 txtMessage = (EditText) findViewById(R.id.txt_message); 及 msg = txtMessage.getEditableText().toString(); 該怎麼修改呢?謝謝版大的回覆
  • #很頭痛#
  • 版主您好,
    "
    把寫好程式,取名httpPostTest.php
    把他擺到htdoc底下 (windows)
    "

    不過我找不到htdoc的資料夾(我是用php寫)
  • 這路徑會因為你裝不同套apache而有所不同
    就我使用的xampp,預設路徑在
    C:\xampp\htdocs

    Johnny 鋼鍊 於 2013/10/08 21:21 回覆

  • 太奇怪了
  • 版主您好
    想請問不知道為甚麼用電腦手機模擬器可以傳送
    但將APK檔放入手機卻沒辦法傳送

    感謝您
  • 力學 道
  • 如果要設立兩個輸入框該怎麼做
    我有回傳回來
    文字1=4444
    文字2=5555
    但跑出data=4444 datb=
    兩秒後變成data=5555 datb=
    它們都只從data輸出而datb沒反應
    不知道該怎麼 改
  • 可以參考上面的留言回文
    只要這個
    params.add(new BasicNameValuePair("data", strTxt));
    多加一行

    而不是呼叫二次
    加油

    Johnny 鋼鍊 於 2014/08/13 10:02 回覆

  • 阿傑 黃
  • 請問一下
    怎麼把POST的值傳到下一頁的android?
  • 小書庫
  • 想請教一下,如何可以釋放連線
    其實是因為我有兩頁都有做連線,但是返回上一頁時
    系統會說很抱歉已停止,請問這該如何解決?
1 2
找更多相關文章與討論