사용 기능
- MediaPlayer
- Permissions
1. xml
1) 시간을 나타내는 TextView
2) 녹음 파형을 나타내는 View
3) 재생 / 녹음 / 멈춤 버튼으로 사용할 ImageView 3개
<TextView
android:id="@+id/timerTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00:00.00"
android:textSize="40sp"
app:layout_constraintBottom_toTopOf="@id/waveformView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/waveformView"
android:layout_width="0dp"
android:layout_height="250dp"
app:layout_constraintBottom_toTopOf="@id/recordButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/playButton"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginBottom="80dp"
android:src="@drawable/icon_play"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/recordButton"
app:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/recordButton"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginBottom="80dp"
android:src="@drawable/baseline_circle_24"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/stopButton"
app:layout_constraintStart_toEndOf="@id/playButton"/>
<ImageView
android:id="@+id/stopButton"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginBottom="80dp"
android:src="@drawable/icon_stop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/recordButton"/>
2. 권한 설정***
android permission을 검색하면 제일 먼저 공식 문서가 나타난다.
여기서 권한 요청 코드 직접 관리를 보면 된다.
시스템이 권한 요청 코드를 관리하도록 허용하는 대신 권한 요청 코드를 직접 관리할 수 있습니다. 이렇게 하려면 requestPermissions() 호출에 요청 코드를 포함합니다. - 공식문서
when {
ContextCompat.checkSelfPermission(
CONTEXT,
Manifest.permission.REQUESTED_PERMISSION // 1
) == PackageManager.PERMISSION_GRANTED -> {
// You can use the API that requires the permission.
performAction(...)
}
ActivityCompat.shouldShowRequestPermissionRationale( //2
this, Manifest.permission.REQUESTED_PERMISSION) -> {
// In an educational UI, explain to the user why your app requires this
// permission for a specific feature to behave as expected, and what
// features are disabled if it's declined. In this UI, include a
// "cancel" or "no thanks" button that lets the user continue
// using your app without granting the permission.
showInContextUI(...)
}
else -> {
// You can directly ask for the permission.
requestPermissions(CONTEXT,
arrayOf(Manifest.permission.REQUESTED_PERMISSION),
REQUEST_CODE)
}
}
설명 ..
ContextCompat.checkSelfPermission
특정 권한이 PackageManager.PERMISSION_DENIED인지 PackageManager.PERMISSION_GRANTED인지 반환한다.
ActivityCompat.shouldShowRequestPermissionRationale
사용자가 권한 요청을 명시적으로 거부한 경우 true를 반환한다.
사용자가 권한 요청을 처음 보거나, 다시 묻지 않음 선택한 경우, 권한을 허용한 경우 false를 반환한다.
ActivityCompat.requestPermissions
사용자에게 명시적으로 권한을 요청한다.
onRequestPermissionsResult
onActivityResult처럼, requestPermissions를 통해 받아온 사용자 응답에 따라 동작을 정의할 수 있다.
참고 https://developer.android.com/guide/topics/permissions/overview?hl=ko
1) AlertDialog
위에 권한표를 작성전에 AlertDialog를 만든다.
private fun showPermissionRationalDialog() {
AlertDialog.Builder(this)
.setMessage("녹음 권한을 허용하겠습니까?")
.setPositiveButton("허용") { _, _ ->
ActivityCompat.requestPermissions( //requestPermissions는 androd에서 사용해서 ActivityCompat을 붙여주어서 androidx에 있는 requestPermissions을 사용
this, // CONTEXT -> this (activity에서의 CONTEXT는 자신이니까 this)
arrayOf(Manifest.permission.RECORD_AUDIO),
REQUEST_RECORD_AUDIO_CODE
)
}
.setNegativeButton("취소") { dialogInterface, _ -> dialogInterface.cancel()}
.show()
}
추가로 AlertDialog를 만들어야하지만 일단 위에 있는 when 권한부터 바꾸면
2)
//manifests
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
when {
ContextCompat.checkSelfPermission(
this, //CONTEXT -> this (activity에서의 CONTEXT는 자신이니까 this)
Manifest.permission.RECORD_AUDIO // RECORD_AUDIO로 변경
) == PackageManager.PERMISSION_GRANTED -> { //권한이 습득되어 있다면
// You can use the API that requires the permission.
//performAction(...)
}
ActivityCompat.shouldShowRequestPermissionRationale(
this,
Manifest.permission.RECORD_AUDIO
) -> {
showPermissionRationalDialog() //AlertDialog 호출
}
else -> {
ActivityCompat.requestPermissions(
this, // CONTEXT -> this (activity에서의 CONTEXT는 자신이니까 this)
arrayOf(Manifest.permission.RECORD_AUDIO),
REQUEST_RECORD_AUDIO_CODE
)
}
}
설명은 주석으로 자세히 써놨다.
3) 나머지
3-1) 권한 허용이 되지 않았을 경우
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
//권한이 허용되었는지 안되어있는지 체크
val audioRecordPermissionGranted = requestCode == REQUEST_RECORD_AUDIO_CODE
&& grantResults.firstOrNull() == PackageManager.PERMISSION_GRANTED
if (audioRecordPermissionGranted) {
//todo 녹음 작업
} else {
if (ActivityCompat.shouldShowRequestPermissionRationale(
this,
Manifest.permission.RECORD_AUDIO
)
) {
showPermissionRationalDialog()
} else {
showPermissionSettingDialog()
}
}
}
다시 권한을 물어보는 것보단 앱 설정화면에 가서 설정하도록 권한다.
private fun showPermissionSettingDialog() {
AlertDialog.Builder(this)
.setMessage("녹음 권한을 허용해야 앱을 사용 가능합니다. 앱 설정 화면으로 이동하시겠습니까?")
.setPositiveButton("권한 허용하러 가기") { _, _ ->
navigateToAppSetting()
}
.setNegativeButton("취소") { dialogInterface, _ -> dialogInterface.cancel() }
.show()
}
private fun navigateToAppSetting() {
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
//ACTION_APPLICATION_DETAILS_SETTINGS -> 앱의 특정 어플리케이션 설정으로 이동 (밑에 종류 정리)
data = Uri.fromParts("package", packageName, null)
}
startActivity(intent)
}
Activity Action
1. ACTION_APPLICATION_SETTINGS : 설정 화면창
2. ACTION_APPLICATION_DETAILS_SETTINGS : 특정 앱 설정창
3. ACTION_APPLICATION_DEVELOPMENT_SETTINGS : 개발자 옵션
4.ACTION_APP_NOTIFICATION_SETTINGS : 특정 앱의 알림 설정창
5.ACTION_APP_NOTIFICATION_BUBBLE_SETTINGS : 플로팅 알림창
6.ACTION_APP_SEARCH_SETTINGS : 검색 돋보기창
7.ACTION_APP_USAGE_SETTINGS : 앱 사용 시간창
등등
결과
'Android Studio > base_Project' 카테고리의 다른 글
Android 녹음기 만들기 [2/3] (기능 구현) (0) | 2024.02.19 |
---|---|
[기본] 갤럭시 스톱워치 클론코딩 (2/3 기능구현) (0) | 2024.02.07 |
[기본] 갤럭시 스톱워치 클론코딩 (1/3 분석단계 및 UI ) (0) | 2024.02.06 |
[기본] 안드로이드 계산기 클론 코딩 (2/2) 완료X (1) | 2024.02.06 |
[기본] android 계산기 클론 코딩 (1/2) (0) | 2024.02.05 |