Androidの話で申し訳ありません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
マーチ

Androidの話で申し訳ありません

#1

投稿記事 by マーチ » 9年前

C言語で皆様に大変お世話になりました。恥ずかしながらまた提出期限が過ぎ焦っておりましてまた伺いました。
今回はいきなりeclipseを使って、HTTPリクエストを送信してレスポンスを表⽰する、というアプリの開発を行うことになりました。

時間もなく拾ってきたサンプルを動かして理解しようと試みたのですが、
課題の内容をどう作るのか、「 解決できないかフィールドではありません」というエラーをどう解決させられるのか理解できず困っております。

R.javaに記載するなど、調べて見つけた対策を行ったのですがエラーが残り、実行できない状態です。
コードを書き込ませていただきます。

コード:

package com.example.test;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.ResponseHandler;
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.util.EntityUtils;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class HttptestActivity extends Activity implements OnClickListener {

  private Button btn = null;
  private TextView tv = null;


  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    btn = (Button)findViewById(R.id.btn1);
    tv = (TextView)findViewById(R.id.tv1);

    btn.setOnClickListener(this);
  }


  @Override
  public void onClick(View v) {
    // ボタン押下時
    if( v == btn )
    {
      exec_post();

    }
  }


  // POST通信を実行(AsyncTaskによる非同期処理を使わないバージョン)
  private void exec_post() {

    Log.d("posttest", "postします");
    String ret = "";

    // URL
    URI url = null;
    try {
      url = new URI( "http://10.0.2.2/android_post_test.php" );
      Log.d("posttest", "URLはOK");
    } catch (URISyntaxException e) {
      e.printStackTrace();
      ret = e.toString();
    }

    // POSTパラメータ付きでPOSTリクエストを構築
    HttpPost request = new HttpPost( url );
    List<NameValuePair> post_params = new ArrayList<NameValuePair>();
    post_params.add(new BasicNameValuePair("post_1", "ユーザID"));
    post_params.add(new BasicNameValuePair("post_2", "パスワード"));
    try {
      // 送信パラメータのエンコードを指定
      request.setEntity(new UrlEncodedFormEntity(post_params, "UTF-8"));
    } catch (UnsupportedEncodingException e1) {
      e1.printStackTrace();
    }

    // POSTリクエストを実行
    DefaultHttpClient httpClient = new DefaultHttpClient();
    try {
      Log.d("posttest", "POST開始");
      ret = httpClient.execute(request, new ResponseHandler<String>() {

        @Override
        public String handleResponse(HttpResponse response) throws IOException
        {
          Log.d(
            "posttest", 
            "レスポンスコード:" + response.getStatusLine().getStatusCode()
          );

          // 正常に受信できた場合は200
          switch (response.getStatusLine().getStatusCode()) {
          case HttpStatus.SC_OK:
            Log.d("posttest", "レスポンス取得に成功");

            // レスポンスデータをエンコード済みの文字列として取得する
            return EntityUtils.toString(response.getEntity(), "UTF-8");

          case HttpStatus.SC_NOT_FOUND:
            Log.d("posttest", "データが存在しない");
            return null;

          default:
            Log.d("posttest", "通信エラー");
            return null;
          }

        }
        
      });

    } catch (IOException e) {
      Log.d("posttest", "通信に失敗:" + e.toString());
    } finally {
      // shutdownすると通信できない
      httpClient.getConnectionManager().shutdown();
    }

    // 受信結果をUIに表示
    tv.setText( ret );

  }
}
javaもほとんど経験のない初心者で、きっとこの質問自体簡単で質問するのもおこがましいものかもしれません
ですが、どうかご指摘助言よろしくお願いいたします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: Androidの話で申し訳ありません

#2

投稿記事 by みけCAT » 9年前

マーチ さんが書きました:時間もなく拾ってきたサンプルを動かして理解しようと試みたのですが、
課題の内容をどう作るのか、「 解決できないかフィールドではありません」というエラーをどう解決させられるのか理解できず困っております。

R.javaに記載するなど、調べて見つけた対策を行ったのですがエラーが残り、実行できない状態です。
コードを書き込ませていただきます。
そのまま実機で実行するとフリーズしてしまったので、URLのみを変更して実行したところ、正常にレスポンスが取得出来ました。
「解決できないかフィールドではありません」というエラーは再現できなかったので、プロジェクト全体をアップロードすることはできますか?
アップローダの例:http://www.axfc.net/uploader/

android_post_test.php

コード:

<?php

header("Content-type: text/plain; charset=UTF-8");

echo "POST test\n----------\n";

foreach ($_POST as $key => $value) {
	echo "$key = $value\n";
}
実行環境
サーバー:Windows Vista Home Premium SP2 32ビット / Apache/2.4.9 (Win32)
クライアント:Docomo SC-03D / Android 2.3.6
開発環境:Eclipse 3.7.2
添付ファイル
maati_http.zip
検証に使用したプロジェクト
(935.71 KiB) ダウンロード数: 92 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Androidの話で申し訳ありません

#3

投稿記事 by softya(ソフト屋) » 9年前

R.javaは自動生成されるものなので、resフォルダのlayoutなどをちゃんと作る事が必要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

マーチ

Re: Androidの話で申し訳ありません

#4

投稿記事 by マーチ » 9年前

返信遅くなりすみません!

main以外もちゃんと作らないといけないのですね・・・
難しいです。

プロジェクトごと貼らせていただきます。
よろしければお願いいたします。

test2.rar

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: Androidの話で申し訳ありません

#5

投稿記事 by みけCAT » 9年前

マーチ さんが書きました:プロジェクトごと貼らせていただきます。
よろしければお願いいたします。

test2.rar
ファイルが見つからないようです。
よろしければ再アップロードをお願いします。

別のアップローダの例:http://kie.nu/
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

マーチ

Re: Androidの話で申し訳ありません

#6

投稿記事 by マーチ » 9年前

大変失礼しました!
お願いします

test2.rar

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: Androidの話で申し訳ありません

#7

投稿記事 by みけCAT » 9年前

マーチ さんが書きました:大変失礼しました!
お願いします

test2.rar
そのままだとDLできませんでしたが、URLの最後のスラッシュを取ることでDLできました。
確認してみます。
http://kie.nu/2ca6
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: Androidの話で申し訳ありません

#8

投稿記事 by みけCAT » 9年前

○AndroidManifest.xml
・3行目'<uses-permission android:name="android.permission.INTERNET" />'
 を、6行目" android:versionName="1.0" >"の下に移動する
・18行目の".MainActivity"を".HttptestActivity"に書き換える

○values/string.xml
・btn_labelおよびtemp_textという名前のStringを作成する(内容はそれぞれ"btn_label"、"temp_text"とした)

○HttptestActivity.java
・37行目の"R.layout.main"を"R.layout.activity_main"に書き換える

○その他手元のテスト環境に合わせるための調整

以上の変更を行ったところ、実機での実行とレスポンスの表示に成功しました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

マーチ

Re: Androidの話で申し訳ありません

#9

投稿記事 by マーチ » 9年前

通りました!ありがとうございます!

しかしこの後の課題が正直何をどうすれば良いのかさっぱりわからず・・・
課題の私的見解.jpg
これなのですがどう作れば良いのか理解できず困っております。

下記の、レコードの内容を順に表示するプログラムを使って作成しようと試みたのですが、
どうandroidからの指示をさせて受けるのか、表示させるのか本当にわかりません。

javaもほとんど経験のない初心者がどうしてこんなことやってるんだと考えると思われますが、
ちょっとしたことでも構いません、どうかご指摘助言よろしくお願いいたします。

コード:

<?php

$con = mysql_connect('127.0.0.1', 'root', '1234');
if (!$con) {
  exit('データベースに接続できませんでした。');
}

$result = mysql_select_db('phpdb', $con);
if (!$result) {
  exit('データベースを選択できませんでした。');
}

$result = mysql_query('SET NAMES utf8', $con);
if (!$result) {
  exit('文字コードを指定できませんでした。');
}

$result = mysql_query('SELECT * FROM address', $con);
while ($data = mysql_fetch_array($result)) {
  echo '<p>' . $data['no'] . ':' . $data['name'] . ':' . $data['tel'] . "</p>\n";
}

$con = mysql_close($con);
if (!$con) {
  exit('データベースとの接続を閉じられませんでした。');
}

?>

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: Androidの話で申し訳ありません

#10

投稿記事 by YuO » 9年前

  • Androidからデータを取得するために呼ばれるのであれば,サーバー側,つまりPHPはHTMLでなくJSONやXMLを返すようにすべきです。
  • PHPにおいて,mysql APIの使用は非推奨になっています (PHP 5.5.0以降)。PDOか,mysqliを使用してください (特別な理由がないならPDOを推奨)。
  • mysql APIでも,文字コードの設定にはmysql_queryでSET NAMESするのではなく,mysql_set_charsetを使います。
ちなみに,サーバーアプリがAndroid端末にHTTPリクエストを送信するのはよっぽどの状況だと思います。
通常は,Android端末からのHTTPリクエストに対するレスポンスとしてデータを送信します。

閉鎖

“C言語何でも質問掲示板” へ戻る