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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

3440閲覧

Android アプリ 実行エラー

kt3302y

総合スコア27

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/01/10 02:38

編集2016/01/14 03:24

Android Studioを使用してチャットクライアントアプリを作成しています.
使用としてはサーバーのIPアドレスとポート番号を入力してConnectボタンをクリックするとサーバーに接続とチャット受信を行い,送信ボタンはテキストに入力されたメッセージをサーバーに送信する役割を担っています.
メッセージを送信できない問題が発生しました.

これは何が原因で起こっているものなのでしょうか
教えてください.
参考までにソースコードなども載せておきます.

MainActivity.java

1import android.os.Bundle; 2import android.support.design.widget.FloatingActionButton; 3import android.support.design.widget.Snackbar; 4import android.support.v7.app.AppCompatActivity; 5import android.support.v7.widget.Toolbar; 6import android.view.View; 7import android.view.Menu; 8import android.view.MenuItem; 9import android.widget.Button; 10import android.widget.EditText; 11import android.widget.TextView; 12import android.widget.Toast; 13 14public class MainActivity extends AppCompatActivity 15 implements ChatConnectTask.ChatConnectTaskCallback,ChatSendTask.ChatSendTaskCallback{ 16 17 private ChatConnectTask connectTask; 18 private ChatSendTask sendTask; 19 private EditText inputIP; 20 private EditText inputPort; 21 private EditText inputMessage; 22 private TextView viewChat; 23 private Button buttonConnect; 24 private Button buttonSend; 25 private String param1; 26 private int param2; 27 private String param3; 28 private View view; 29 30 31 @Override 32 protected void onCreate(Bundle savedInstanceState) { 33 super.onCreate(savedInstanceState); 34 setContentView(R.layout.activity_main); 35 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 36 setSupportActionBar(toolbar); 37 38 inputIP = (EditText)findViewById(R.id.inputIP); 39 inputPort = (EditText)findViewById(R.id.inputPort); 40 inputMessage = (EditText)findViewById(R.id.inputMessage); 41 buttonConnect = (Button)findViewById(R.id.buttonConnect); 42 buttonSend = (Button)findViewById(R.id.buttonSend); 43 viewChat = (TextView)findViewById(R.id.viewChat); 44 45 FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 46 fab.setOnClickListener(new View.OnClickListener() { 47 @Override 48 public void onClick(View view) { 49 Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 50 .setAction("Action", null).show(); 51 } 52 }); 53 } 54 55 //connectボタンでソケット接続&メッセージ受信 56 public void handleButtonConnectAction(View view){ 57 String param1 = inputIP.getText().toString(); 58 int param2 = Integer.parseInt(inputPort.getText().toString()); 59 Param param = new Param(param1,param2); 60 connectTask = new ChatConnectTask(this); 61 connectTask.execute(param); 62 } 63 //送信ボタンでメッセージを送信 64 public void handleButtonSendAction(View view){ 65 param3 = inputMessage.getText().toString(); 66 Param param = new Param(param1,param2,param3); 67 sendTask = new ChatSendTask(this); 68 sendTask.execute(param); 69 } 70 71 @Override 72 public boolean onCreateOptionsMenu(Menu menu) { 73 // Inflate the menu; this adds items to the action bar if it is present. 74 getMenuInflater().inflate(R.menu.menu_main, menu); 75 return true; 76 } 77 78 @Override 79 public boolean onOptionsItemSelected(MenuItem item) { 80 // Handle action bar item clicks here. The action bar will 81 // automatically handle clicks on the Home/Up button, so long 82 // as you specify a parent activity in AndroidManifest.xml. 83 int id = item.getItemId(); 84 85 //noinspection SimplifiableIfStatement 86 if (id == R.id.action_settings) { 87 return true; 88 } 89 90 return super.onOptionsItemSelected(item); 91 } 92 93 @Override 94 public void onPreExecute() { 95 96 } 97 98 @Override 99 public void onProgressUpdate(String... message) { 100 viewChat.setText(message[0].toString()); 101 } 102 103 @Override 104 public void onPostExecute(String result) { 105 Toast.makeText(this,result,Toast.LENGTH_LONG); 106 } 107} 108

ChatConnectTask.java

1 2import android.os.AsyncTask; 3 4import java.io.DataInputStream; 5import java.io.DataOutputStream; 6import java.io.IOException; 7import java.io.InputStream; 8import java.io.OutputStream; 9import java.net.InetSocketAddress; 10import java.net.Socket; 11 12/** 13 */ 14public class ChatConnectTask extends AsyncTask<Param,String,String > { 15 private ChatConnectTaskCallback mCallback; 16 private Param param = new Param(); 17 18 public ChatConnectTask(ChatConnectTaskCallback callback){ 19 20 this.mCallback = callback; 21 } 22 23 24 25 26 @Override 27 protected void onPreExecute(){ 28 if(mCallback != null) 29 mCallback.onPreExecute(); 30 } 31 32 protected String doInBackground(Param... param){ 33 34 String server = param[0].param1; 35 // Server Portからポート番号を取得 36 int port = param[0].param2; 37 38 Socket socket = null; 39 try { 40 // ソケットを作成 41 socket = new Socket(); 42 // 指定されたホスト名(IPアドレス)とポート番号でサーバに接続する 43 socket.connect(new InetSocketAddress(server, port)); 44 while(socket != null) { 45 // 接続されたソケットの入力ストリームを取得し,データ入力ストリームを連結 46 InputStream is = socket.getInputStream(); 47 DataInputStream dis = new DataInputStream(is); 48 49 50 // データの受信 51 String receiveMessage = dis.readUTF(); 52 //受信したデータに改行をつけてメッセージを追加していく 53 String showMessage = receiveMessage + "\r\n"; 54 // 受信したデータを表示 55 56 publishProgress(showMessage); 57 } 58 59 60 } catch (Exception e) { 61 e.printStackTrace(); 62 } finally { 63 // ソケットをクローズする 64 if (socket != null) { 65 try { 66 socket.close(); 67 } catch (IOException e) {} 68 } 69 } 70 71 return "チャットを終了します"; 72 } 73 74 @Override 75 protected void onProgressUpdate(String... message){ 76 if(mCallback != null) 77 mCallback.onProgressUpdate(message); 78 } 79 80 @Override 81 protected void onPostExecute(String result ){ 82 if(mCallback != null) { 83 mCallback.onPostExecute(result); 84 } 85 } 86 87 88 public interface ChatConnectTaskCallback{ 89 void onPreExecute(); 90 void onProgressUpdate(String... message); 91 void onPostExecute(String result); 92 } 93} 94

ChatSendTask.java

1package jp.ac.id140441007_meijo_u.task81; 2 3 4import android.os.AsyncTask; 5 6import java.io.DataOutputStream; 7import java.io.IOException; 8import java.io.OutputStream; 9import java.net.InetSocketAddress; 10import java.net.Socket; 11 12/** 13 * Created by 大嗣 on 2016/01/07. 14 */ 15public class ChatSendTask extends AsyncTask<Param,String,String > { 16 private ChatSendTaskCallback mCallback; 17 private Param param = new Param(); 18 19 public ChatSendTask(ChatSendTaskCallback callback){ 20 21 this.mCallback = callback; 22 } 23 24 25 26 27 @Override 28 protected void onPreExecute(){ 29 if(mCallback != null) 30 mCallback.onPreExecute(); 31 } 32 33 protected String doInBackground(Param... param){ 34 35 String server = param[0].param1; 36 // Server Portからポート番号を取得 37 int port = param[0].param2; 38 39 Socket socket = null; 40 try { 41 // 指定されたホスト名(IPアドレス)とポート番号でサーバに接続する 42 socket.connect(new InetSocketAddress(server, port)); 43// 接続されたソケットの入力ストリームを取得し,データ入力ストリームを連結 44 OutputStream os = socket.getOutputStream(); 45 DataOutputStream dos = new DataOutputStream(os); 46// テキストフィールドの文字を取得 47 String sendMessage = param[0].param3; 48 49 dos.write(sendMessage.getBytes()); 50 dos.flush(); 51 52 53 } catch (Exception e) { 54 e.printStackTrace(); 55 } finally { 56 // ソケットをクローズする 57 if (socket != null) { 58 try { 59 socket.close(); 60 } catch (IOException e) {} 61 } 62 } 63 64 return "メッセージを送信しました"; 65 } 66 67 @Override 68 protected void onProgressUpdate(String... message){ 69 if(mCallback != null) 70 mCallback.onProgressUpdate(message); 71 } 72 73 @Override 74 protected void onPostExecute(String result){ 75 if(mCallback != null) { 76 mCallback.onPostExecute(result); 77 } 78 } 79 80 81 public interface ChatSendTaskCallback{ 82 void onPreExecute(); 83 void onProgressUpdate(String... message); 84 void onPostExecute(String result); 85 } 86}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2016/01/10 03:13 編集

デバッグで実行しているならエラーメッセージがLogcatに出ているはずですので、それを貼ってください。
kt3302y

2016/01/11 07:44

載せたかったのですが文字数制限のため,載せることができませんでした. ayumuさんのコメント返信に投稿しましたので,よろしくお願いします
guest

回答2

0

ベストアンサー

java.lang.IllegalStateException: Could not find method handleButtonConnectAction(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'buttonConnect'

エラーの根源の原因はどうやらこれのようです。
handleButtonConnectAction(View)というメソッドが見つからないと言っているようです。

投稿2016/01/11 14:34

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kt3302y

2016/01/11 15:49

そうゆう原因だったんですか! その関数は作成したはずなんですけど,設定の仕方がおかしいのでしょうか
kt3302y

2016/01/12 01:21

protect修飾子をpublicに変更したらできました 教えていただきありがとうございます
guest

0

みたところ送信するソケットをflushしていないですね

os.flush();を実行してみてください

投稿2016/01/10 02:44

編集2016/01/10 02:50
ayumu

総合スコア86

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kt3302y

2016/01/10 02:55

UIで処理を行わないためにtaskクラスでasynctaskを継承したのを使用して,taskで処理しているはずなのですが,これではだめなのでしょうか
ayumu

2016/01/10 09:10

たしか、送信する際にwriteだけだと送信されなかった気がします それとしっかりとパーミッションを追加していますか? AndroidManifestに <uses-permission android:name="android.permission.INTERNET" /> がありますか?
kt3302y

2016/01/11 07:40

dos.flush()とパーミッションの追加を行ったのですが,改善されません. エラー内容としてはこのように出るのですがどういうことなのでしょうか 01-11 07:36:31.280 2199-2199/jp.ac.id140441007_meijo_u.task81 E/AndroidRuntime: FATAL EXCEPTION: main 01-11 07:36:31.280 2199-2199/jp.ac.id140441007_meijo_u.task81 E/AndroidRuntime: Process: jp.ac.id140441007_meijo_u.task81, PID: 2199 01-11 07:36:31.280 2199-2199/jp.ac.id140441007_meijo_u.task81 E/AndroidRuntime: java.lang.IllegalStateException: Could not find method handleButtonConnectAction(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'buttonConnect' 01-11 07:36:31.280 2199-2199/jp.ac.id140441007_meijo_u.task81 E/AndroidRuntime: at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:307) 01-11 07:36:31.280 2199-2199/jp.ac.id140441007_meijo_u.task81 E/AndroidRuntime: at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:266) 01-11 07:36:31.280 2199-2199/jp.ac.id140441007_meijo_u.task81 E/AndroidRuntime: at android.view.View.performClick(View.java:5198) 01-11 07:36:31.280 2199-2199/jp.ac.id140441007_meijo_u.task81 E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:21147) 01-11 07:36:31.280 2199-2199/jp.ac.id140441007_meijo_u.task81 E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739) 01-11 07:36:31.280 2199-2199/jp.ac.id140441007_meijo_u.task81 E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95) 01-11 07:36:31.280 2199-2199/jp.ac.id140441007_meijo_u.task81 E/AndroidRuntime: at android.os.Looper.loop(Looper.java:148) 01-11 07:36:31.280 2199-2199/jp.ac.id140441007_meijo_u.task81 E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5417) 01-11 07:36:31.280 2199-2199/jp.ac.id140441007_meijo_u.task81 E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 01-11 07:36:31.280 2199-2199/jp.ac.id140441007_meijo_u.task81 E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 01-11 07:36:31.280 2199-2199/jp.ac.id140441007_meijo_u.task81 E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
ayumu

2016/01/11 16:40

handleButtonConnectActionはprotected になっていますね 見た感じ、プログラム内で呼び出していないので、XMLファイルからの直接読み出してる感じでしょうか? もしそうなら、publicじゃないとエラーになると思います
kt3302y

2016/01/12 01:35

そうゆうことだったんですか publicに変更したらできました ありがとうございます dos.flush()としたのですがメッセージが送信できません ChatSendTaskに問題があるのでしょうか
ayumu

2016/01/12 07:40 編集

try文の中を // 指定されたホスト名(IPアドレス)とポート番号でサーバに接続する socket.connect(new InetSocketAddress(server, port)); // 接続されたソケットの入力ストリームを取得し,データ入力ストリームを連結 OutputStream os = socket.getOutputStream(); DataOutputStream dos = new DataOutputStream(os); // テキストフィールドの文字を取得 String sendMessage = param[0].param3; dos.write(sendMessage); dos.flush(); dos.close(); socket.close(); としてみたらできますでしょうか?
kt3302y

2016/01/12 08:05

writeでやるとエラーが起きてしまうのでwriteUTFにしてそれ以外は変更なく実行しましたが,できませんでした
ayumu

2016/01/12 10:03

String sendMessage = param[0].param3; dos.write(sendMessage); を dos.write(param[0].getBytes()); にしたらできますか?
kt3302y

2016/01/12 10:15 編集

getBytes()は自分で作るメソッドですか?
ayumu

2016/01/12 10:18

たしか標準であった気がします
kt3302y

2016/01/12 10:53

このparamは自分で作成したクラスなので存在しないんです. こうゆう場合は何を継承させればよいのでしょうか
ayumu

2016/01/12 11:06

param[0].param3.getBytes()にしたらできると思います
kt3302y

2016/01/12 11:48

やってみましたができませんでした.
ayumu

2016/01/12 12:03

ではtry文の中を // 指定されたホスト名(IPアドレス)とポート番号でサーバに接続する socket.connect(new InetSocketAddress(server, port)); // 接続されたソケットの入力ストリームを取得し,データ入力ストリームを連結 OutputStream os = socket.getOutputStream(); // テキストフィールドの文字を取得 String sendMessage = param[0].param3; os.write(sendMessage.getBytes); os.flush(); os.close(); socket.close(); にしたらできますか?
kt3302y

2016/01/12 12:14

できませんでした 送信を行うメソッドに問題があるのでしょうか
ayumu

2016/01/12 12:38

これで送信は出来ていると思いますが、どのように出来ていないのですか?
kt3302y

2016/01/12 13:13

チャットサーバーはクライアントから送信されたメッセージが表示されるように実装されているのですが,このAndroidアプリは送信してもメッセージがサーバー側で表示されていないためサーバーにメッセージが届いてないかと思われます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問