2012-12-02 2 views
1

다음과 같은 사용 사례가 있어야하는 앱을 작성 중입니다. 사용자가 '시작'을 클릭하십시오. 버튼을 누르면 1 분마다 CameraPreview 클래스를 사용하여 사진을 클릭하고 버튼 텍스트를 '완료'로 변경합니다.android camera clickat 고정 주파수

사용자가 동일한 버튼을 누르면 ('Done!'이라는 새 버튼 텍스트가 있음) 앱이 중지됩니다.

사용자가 '시작'을 클릭 할 때마다 1 분마다 그림을 클릭하는 코드를 작성할 수있었습니다. 단추. 그러나 이미지 캡처가 시작되면 버튼이 멈 춥니 다.

단추가 고정되지 않는 방식으로 1 분마다 이미지 캡처를 실행할 수 있습니까? 그 주변의 모범 사례는 무엇입니까? 감사! 여기

이의 OnClick()에 대한 코드입니다

@Override 
public void onClick(View v) { 
    Button button = (Button)v; 
    String buttonText = button.getText().toString(); 

    if(buttonText.equals(Constant.trainButtonText)) { 
     Log.i(TAG, "Robot Training started..."); 

     while(true) { 
      surfaceView.capture(new Camera.PictureCallback() { 
       public void onPictureTaken(byte[] data, Camera camera) { 
        Log.v("Still", "Image data received from camera"); 

        String[] params = new String[] { 
          Constant.Server, // Server URL 
          Long.toString(new Date().getTime()), // Image Timestamp 
          Constant.userId // Unique user ID for each customer 
        }; 
        new UploadImageToWebServiceTask(data).execute(params); 
        camera.startPreview(); 
       } 
      }); 
      try { 
       // Capture every 1 minute until 'training done!' is not clicked 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    } 
    else if(buttonText.equals(Constant.doneTrainingButtonText)) { 
     Log.i(TAG, "Robot Training completed..."); 
     button.setText(Constant.trainButtonText); 
     button.clearFocus(); 
    } 
} 

코드에서 같은 버튼을 사용 - 우리가 단추 텍스트를 기반으로 수행 할 작업을 결정하는 유일한 것이다.

+0

하여 관련 코드를 게시하시기 바랍니다. – Sam

+0

완료! 시간 내 줘서 고마워. –

답변

2

UI 스레드를 차단하지 말고 Runnable로 전환하십시오. 또한 매초마다 사진을 찍습니다. 1000은 1 초, 60000은 1 분입니다.

먼저 새 필드 변수를 만들 :

public class MainActivity extends Activity { 
    Runnable takePictures = new Runnable() { 
     @Override 
     public void run() { 
      // I'll trust that this code works 
      surfaceView.capture(new Camera.PictureCallback() { 
       public void onPictureTaken(byte[] data, Camera camera) { 
        Log.v("Still", "Image data received from camera"); 

        String[] params = new String[] { 
          Constant.skynetNNServer, // Server URL 
          Long.toString(new Date().getTime()), // Image Timestamp 
          Constant.userId // Unique user ID for each customer 
        }; 
        new UploadImageToCloudTask(data).execute(params); 
        camera.startPreview(); 
       } 
      }); 

      // Call this runnable again in 60 seconds (60000 milliseconds) 
      surfaceView.postDelayed(this, 60000); 
     } 
    }; 
    // Rest of your code 

이 그런 다음 onClick 방법을 변경 :

@Override 
public void onClick(View v) { 
    Button button = (Button)v; 
    String buttonText = button.getText().toString(); 

    if(buttonText.equals(Constant.trainButtonText)) { 
     Log.i(TAG, "Robot Training started..."); 
     surfaceView.post(takePictures); 
    } 
    else if(buttonText.equals(Constant.doneTrainingButtonText)) { 
     Log.i(TAG, "Robot Training completed..."); 
     surfaceView.removeCallbacks(takePictures); 
     button.setText(Constant.trainButtonText); 
     button.clearFocus(); 
    } 
} 
+0

감사합니다, 샘! 추가 질문 : 실행 가능한 서비스, 비동기 작업 및 서비스 중에서 어떻게 선택 했습니까? –

+0

짧은 지연'postDelayed (takePictures, 60000)'후에 코드를 실행하고 싶을 때 핸들러가 사용하기 쉽기 때문에 SurfaceView에서 Handler를 Runnable과 함께 사용했습니다. AsyncTask는 느린 프로세스가 사용자에게 영향을주지 않도록 유지하는 데 사용됩니다. 서비스는 활동이 실행되지 않을 때에도 뒤에서 실행되는 코드 용입니다. – Sam

+0

하나의 빠른 것 : 그래서 당신이 제안한 변화는 '영원히'사진을 찍을 것입니다 (심지어 내가 '완료'버튼을 누르십시오). '완료'를 클릭하면 어떻게 Runnable을 멈출 수 있습니까? 단추? 시간 내 줘서 고마워. –