마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

초보자인데 method 선언이랑 문법적으로 맞는지 모르겠습니다...

0 추천

이상태로 run을 돌리면 소켓 신호를 받는데 buttonif method가 선언된 곳이 없어서 buttonif가 수행되지 않습니다... 그래서 buttonif를 선언하려고 하는데 어떻게 선언해야 하는지와 어디에 해야 하는지 모르겠습니다... 도와주시면 정말 감사드립니다... 제가 자바 배운적이 없이 안드로이드 스튜디오를 하게 되서 엉성한 부분이 너무 많은 것 같아 죄송합니다...

package com.example.eyetraking;

import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;

import android.content.Context;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.gesture.GestureOverlayView;
import android.media.SoundPool;
import android.os.AsyncTask;
import android.provider.MediaStore;
import android.util.Log;
import android.view.KeyEvent;
import android.net.Uri;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.MediaController;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.VideoView;
import android.view.TextureView;
import android.graphics.SurfaceTexture;
import android.view.Surface;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.HashMap;

public class MainActivity extends AppCompatActivity {
    //변수 선언
    Switch eyetrack;
    ConstraintLayout view;
    Button Volup, Voldown;
    Button play, pause, link;
    VideoView Video;
    TextView read_textView;
    private Socket client;
    private DataOutputStream dataOutput;
    private DataInputStream dataInput;
    private static String SERVER_IP = "10.200.168.222"; //IP값 입력
    private static String CONNECT_MSG = "connect";
    private static String STOP_MSG = "stop";

    private static int BUF_SIZE = 100;

    protected TextureView mTextureView=null;
    protected MediaPlayer mediaPlayer = null;

    private AudioManager mAudioManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

        //변수 초기화
        link = (Button) findViewById(R.id.link);
        view = (ConstraintLayout) findViewById(R.id.view);
        Volup = (Button) findViewById(R.id.btn1);
        Voldown = (Button) findViewById(R.id.btn2);
        pause = (Button) findViewById(R.id.btn4);
        play = (Button) findViewById(R.id.btn6);
        eyetrack = (Switch) findViewById(R.id.Swt);
        Video = (VideoView) findViewById(R.id.video);
        read_textView = findViewById(R.id.read);

        // 동영상 재생 코드
        Uri videoUri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.lovedive);
        Video.setVideoURI(videoUri);
        Video.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                Video.start();
            }
        });

        //볼륨 조절
        Volup.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                        AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
            }
        });
        Voldown.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                        AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
            }
        });

        //멈춤, 재생
        getMediaController();

        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Video.start();
            }
        });
        pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view){
                Video.pause();
            }
        });

        // switch on/off
        eyetrack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (eyetrack.isChecked() == true) {
                    Volup.setVisibility(View.VISIBLE); //버튼 보이기
                    Volup.setEnabled(true); //버튼 활성화
                    Voldown.setVisibility(View.VISIBLE);
                    Voldown.setEnabled(true);
                    play.setVisibility(View.VISIBLE);
                    play.setEnabled(true);
                    pause.setVisibility(View.VISIBLE);
                    pause.setEnabled(true); }
                else {
                    Volup.setVisibility(View.INVISIBLE); //버튼 숨기기
                    Volup.setEnabled(false); //버튼 비활성화
                    Voldown.setVisibility(View.INVISIBLE);
                    Voldown.setEnabled(false);
                    play.setVisibility(View.INVISIBLE);
                    play.setEnabled(false);
                    pause.setVisibility(View.INVISIBLE);
                    pause.setEnabled(false); }
            }
        });

        // 서버 통신_play 버튼 클릭으로 시작
        link.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Connect connect = new Connect();
                connect.execute(CONNECT_MSG);
            }
        });
    }

    public class Connect extends AsyncTask< String , String,Void > {
        public String output_message;
        public String input_message;

        @Override
        public Void doInBackground(String... strings) {
            try {
                client = new Socket(SERVER_IP, 8080);
                dataOutput = new DataOutputStream(client.getOutputStream());
                dataInput = new DataInputStream(client.getInputStream());
                output_message = strings[0];
                dataOutput.writeUTF(output_message);

            } catch (UnknownHostException e) {
                String str = e.getMessage().toString();
                Log.w("discnt", str + " 1");
            } catch (IOException e) {
                String str = e.getMessage().toString();
                Log.w("discnt", str + " 2");
            }

            while (true) {
                try {
                    byte[] buf = new byte[BUF_SIZE];
                    int read_Byte = dataInput.read(buf);
                    input_message = new String(buf, 0, read_Byte);
                    if (!input_message.equals(STOP_MSG)) {
                        publishProgress(input_message);
                    }
                    else {
                        break;
                    }
                    Thread.sleep(2);
                }
                catch (IOException | InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }

        // 받아온 숫자 확인하기
        @Override
        public void onProgressUpdate(String... params) {
            read_textView.setText(""); // Clear the chat box
            read_textView.append("받은 메세지: " + params[0]);
        }
    }

    public void buttonif(String...params) {
        if(params[0].equals("2")) {
            Volup.performClick();
        }
        if(params[0].equals("3")) {
            Voldown.performClick();
        }
        if(params[0].equals("4")) {
            play.performClick();
        }
        if(params[0].equals("5")) {
            pause.performClick();
        }
        if(params[0].equals("1")) {
            eyetrack.performClick();
        }
    }
}

 

qwerty098 (120 포인트) 님이 2022년 5월 25일 질문
qwerty098님이 2022년 5월 25일 수정

1개의 답변

0 추천

안드로이드를 먼저 손대지 마시고 자바기초부터 공부하시고 하시기를 권장합니다. 한 몇일 동안을 자바만 파시는게 결과적으로 빠를 것 같아요.

질문에 답을 드리지만 buttonif 메소드 선언은 이미 되어 있구요, 이걸 호출하는 걸 말씀하시는 듯 하네요.

public void buttonif(String...params) {
  ....
}

자바에서 ...는 가변 인자(variable arguments)고 하는데, 이름에서 알 수 있듯이 파라미터의 갯수가 이 메소드를 호출하는 쪽에 의해서 결정되는 거예요. 즉, 호출하는 쪽에서 String타입의 인자를 원하는 갯수만큼 넣어서 호출할 수 있는 거예요. 예를 들면,

buttonif("one");
buttonif("one", "two");
buttonif("one", "two", "three");
buttonif("one", "two", "three", "four");

위처럼 호출이 가능하구요, 배열을 넘겨줄 수도 있어요.

String[] variableArguments = new String[]{"one", "two", "three"}
buttonif(variableArguments);

질문만으로는 buttonif를 어느 시점에서 호출하기를 원하는지 명확하지가 않은데, 혹 AsyncTask에서 데이터를 받고 난 다음이라면 아래 주석부분에서 호출을 하시면 됩니다.

public class Connect extends AsyncTask< String , String,Void > {
        public String output_message;
        public String input_message;
 
        ...
 
        // 받아온 숫자 확인하기
        @Override
        public void onProgressUpdate(String... params) {
            read_textView.setText(""); // Clear the chat box
            read_textView.append("받은 메세지: " + params[0]);

            // 소켙에서 숫자를 받은 다음 화면을 업데이트하는 작업을 수행.
        }
    }

 

spark (227,470 포인트) 님이 2022년 5월 26일 답변
...