Androidアプリ開発 ボタン押してデータ送信を行うアプリ作成について
受付中
回答 1
投稿 ・編集
- 評価
- クリップ 2
- VIEW 3,991
現在、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;
}
});
}
}
ボタンを押した後の処理を、テキストボックスに表示したデータを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
コードとログを見てみました。
ログを見るとネットワーク通信時のエラーが出力されています。
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などでネットワーク通信周りを自作で書くと大変勉強になるのですが、細かいキャッシュの処理が面倒だったりキャンセル処理が大変だったりで、ライブラリを探すのも良いと思います。
参考になれば〜
ログを見るとネットワーク通信時のエラーが出力されています。
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%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる