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

(소스있음) 스마트폰과 스마트폰 사이의 원격조작

0 추천
안녕하세요. 어제도 잠깐 질문을 했었는데.. 죄송하지만 다시한번 질문을 올립니다.
현재까지의  작업을 말씀드리면, 스마트폰과 스마트폰 사이에  원격 동영상촬영을 작업중입니다.

클라이언트 쪽에서 버튼을 이용하지않고 롱터치이벤트로 동영상촬영을 제어하게끔 만들었습니다. 클라이언트에서는 일단 잘 돌아갑니다.

소켓 UDP통신을 이용해 클라이언트에서 롱터치를 했을경우 서버 (상대방 스마트폰)에 동영상촬영의 명령을 하고싶은데...  여기서부터 어떻게 해야하는지 모르겠습니다..   일단 클라이언트쪽 소스를 올려보겠습니다. (참고로 버튼을 이용해 인텐트를 했습니다. )

 

protected void onCreate(Bundle savedInstanceState) {
     Log.i(this.getPackageName(), "onCreate()");

     super.onCreate(savedInstanceState);

        try
  {
   
   StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());

        
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.activity_main);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

        // 컨트롤 변수를 설정
        //----------------------------
        myVideoView_rec = (VideoView) findViewById(R.id.VideoView_rec);
        myVideoView_play = (VideoView) findViewById(R.id.VideoView_play);

       // GestureDetector설정
       // 이 클래스를 리스너로 설정
    //---------------------------------
    gestureDetector = new GestureDetector(this, this);

    // 터치 리스너 등록
    //-------------------------
    myVideoView_rec.setOnTouchListener(this);
    myVideoView_play.setOnTouchListener(this);

 // 녹화관계
    //----------
    SurfaceHolder holder = myVideoView_rec.getHolder();
    holder.addCallback(this);

    }
        catch (Exception e)
  {
   Log.e(this.getPackageName(), "onCreate : "+e.toString());
  }
 }

@Override
 protected void onResume()
 {
  Log.i(this.getPackageName(), "onResume()");

  super.onResume();

  try
  {
   socket_open_request = true;  // 소켓오픈 요구
   send_request = true;   // 송신요구
   //------------------------
   // 정기적인 처리 실행
   //------------------------
   final CameraProcess pro = new CameraProcess(this);
   runnable = new Runnable()
   {
    public void run()
    {
     // 종료판정
     //-----------
     if (runnable==null) return;
     // 송신요구처리
     //--------------
     if ((send_request==true) && (udp_socket_list.size()!=0))
     {
      send_request = false;
     }

     // 처리
     //-------
     pro.doSomething();

     // 2회처리
     //-------
     handler.postDelayed(this, REPEAT_INTERVAL2);
    }
   };

   handler.postDelayed(runnable, REPEAT_INTERVAL);

  }
  catch (Exception e)
  {
   Log.e(this.getPackageName(), "onResume : "+e.toString());
  }
 }

 //---------------------
   // MediaRecorder 설정
   //---------------------
   public boolean initializeVideoSettings()
   {
    try
    {
     if (v_holder==null) return false;

     myRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);  
     myRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);  
     myRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);

     myRecorder.setOutputFile(REC_FILE);         
     myRecorder.setVideoFrameRate(30);         
     myRecorder.setVideoSize(1280, 720);         
     myRecorder.setPreviewDisplay(v_holder.getSurface());    

     myRecorder.prepare();
    }
    catch (Exception e)
    {
     Log.e("VideoRecorderAndPlay", e.getMessage());
     return false;
    }
    return true;
   }

 

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
     v_holder = holder;

    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        stop();
    }

    public void stop() {

    }
 @Override
 public boolean onTouch(View view, MotionEvent motionevent)
 {
//  Log.i(this.getPackageName(), "onTouch");

  try
  {

         if (gestureDetector.onTouchEvent(motionevent))
         {
          return true;
         }

  }
  catch (Exception e)
  {
   Log.e(this.getPackageName(), "onTouch : "+e.toString());
   return false;
  }
  return true;
 }

    @Override
    public void onShowPress(MotionEvent motionevent)
    {
        Log.v("INFO", "onShowPress");
    }

 
    @Override
    public void onLongPress(MotionEvent motionevent)
    {
        Log.v("INFO", "onLongPress");
  int j ;

        if (myRecorder==null)
        {

            myVideoView_rec.setVisibility(View.VISIBLE);
            myVideoView_play.setVisibility(View.INVISIBLE);
   myRecorder = new MediaRecorder();
   isRecording = false;
   isPlay = false;

        }
        if (isRecording!=true)
  {
   // 녹화중이 아니라면 녹화개시
   //----------------------------
   if (initializeVideoSettings()==true)  // MediaRecorder의 설정
   {

    myRecorder.start();    
    isRecording = true;   //플러그

   }
  }
  else
  {
   // 녹화중이라면 녹화 중지
   //--------------------------
   myRecorder.stop();    
   myRecorder.reset();    
   myRecorder.release();   
   isRecording = false;   
   myRecorder = null;

  }
    }

    
    @Override
    public boolean onSingleTapUp(MotionEvent motionevent)
    {
        Log.v("INFO", "onSingleTapUp");

        if (myRecorder!=null)
        {
         if (isRecording==true)
   {
    // 녹화중이라면 녹화중지
    //--------------------------
    myRecorder.stop();    
    myRecorder.reset();    
    myRecorder.release();   
    isRecording = false;   
    myRecorder = null;

   }
        }
        myVideoView_rec.setVisibility(View.INVISIBLE);
        myVideoView_play.setVisibility(View.VISIBLE);
  myVideoView_play.setVideoPath(PLAY_FILE);        
  myVideoView_play.start();

  return false;
    }
익명사용자 님이 2013년 4월 4일 질문
appa님 답변감사합니다.
일단 현재 단계적으로 단순한 촬영지시를 해보고선 그다음 원격동영상 촬영을 하고싶습니다...

질문입니다만, 녹화기능은 서버쪽에다가 두어야하는건가요?
클라이언트쪽에서 녹화명령을 하고선 , 녹화하라고 메세지만 서버에 전달하는 개념이 아닌가요??

예를 들어서 동영상 촬영코드를 소켓에 전달할때 어떤식으로 하면 돼는지 간단히 예제를 들어주시지 않겠습니까?  
바쁘시겠지만 부탁드리겠습니다...
동영상 촬영 기능은 실제 촬영을 수행할 쪽에 구현해야겠죠?
UDP통신 관련은 검색해보시면 많은 예제가 나옵니다.

대충 이런식으로
InetAddress serverAddr = InetAddress.getByName(Server.SERVERIP);  
DatagramSocket socket = new DatagramSocket();  
byte[] buf = ("start").getBytes();  
DatagramPacket packet = new DatagramPacket(buf, buf.length, serverAddr, Server.SERVERPORT);
socket.send(packet);  

클라이언트에서 롱클릭을 하면 특정 메세지(예를 들어 "start")를 소켓을 통해 보내고, 받는 쪽에서 패킷을 열어봤을 때 담긴 메세지가 "start"이면 동영상 촬영을 수행하도록 구현하면 될 것 같습니다.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...