Android Programming

[Mobile Programming] 멀티미디어 데이터

gangintheremark 2021. 11. 19. 22:47
728x90
  • 재생 : MediaPlayer 클래스 사용
  • 녹화 : MediaRecoder 클래스 사용

오디오 재생

  • 암시적 인텐트 사용
    • 음악파일을 스마트폰의 SD카드 폴더에 복사
    • 현실에서는 SD카드를 꽂으면 바로 작동 ( 안드로이드 스튜디오는 AVD를 이용 )
  • MediaPlayer 클래스 사용

[암시적 인텐트]

실습

  • mp3 음악 파일을 SD card에 복사 후 재생
  • [View] - [Tool Windows] - [Device File Explorer] - [sdcard] - [Upload] 하여 sdcard로 음악 파일 복사
  • 외부 저장 장치로 permission을 얻음
  • 콜백함수에서 'sdcard'에 있는 파일들을 재생
// menifast.xml 파일
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE">
      </uses-permission>
    ...


  // MainAcrivity.java 
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button playbutton = (Button) findViewById(R.id.playbutton);
        
        playbutton.setOnClickListener(new View.OnClickListener() {
        
            @Override
            public void onClick(View v) {
                Intent myintent = new Intent(Intent.ACTION_VIEW);  
                Uri myuri = Uri.parse("file:///sdcard/song2.mp3");  
                myintent.setDataAndType(myuri, "audio/mp3");
                startActivity(myintent);
            }
        });
    }
}

[미디어 플레이어]

 

MediaPlayer 클래스 : 개발자가 MediaPlayer 클레스 제공 메스드를 이용

  • 음악파일의 재생 과정을 자유롭게 제어

음악파일 저장

  • [res]-[raw] 폴더: 하나의 리소스 역할
  • SD카드 폴더 : 파일로서의 역할
    1. 데이터 소스 등록 - SetDataSource()
    2. 준비 작업 - Prepare()
    3. 재생 시작 - Start()
  • MediaPlayer 클래스를 이용한 음악 재생 순서

실습

  • 스위치를 이용해서 'ON/OFF'하여 음악 재생 여부 결정하는 방법으로 작업
  • 리소스에서 [raw]폴더를 만들고 그 안에 음악 파일 복사
  • 음악 파일 복사 방법은 'copy&paste'
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final MediaPlayer myMusicPlayer;
        myMusicplayer = MediaPlayer.create(this, R.raw.song1);

        final Switch myswitch = (Switch) findViewById(R.id.switch1);
        myswitch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(myswitch.isChecked() == true) {
                    myMusicplayer.start();
                }
                else {
                    myMusicplayer.stop();
                }
            }
        });
    }
}

오디오 녹음

  • 인텐트 사용
  • MediaRecorder 클래스 사용

MediaRecorder 클래스를 통한 오디오 녹음

	// 1. Media Recorder의 객체 생성
        MediaRecorder recorder = new MediaRecorder();
        
        // 2. 오디오 소스 설정
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        
        // 3. 출력 파일 형식 설정
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        
        // 4. 엔코더 설정
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        
        // 5. 데이터가 저장될 파일경로 생성
        recorder.setOutputFile(PATH_NAME);
        
        // 6. MediaRecorder 객체의 prepare() 호출
        recorder.prepare();
        
        // 7, 녹음시작
        recorder.start();
        
        // 8. 녹음 중단
        recorder.stop();
        
        // 9. setAudioSource() 단계로 돌아가면 객체를 재사용할 수 있음 
        recorder.reset();
        
        // 10. 객체가 소멸. 재사용은 불가능 
        recorder.release();

 

실습

  • 녹음 시작, 녹음 재생 버튼 만들기 
// Menifast 파일
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
    
    
// MainActivity.java 
public class MainActivity extends AppCompatActivity {

    private static String filename = null;
    Button playbutton, recordbutton;
    private  MediaRecorder myrecorder = null;
    private MediaPlayer myplayer = null;

    MediaRecorder recorder = new MediaRecorder();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

		// permission 체크 메서드 실행 
        permissionCheck(Manifest.permission.WRITE_EXTERNAL_STORAGE, 100);
        permissionCheck(Manifest.permission.RECORD_AUDIO, 101);

        filename = Environment.getExternalStorageDirectory().getAbsolutePath();
        filename += "/recordtest.3gp";

        playbutton = (Button) findViewById(R.id.button_play);
        recordbutton = (Button) findViewById(R.id.button_record);

        playbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(myplayer == null) {
                    myplayer = new MediaPlayer();
                    try{
                        myplayer.setDataSource(filename);
                        myplayer.prepare();
                        myplayer.start();
                    } catch (IOException e) {

                    }
                    playbutton.setText("재생 멈춤");
                }
                 else {
                     myplayer.release();
                     myplayer = null;
                     playbutton.setText("재생 시작");
                }
            }
        });

        recordbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(myrecorder == null) {
                    myrecorder = new MediaRecorder();
                    myrecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                    myrecorder.setOutputFile(filename);
                    myrecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                    try {
                        myrecorder.prepare();
                    } catch(IOException e) {

                    }
                    myrecorder.start();
                    recordbutton.setText("녹음 정지");
                }
                else {
                    myrecorder.release();
                    myrecorder= null;
                    recordbutton.setText("녹음 시작");
                }
            }
        });

    }
    public void onPause() {
        super.onPause();
        if(myrecorder != null) {
            myrecorder.release();
            myrecorder = null;
        }
        if(myplayer != null) {
            myplayer.release();
            myplayer = null;
        }
    }

    public void permissionCheck(String permissionId, int requestCode) {
        if(ActivityCompat.checkSelfPermission(this, permissionId) != PackageManager.PERMISSION_GRANTED) {
            if(ActivityCompat.shouldShowRequestPermissionRationale(this, permissionId)) {

            }
            else {
                ActivityCompat.requestPermissions(this, new String[]{permissionId}, requestCode);
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch(requestCode) {
            case 100:
                break;
            case 101:
                break;
        }
    }
}

실행화면

728x90