ページ 11

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

Posted: 2014年9月26日(金) 00:50
by マーチ
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もほとんど経験のない初心者で、きっとこの質問自体簡単で質問するのもおこがましいものかもしれません
ですが、どうかご指摘助言よろしくお願いいたします。

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

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

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

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

Posted: 2014年9月26日(金) 10:03
by softya(ソフト屋)
R.javaは自動生成されるものなので、resフォルダのlayoutなどをちゃんと作る事が必要です。

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

Posted: 2014年9月28日(日) 15:17
by マーチ
返信遅くなりすみません!

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

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

test2.rar

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

Posted: 2014年9月28日(日) 20:41
by みけCAT
マーチ さんが書きました:プロジェクトごと貼らせていただきます。
よろしければお願いいたします。

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

別のアップローダの例:http://kie.nu/

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

Posted: 2014年9月28日(日) 21:26
by マーチ
大変失礼しました!
お願いします

test2.rar

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

Posted: 2014年9月28日(日) 21:29
by みけCAT
マーチ さんが書きました:大変失礼しました!
お願いします

test2.rar
そのままだとDLできませんでしたが、URLの最後のスラッシュを取ることでDLできました。
確認してみます。
http://kie.nu/2ca6

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

Posted: 2014年9月28日(日) 22:00
by みけCAT
○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"に書き換える

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

以上の変更を行ったところ、実機での実行とレスポンスの表示に成功しました。

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

Posted: 2014年9月29日(月) 00:38
by マーチ
通りました!ありがとうございます!

しかしこの後の課題が正直何をどうすれば良いのかさっぱりわからず・・・
課題の私的見解.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('データベースとの接続を閉じられませんでした。');
}

?>

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

Posted: 2014年9月29日(月) 01:38
by YuO
  • 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リクエストに対するレスポンスとしてデータを送信します。