앱에서 기기 내부에 존재하는 음원을 재생하려면 우선 음원 파일의 정보를 읽어야 합니다. flutter에서는 path_provider라는 패키지를 사용하여 경로를 알아낸 뒤 음원 재생 패키지를 사용하여 접근할 수 있지만, 오직 음원 파일에만 접근하려면 on audio query를 사용하는 것이 편리합니다.
패키지 설치(택 1)
· Terminal에서 [flutter pub add on_audio_query] 입력
· pubspec.yaml에서 [on_audio_query:버전] 입력 후 Pub get 클릭
네이티브 설정
· Android
AndroidManifest.xml에 권한을 추가합니다.
<manifest>
<!-- Android 12 or below -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!-- Android 13 or greater -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
</manifest>
· IOS
Info.plist에 권한을 추가합니다.
<dict>
...
<key>NSAppleMusicUsageDescription</key>
<string>$(PROJECT_NAME) requires access to media library</string>
...
</dict>
권한 설정
on audio query에서는 권한 요청에 관련된 메서드가 존재하지만, permission handler를 사용하는 것을 권유드리며 permission handler에 대한 사용법은 이 페이지를 참고하시길 바랍니다.
// 권한 상태 확인
Future<bool> permissionsStatus() async {
return platform.permissionsStatus();
}
// 권한 요청
Future<bool> permissionsRequest({bool retryRequest = false}) async {
return platform.permissionsRequest(retryRequest: retryRequest);
}
음원정보 읽기
on audio query에서 제공하는 query~ 메서드를 사용하여 음원정보를 읽을 수 있습니다. 사용되는 구조의 자세한 설명은 Documentation 문서를 참고하시길 바랍니다.
final OnAudioQuery _audioQuery = OnAudioQuery();
// 음원 전체
List<SongModel> audios = await _audioQuery.querySongs();
// 앨범
List<AlbumModel> albums = await _audioQuery.queryAlbums();
// 아티스트
List<ArtistModel> artists = await _audioQuery.queryArtists();
// 플레이리스트
List<PlaylistModel> playlists = await _audioQuery.queryPlaylists();
// 장르
List<GenreModel> genres = await _audioQuery.queryGenres();
⭐ SongModel, AlbumModel, ArtistModel, PlaylistModel, GenreModel
앨범커버 이미지로 표시
· 위젯 사용
⭐ 더 자세한 것들은 이 페이지를 참고하시길 바랍니다.
Widget someOtherName() async {
return QueryArtworkWidget(
id: <audioId>,
type: ArtworkType.AUDIO,
);
}
// 예시
Container(
child: QueryArtworkWidget(
id: _session_id,
type: ArtworkType.AUDIO,
// 이미지가 없을 경우 사용할 이미지
nullArtworkWidget: const Image(
image: AssetImage('assets/smile.png'),
fit: BoxFit.fill,
height: 200,
width: 200,
),
// 크기
artworkWidth: 200,
artworkHeight: 200,
// 테두리 형태
artworkBorder: BorderRadius.circular(100),
),
),
· Uint8List 사용
⭐ 이 메서드를 사용하기 위해서는 API >= 29, Android Q/10이 필수입니다.
Uint8List something = await _audioQuery.queryArtwork(
<audioId>,
ArtworkType.AUDIO,
...
);
// 위젯 사용 시
static Future<ui.Image> bytesToImage(Uint8List imgBytes) async{
ui.Codec codec = await ui.instantiateImageCodec(imgBytes);
ui.FrameInfo frame = await codec.getNextFrame();
return frame.image;
}
파라미터 | 설명 |
audioId | int query로 얻은 audio의 session id입니다. |
type | ArtworkType.AUDIO, ArtworkType.ALBUM |
format | ArtworkFormat.PNG, ArtworkFormat.JPEG |
size | int 200보다 클 경우 크게 차이는 없지만 성능이 느려질 수 있습니다. |
quality | int |
출처
https://pub.dev/packages/on_audio_query
'프로그램 개발 > Flutter' 카테고리의 다른 글
[flutter] 권한 관리 : permission handler (0) | 2023.04.04 |
---|---|
[flutter] 디스크에 데이터 저장하기 : Shared preferences (0) | 2023.04.03 |
[flutter] Android Multidex 오류 (0) | 2023.02.14 |
[flutter] flutter doctor Unable to find bundled Java version 오류 (0) | 2023.02.07 |
[flutter] flutter doctor No Java Development Kit 오류 (0) | 2023.02.07 |