質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.20%

Androidアプリ開発 ボタン押してデータ送信を行うアプリ作成について

受付中

回答 1

投稿 ・編集

  • 評価
  • クリップ 2
  • VIEW 3,991

s.kirishiba

score 14

現在、NFCで読み込んだTextをGAEのデータストアに送信・保存を行うAndroidアプリを作成しています。
ボタンを押した後の処理を、テキストボックスに表示したデータをGAEのデータストアに送信したいのですが、どのように構成したらいいのかよくわかりません。どなたか、詳しくわかる方詳しく載っているサイトを知っていたらご教授お願いします!!
ちなみにアプリの作成には、「eclipse4.4Luna」を使用しています。また、下記の2サイトを参考に切ったり貼ったりしながら作りました。
参考の2サイト↓
http://noboru.hatenablog.jp/entry/20110818/13136 …
http://blog.5ive.info/archives/1040
以下は、MainActivity・androidmanifestのソースコードです。
ボタン取得とボタンの処理の間にNFCの読み込みを入れています。
ボタンの取得まではできているものの、そこからのボタンの処理ができません。ボタンの処理に、GAEへのデータ送信処理を入れてみたんですが、起動してボタンを押しても「問題が発生したため『アプリケーション名』を終了します。」と出てきてしまい、正しくボタン操作ができていないのが現状です。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.nfcsampleapp"
    android:versionCode="1"
    android:versionName="1.0" >
<!-- Playストア配信時にNFC対応端末にだけアプリが表示される -->
    <uses-feature
        android:name="android.hardware.nfc"
        android:required="true" />

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



    <!-- NFCを利用するためのパーミッション -->
    <uses-permission android:name="android.permission.NFC" />

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" android:debuggable="true" android:killAfterRestore="true">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >

           <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>


            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:mimeType="*/*" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="http" />
                <data android:scheme="https" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.nfc.action.TECH_DISCOVERED"/>
            </intent-filter>

            <meta-data
                android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/nfc_filter" />



        </activity>
    </application>

</manifest>



MainActivity.java

package com.example.nfcsampleapp;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.io.*;
import java.net.URL;
import java.net.HttpURLConnection;
import java.nio.charset.StandardCharsets;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
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.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.os.Parcelable;
import android.content.Intent;
import android.widget.Button;
import android.widget.TextView;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View.OnClickListener;
import android.widget.Toast;
import android.view.*;

import com.example.nfcsampleapp.R.id;



public class MainActivity extends Activity {

    private static final String URI = "http://morilabsuzukipample04.appspot.com/";
    private NfcAdapter mNfcAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        //buttonを取得
        Button btn1 = (Button)findViewById(R.id.touroku);
        Button btn2 = (Button)findViewById(R.id.search);

        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);

        TextView text = (TextView)findViewById(R.id.point);


        // インテントの取得
        Intent intent = getIntent();

        //NFCシールからのアクセスかチェック
        String action = intent.getAction();
        if (action.equals((NfcAdapter.ACTION_NDEF_DISCOVERED))) {

        //Ndefメッセージの取得
        Parcelable[] raws = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        NdefMessage[] msgs = new NdefMessage[raws.length];


        String str = "";
        for (int i=0; i<raws.length; i++) {
            msgs[i] = (NdefMessage)raws[i];

            for (NdefRecord record : msgs[i].getRecords()) {

            //payloadを取得
            byte[] payload = record.getPayload();

            //payloadが空白ならブレイク
            if (payload == null) break;

            int idx = 0;

            for(byte data : payload) {

            if(idx > 2){
            str += String.format("%c", data);
            }
            idx++;
            }
            }
            }

            text.setText(str);


        }


        btn1.setOnClickListener(new OnClickListener() {
            @SuppressWarnings("unused")
            @Override
            public void onClick(View v1) {
                // ボタンがクリックされた時に呼び出されます
                Button btn1 = (Button) v1;

                String nam = "R.id.nam";
                String name = "R.id.name";
                String lec = "R.id.lec";
                String point = "R.id.point";

                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost (URI);

                List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(1);
                nameValuePair.add(new BasicNameValuePair("str", nam));
                nameValuePair.add(new BasicNameValuePair("str", name));
                nameValuePair.add(new BasicNameValuePair("str", lec));
                nameValuePair.add(new BasicNameValuePair("str", point));
                try
                {
                    //-----[POST送信]
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePair,"UTF-8"));
                    HttpResponse response = httpclient.execute(httppost);
                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();



                }

               catch (UnsupportedEncodingException e)
                {
                    e.printStackTrace();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }



           }




        });


        btn2.setOnClickListener(new OnClickListener() {
         // このメソッドがクリック毎に呼び出される
         public void onClick(View v) {
             // ここにクリックされたときの処理を記述
             Button btn2 = (Button) v;


         }
     });
 }

}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

コードとログを見てみました。

ログを見るとネットワーク通信時のエラーが出力されています。
02-03 10:03:12.629: E/AndroidRuntime(16182): android.os.NetworkOnMainThreadException
ですね

Androidは、3.0以上から非同期でネットワーク通信を行わないとエラーで出る仕様になりました。

http://blog.5ive.info/archives/1040
を参考にした場合、OS 2.3などでは正常に動作しますが、3.0以上だとエラーになってしまいます。

Android NetworkOnMainThreadExceptionやAndroid AsyncTaskやAndroid 非同期通信などでググると非同期でネットワーク通信を行う記事が沢山でると思います。
AsyncTaskという非同期が行えるクラスがあるので、それを使うのが一般的ですね。

またAsyncTaskなどでネットワーク通信周りを自作で書くと大変勉強になるのですが、細かいキャッシュの処理が面倒だったりキャンセル処理が大変だったりで、ライブラリを探すのも良いと思います。

参考になれば〜

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る