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

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

ただいまの
回答率

90.47%

  • Java

    16160questions

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

  • Android

    7402questions

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

Android アプリ 実行エラー

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,809

kt3302y

score 19

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

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

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity
        implements ChatConnectTask.ChatConnectTaskCallback,ChatSendTask.ChatSendTaskCallback{

    private ChatConnectTask connectTask;
    private ChatSendTask sendTask;
    private EditText inputIP;
    private EditText inputPort;
    private EditText inputMessage;
    private TextView viewChat;
    private Button buttonConnect;
    private Button buttonSend;
    private String param1;
    private int param2;
    private String param3;
    private View view;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        inputIP = (EditText)findViewById(R.id.inputIP);
        inputPort = (EditText)findViewById(R.id.inputPort);
        inputMessage = (EditText)findViewById(R.id.inputMessage);
        buttonConnect = (Button)findViewById(R.id.buttonConnect);
        buttonSend = (Button)findViewById(R.id.buttonSend);
        viewChat = (TextView)findViewById(R.id.viewChat);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    //connectボタンでソケット接続&メッセージ受信
    public void handleButtonConnectAction(View view){
        String param1 = inputIP.getText().toString();
        int param2 = Integer.parseInt(inputPort.getText().toString());
        Param param = new Param(param1,param2);
        connectTask = new ChatConnectTask(this);
        connectTask.execute(param);
    }
    //送信ボタンでメッセージを送信
    public void handleButtonSendAction(View view){
        param3 = inputMessage.getText().toString();
        Param param = new Param(param1,param2,param3);
        sendTask = new ChatSendTask(this);
        sendTask.execute(param);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onPreExecute() {

    }

    @Override
    public void onProgressUpdate(String... message) {
        viewChat.setText(message[0].toString());
    }

    @Override
    public void onPostExecute(String result) {
        Toast.makeText(this,result,Toast.LENGTH_LONG);
    }
}
import android.os.AsyncTask;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

/**
 */
public class ChatConnectTask extends AsyncTask<Param,String,String > {
    private ChatConnectTaskCallback mCallback;
    private Param param = new Param();

    public ChatConnectTask(ChatConnectTaskCallback callback){

        this.mCallback = callback;
    }




    @Override
    protected void onPreExecute(){
        if(mCallback != null)
            mCallback.onPreExecute();
    }

    protected String doInBackground(Param... param){

        String server = param[0].param1;
        // Server Portからポート番号を取得
        int port = param[0].param2;

        Socket socket = null;
        try {
            // ソケットを作成
            socket = new Socket();
            // 指定されたホスト名(IPアドレス)とポート番号でサーバに接続する
            socket.connect(new InetSocketAddress(server, port));
            while(socket != null) {
                // 接続されたソケットの入力ストリームを取得し,データ入力ストリームを連結
                InputStream is = socket.getInputStream();
                DataInputStream dis = new DataInputStream(is);


                // データの受信
                String receiveMessage = dis.readUTF();
                //受信したデータに改行をつけてメッセージを追加していく
                String showMessage = receiveMessage + "\r\n";
                // 受信したデータを表示

                publishProgress(showMessage);
            }


        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // ソケットをクローズする
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {}
            }
        }

        return "チャットを終了します";
    }

    @Override
    protected void onProgressUpdate(String... message){
        if(mCallback != null)
            mCallback.onProgressUpdate(message);
    }

    @Override
    protected void onPostExecute(String result ){
        if(mCallback != null) {
            mCallback.onPostExecute(result);
        }
    }


    public interface ChatConnectTaskCallback{
        void onPreExecute();
        void onProgressUpdate(String... message);
        void onPostExecute(String result);
    }
}
package jp.ac.id140441007_meijo_u.task81;


import android.os.AsyncTask;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

/**
 * Created by 大嗣 on 2016/01/07.
 */
public class ChatSendTask extends AsyncTask<Param,String,String > {
    private ChatSendTaskCallback mCallback;
    private Param param = new Param();

    public ChatSendTask(ChatSendTaskCallback callback){

        this.mCallback = callback;
    }




    @Override
    protected void onPreExecute(){
        if(mCallback != null)
            mCallback.onPreExecute();
    }

    protected String doInBackground(Param... param){

        String server = param[0].param1;
        // Server Portからポート番号を取得
        int port = param[0].param2;

        Socket socket = null;
        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.getBytes());
            dos.flush();


        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // ソケットをクローズする
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {}
            }
        }

        return "メッセージを送信しました";
    }

    @Override
    protected void onProgressUpdate(String... message){
        if(mCallback != null)
            mCallback.onProgressUpdate(message);
    }

    @Override
    protected void onPostExecute(String result){
        if(mCallback != null) {
            mCallback.onPostExecute(result);
        }
    }


    public interface ChatSendTaskCallback{
        void onPreExecute();
        void onProgressUpdate(String... message);
        void onPostExecute(String result);
    }
}

```

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2016/01/10 12:11 編集

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

    キャンセル

  • kt3302y

    2016/01/11 16:44

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

    キャンセル

回答 2

checkベストアンサー

+3

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/12 00:49

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

    キャンセル

  • 2016/01/12 10:21

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

    キャンセル

0

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/01/10 11:55

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

    キャンセル

  • 2016/01/10 18:10

    たしか、送信する際にwriteだけだと送信されなかった気がします

    それとしっかりとパーミッションを追加していますか?
    AndroidManifestに
    <uses-permission android:name="android.permission.INTERNET" />
    がありますか?

    キャンセル

  • 2016/01/11 16: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)

    キャンセル

  • 2016/01/12 01:40

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

    キャンセル

  • 2016/01/12 10:35

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

    キャンセル

  • 2016/01/12 16: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();
    としてみたらできますでしょうか?

    キャンセル

  • 2016/01/12 17:05

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

    キャンセル

  • 2016/01/12 19:03

    String sendMessage = param[0].param3;
    dos.write(sendMessage);

    dos.write(param[0].getBytes());
    にしたらできますか?

    キャンセル

  • 2016/01/12 19:11 編集

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

    キャンセル

  • 2016/01/12 19:18

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

    キャンセル

  • 2016/01/12 19:53

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

    キャンセル

  • 2016/01/12 20:06

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

    キャンセル

  • 2016/01/12 20:48

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

    キャンセル

  • 2016/01/12 21: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();

    にしたらできますか?

    キャンセル

  • 2016/01/12 21:14

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

    キャンセル

  • 2016/01/12 21:38

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

    キャンセル

  • 2016/01/12 22:13

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

    キャンセル

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

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

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

  • Java

    16160questions

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

  • Android

    7402questions

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