Android 5.0+화면 녹화 구현 예시 코드

머리말
안 드 로 이 드 는 4.0 부터 모 바 일 화면 녹화 방법 을 제 공 했 지만 루트 권한 이 필요 해 쉽 지 않 았 다.그러나 5.0 부터 시스템 은 app 에 화면 을 녹화 하 는 일련의 방법 을 제공 합 니 다.루트 권한 이 필요 하지 않 고 사용자 의 권한 만 있 으 면 화면 을 녹화 할 수 있 습 니 다.상대 적 으로 간단 합 니 다.본 고 는 인터넷 상의 다른 녹화 자 료 를 참고 한 후에 완성 한 것 이다.감사 하 다.다음은 스크린 기능 을 개발 하 는 일련의 절차 와 실현 과정 에서 겪 어야 할 주의사항 을 소개 한다.
실현 절차
1.목록 파일 에 필요 한 권한 설명
녹음 에 마 이 크 를 사용 하기 때문에 오디 오 권한 을 더 해 야 합 니 다.

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
개발 한 app targetApi 가 6.0 이상 이면 동적 으로 권한 을 가 져 와 야 합 니 다.

public static void checkPermission(AppCompatActivity activity) {
  if (Build.VERSION.SDK_INT >= 23) {
   int checkPermission =
     ContextCompat.checkSelfPermission(activity, Manifest.permission.RECORD_AUDIO)
       + ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_PHONE_STATE)
       + ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)
       + ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE);
   if (checkPermission != PackageManager.PERMISSION_GRANTED) {
    //    
    ActivityCompat.requestPermissions(activity, new String[]{
      Manifest.permission.RECORD_AUDIO,
      Manifest.permission.READ_PHONE_STATE,
      Manifest.permission.READ_EXTERNAL_STORAGE,
      Manifest.permission.WRITE_EXTERNAL_STORAGE}, 123);
    return;
   } else {
    return;
   }
  }
  return;
 }
2.사용자 녹화 화면 인증 가 져 오기
여기 서 먼저 MediaProjectionManager 를 소개 합 니 다.MediaProjectionManager 는 시스템 이 제공 하 는 서비스 입 니 다.이 서비스 대상 을 받 으 면 Intent 를 만 들 수 있 습 니 다.이 Intent 를 통 해 탄 상자 스타일 의 Activity 를 시작 할 수 있 습 니 다.사용자 가 권한 을 부여 하면 다음 화면 녹 화 를 계속 할 수 있 습 니 다.설명 이 필요 한 것 은 Intent 는 다른 Activity 를 시작 하 는 것 이 고 극히 적은 기종 이 대응 하 는 권한 수여 Activity 가 없 기 때문에 여기 서 판단 을 많이 해서 응용 이 무 너 지지 않도록 해 야 한다.

MediaProjectionManager mediaProjectionManager = (MediaProjectionManager) activity.
       getSystemService(Context.MEDIA_PROJECTION_SERVICE);
     if (mediaProjectionManager != null){
      Intent intent = mediaProjectionManager.createScreenCaptureIntent();
      PackageManager packageManager = activity.getPackageManager();
      if (packageManager.resolveActivity(intent,PackageManager.MATCH_DEFAULT_ONLY) != null){
       //       Activity 
       activity.startActivityForResult(intent,requestCode);
      }else {
       Toast.makeText(activity,R.string.can_not_record_tip,Toast.LENGTH_SHORT).show();
      }
     }
3.onActivity Result 에서 사용자 의 권한 수 여 를 처리 합 니 다.
사용자 가 권한 을 수 여 했 더 라 도 녹화 작업 에 동의 하 더 라 도 이상 을 포착 해 야 합 니 다.왜냐하면 이러한 상황 이 발생 할 수 있 기 때 문 입 니 다.즉,사용자 가 녹화 작업 에 동의 할 때 시스템 도 녹화 작업 을 하고 있 고 녹화 작업 이 충돌 할 수 있 기 때 문 입 니 다.

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK){
   try {
    ScreenUtil.setUpData(resultCode,data);
   } catch (Exception e) {
    e.printStackTrace();
   }
  } else {
   ToastUtil.show(this,"    ");
  }
 }
4.MediaRecorder 를 초기 화하 고 VirtualDisplay 를 만 듭 니 다.

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
 private void setUpMediaRecorder() {

  mRecordFilePath = getSaveDirectory() + File.separator+ System.currentTimeMillis() + ".mp4";
  if (mMediaRecorder == null){
   mMediaRecorder = new MediaRecorder();
  }
  //      
  mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  //      
  mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
  //         
  mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
  //      
  mMediaRecorder.setOutputFile( mRecordFilePath );
  //    
  mMediaRecorder.setVideoSize(mRecordWidth, mRecordHeight);
  //      
  mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
  mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  //   
  mMediaRecorder.setVideoEncodingBitRate((int) (mRecordWidth * mRecordHeight * 3.6));
  //    
  mMediaRecorder.setVideoFrameRate(20);

  try {
   mMediaRecorder.prepare();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
이 단 계 는 전체 녹화 화면 조작 에서 가장 관건 적 인 단계 이다!우 리 는 MediaRecorder 를 초기 화 했 고 음성 녹음 여부,녹화 파일 형식,녹화 파일 경로,음성 영상의 인 코더,비트 레이트,영상 프레임 율 등 을 설정 했다.
그리고 3 단계 에 있 는 resultCode 와 data 를 필요 한 매개 변수 로 MediaProjectionManager 를 통 해 VirtualDisplay 를 만 듭 니 다.VirtualDisplay 는 화면의 내용 을 캡 처 하고 캡 처 한 내용 을 Surface 에 렌 더 링 할 수 있 는 가상 디 스 플레이 로 이해 할 수 있 습 니 다(Surace 는 MediaRecorder 가 제공 하고 getSurface()방법 으로 얻 을 수 있 습 니 다).MediaRecorder 는 이 를 Mp4 문서 로 패키지 처리 합 니 다.
상기 절 차 를 거 쳐 prepare 를 한 후에 MediaRecorder.start()를 다시 호출 하면 녹화 화면 을 시작 할 수 있 습 니 다.여기 서도 동의 할 때 start()방법 으로 녹화 화면 을 시작 한 후에 stop()방법 으로 녹화 화면 을 중단 할 수 없습니다.그렇지 않 으 면 무 너 집 니 다.테스트 는 녹화 기능 을 테스트 할 때 즉시 녹화 화면 을 멈 추고 응용 프로그램 이 무 너 져 원인 을 찾 지 못 했다.원본 코드(API 26)의 주석 이 보일 때 까지

그래서 어차피 무 너 지기 위해 stop 에서 이상 을 포착 하고 MediaRecorder 를 비 워 두 었 다가 다음 녹화 때 다시 MediaRecorder 를 생 성 합 니 다.
마지막.
지식 수준 이 제한 되 어 있 기 때문에 잘못된 누락 을 피하 기 어렵 습 니 다.지적 을 환영 합 니 다!프로젝트 주소화면 녹화
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기