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카드 폴더 : 파일로서의 역할
- 데이터 소스 등록 - SetDataSource()
- 준비 작업 - Prepare()
- 재생 시작 - 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
'Android Programming' 카테고리의 다른 글
[Mobile Programming] 방송 수신자 (0) | 2021.12.04 |
---|---|
[Mobile Programming] 서비스 (0) | 2021.11.20 |
[Mobile Programming] 리소스 (0) | 2021.11.19 |
[Mobile Programming] 액티비티와 인텐트 (0) | 2021.11.10 |
[Mobile Programming] Transition API 애니메이션 (1) | 2021.10.22 |