프로그램 개발/Flutter

[flutter] 음원 정보 접근하기 : on audio query

(ㅇㅅㅎ) 2023. 4. 11. 14:48
728x90
반응형

 

 앱에서 기기 내부에 존재하는 음원을 재생하려면 우선 음원 파일의 정보를 읽어야 합니다. 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),
    ),
),

예시 null 형태

· 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

 

on_audio_query | Flutter Package

Flutter Plugin used to query audios/songs infos [title, artist, album, etc..] from device storage.

pub.dev

 

반응형