2015-10-19 2 views
1

После того, как я запустил следующий код, появится диалоговое окно, в котором будет отображаться или нет экран запуска Catturing (см. Изображение), экран записи приложения сразу после нажатия кнопки ПУСК НАЧАЛО.Как задержать запись экрана в Android 5.0?

Я надеюсь, что приложение может задержать 5 секунд для записи экрана после нажатия кнопки «СТАРТ СЕЙЧАС» и отображения информации обратного отсчета (например: «Начать запись после 5 секунд», «Начать запись после 4 секунд») на мобильном устройстве экран, как я могу это сделать? Благодаря!

enter image description here

public class MainActivity extends Activity { 

    private static final String TAG = "MainActivity"; 
    private static final int PERMISSION_CODE = 1; 
    private int mScreenDensity; 
    private MediaProjectionManager mProjectionManager; 
    private static final int DISPLAY_WIDTH = 480; 
    private static final int DISPLAY_HEIGHT = 640; 
    private MediaProjection mMediaProjection; 
    private VirtualDisplay mVirtualDisplay; 
    private MediaProjectionCallback mMediaProjectionCallback; 
    private ToggleButton mToggleButton; 
    private MediaRecorder mMediaRecorder; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     DisplayMetrics metrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     mScreenDensity = metrics.densityDpi; 

     mMediaRecorder = new MediaRecorder(); 
     initRecorder(); 
     prepareRecorder(); 

     mProjectionManager = (MediaProjectionManager) getSystemService 
       (Context.MEDIA_PROJECTION_SERVICE); 

     mToggleButton = (ToggleButton) findViewById(R.id.toggle); 
     mToggleButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onToggleScreenShare(v); 
      } 
     }); 

     mMediaProjectionCallback = new MediaProjectionCallback(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (mMediaProjection != null) { 
      mMediaProjection.stop(); 
      mMediaProjection = null; 
     } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode != PERMISSION_CODE) { 
      Log.e(TAG, "Unknown request code: " + requestCode); 
      return; 
     } 
     if (resultCode != RESULT_OK) { 
      Toast.makeText(this, 
        "Screen Cast Permission Denied", Toast.LENGTH_SHORT).show(); 
      mToggleButton.setChecked(false); 
      return; 
     } 
     mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data); 
     mMediaProjection.registerCallback(mMediaProjectionCallback, null); 
     mVirtualDisplay = createVirtualDisplay(); 
     mMediaRecorder.start(); 
    } 

    public void onToggleScreenShare(View view) { 
     if (((ToggleButton) view).isChecked()) { 
      shareScreen(); 
     } else { 
      mMediaRecorder.stop(); 
      mMediaRecorder.reset(); 
      Log.v(TAG, "Recording Stopped"); 
      stopScreenSharing(); 
      initRecorder(); 
      prepareRecorder(); 
     } 
    } 

    private void shareScreen() { 
     if (mMediaProjection == null) { 
      startActivityForResult(mProjectionManager.createScreenCaptureIntent(), PERMISSION_CODE); 
      return; 
     } 
     mVirtualDisplay = createVirtualDisplay(); 
     mMediaRecorder.start(); 
    } 

    private void stopScreenSharing() { 
     if (mVirtualDisplay == null) { 
      return; 
     } 
     mVirtualDisplay.release(); 
     //mMediaRecorder.release(); 
    } 

    private VirtualDisplay createVirtualDisplay() { 
     return mMediaProjection.createVirtualDisplay("MainActivity", 
       DISPLAY_WIDTH, DISPLAY_HEIGHT, mScreenDensity, 
       DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, 
       mMediaRecorder.getSurface(), null /*Callbacks*/, null /*Handler*/); 
    } 

    private class MediaProjectionCallback extends MediaProjection.Callback { 
     @Override 
     public void onStop() { 
      if (mToggleButton.isChecked()) { 
       mToggleButton.setChecked(false); 
       mMediaRecorder.stop(); 
       mMediaRecorder.reset(); 
       Log.v(TAG, "Recording Stopped"); 
       initRecorder(); 
       prepareRecorder(); 
      } 
      mMediaProjection = null; 
      stopScreenSharing(); 
      Log.i(TAG, "MediaProjection Stopped"); 
     } 
    } 

    private void prepareRecorder() { 
     try { 
      mMediaRecorder.prepare(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
      finish(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      finish(); 
     } 
    } 

    private void initRecorder() { 
     mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); 
     mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); 
     mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     mMediaRecorder.setVideoEncodingBitRate(512 * 1000); 
     mMediaRecorder.setVideoFrameRate(30); 
     mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT); 
     mMediaRecorder.setOutputFile("/sdcard/capture.mp4"); 
    } 
} 

ответ

3

Использование CountDownTimer для задержки:

private CountDownTimer myCount; 
      myCount = new CountDownTimer(5000,1000) { 

       @Override 
       public void onTick(long millisUntilFinished) { 
        //Show seconds 1 to 5 
       } 

       @Override 
       public void onFinish() { 
        //Start Catturing Screen displayed 
       } 
      }; 
+0

Для ChickenVN91, спасибо! Как задержать запись на экране? – HelloCW

+0

Где я могу вызвать функцию myCount? Не могли бы вы дать более подробный код? Благодаря! – HelloCW

+0

При нажатии кнопки, чтобы начать запись, вы будете вызывать myCount для задержки 5 секунд. Вы вызываете myCount в Onclick кнопки Start – ChickenVN91

Смежные вопросы