๋ฒ๊ทธ ์ค๋ช
์ฑ์ ๊ตฌํ๋ ๊ธฐ๋ณธ ์์ ๋ฅผ ํ
์คํธํ๋๋ฐ ๋น๋์ค๊ฐ ๋ฌดํํ ๋ก๋๋๊ณ ๋๋ฒ๊ทธ ์ฝ์์ ๋ง์ง๋ง ๋ฉ์์ง๋
W/System (14804): A resource failed to call release
์ฌํํ๊ธฐ ์ํด
initState()
์์ ์ด์ ๊ฐ์ด ์ปจํธ๋กค๋ฌ๋ฅผ ์ ์ํ์ญ์์ค.
_controller = YoutubePlayerController(
initialVideoId: 'iLnmTe5Q2Qw',
flags: YoutubePlayerFlags(
forceHideAnnotation: true
),
);
๋ค์๊ณผ ๊ฐ์ด ์์ ฏ์ ๊ตฌํํฉ๋๋ค.
YoutubePlayer(
controller: _controller,
showVideoProgressIndicator: true,
progressIndicatorColor: Colors.amber,
onReady: () {
print('Player is ready.');
},
),
์์๋๋ ํ๋
์๋ํ๋ YouTube ๋์์์ด ํ์๋๊ณ ์ฌ์ฉ์๊ฐ ์ฌ์์ ์์ํ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค.
๊ธฐ์ ์ ์ธ๋ถ ์ฌํญ:
์ถ๊ฐ ์ปจํ
์คํธ
์ด ๋ฒ๊ทธ ๋ณด๊ณ ์๋ฅผ ํ์ธํ์ต๋๋ค: https://github.com/flutter/flutter/issues/24565
์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ์ปจํธ๋กค๋ฌ๊ฐ ๋์ผํ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์์ ฏ ํธ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Scaffold
|-> SingleChildScrollView
|-> Column
|-> YoutubePlayer
์ค๋ฅ๊ฐ ์๋ ๋๋ฒ๊ทธ ์ฝ์ ์๋ฃ:
D/EGL_emulation(14804): eglMakeCurrent: 0xe7195440: ver 3 1 (tinfo 0xe715fcd0)
D/eglCodecCommon(14804): setVertexArrayObject: set vao to 2 (2) 0 0
D/eglCodecCommon(14804): setVertexArrayObject: set vao to 0 (0) 0 0
D/EGL_emulation(14804): eglCreateContext: 0xd2bf3640: maj 3 min 0 rcv 3
D/EGL_emulation(14804): eglMakeCurrent: 0xd2bf3640: ver 3 0 (tinfo 0xd0257060)
D/eglCodecCommon(14804): setVertexArrayObject: set vao to 1 (1) 0 0
D/eglCodecCommon(14804): setVertexArrayObject: set vao to 2 (2) 0 0
D/eglCodecCommon(14804): setVertexArrayObject: set vao to 1 (1) 0 0
D/eglCodecCommon(14804): setVertexArrayObject: set vao to 2 (2) 0 0
D/eglCodecCommon(14804): setVertexArrayObject: set vao to 1 (1) 0 0
W/System (14804): A resource failed to call release.
I/flutter (14804): The controller is not ready for method calls.
๊ฐ์ ๋ฌธ์ ์ ๋๋ค. ์งํ ์ํฉ์ด๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋์์์ด ๊ณ์ ๋ก๋ ์ค์ ๋๋ค.
๋ฆด๋ฆฌ์ค ๋น๋์ ์ค์ Android ๊ธฐ๊ธฐ์์๋ง ๋ฐ์ํฉ๋๋ค.
Android Emulator(๋๋ฒ๊ทธ)๊ฐ ์๋ํ๊ณ iOS ์๋ฎฌ๋ ์ดํฐ(๋๋ฒ๊ทธ) ๋ฐ Device(๋ฆด๋ฆฌ์ค)๋ ์๋ํฉ๋๋ค.
์ฅ์น: ์ผ์ฑ ๊ฐค๋ญ์ A6
์๋๋ก์ด๋: 9(ํ์ด)
ํ๋ฌํฐ 1.12.13+hotfix.9
youtube_player_flutter: ^6.1.0+7
์ด๊ฒ์ ์ ๋ง๋ก ์ผ ์คํ ํผ์ด๋ฉฐ ๋์ flutter_youtube_view ์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ์๊ฐํ ์ ์์ต๋๋ค...
์ข์, ๋ช ๊ฐ์ง ์ถ๊ฐ ์กฐ์ฌ ํ์ ๋ด ๋ฌธ์ ์ ์์ธ์ ์ฐพ์์ต๋๋ค. ์๋ก์ด ํ๋ฌํฐ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ํ Android ๊ถํ์ ์๋์ผ๋ก ์ค์ ํด์ผ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฆด๋ฆฌ์ค ๋ฒ์ ์๋ ๊ถํ์ด ์์ต๋๋ค -> ์ธํฐ๋ท์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ youtube-player๋ ์์ค ํ์ผ์ ์ก์ธ์คํ ์ ์์ผ๋ฉฐ ์์ํ ๋ก๋๋ฉ๋๋ค. AndroidManifest.xml์ ๋ค์์ ์ถ๊ฐํ๋ฉด ํด๊ฒฐ๋์์ต๋๋ค.
<uses-permission android:name="android.permission.INTERNET"/>
ํด๊ฒฐ ๋ฐฉ๋ฒ: Flutter ์ถ์ ์ฑ์ด ์ค์น๋ ๊ฒฝ์ฐ ๊ธฐ๊ธฐ์์ ์๋ํ์ง ์์
์ข์, ๋ช ๊ฐ์ง ์ถ๊ฐ ์กฐ์ฌ ํ์ ๋ด ๋ฌธ์ ์ ์์ธ์ ์ฐพ์์ต๋๋ค. ์๋ก์ด ํ๋ฌํฐ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ํ Android ๊ถํ์ ์๋์ผ๋ก ์ค์ ํด์ผ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฆด๋ฆฌ์ค ๋ฒ์ ์๋ ๊ถํ์ด ์์ต๋๋ค -> ์ธํฐ๋ท์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ youtube-player๋ ์์ค ํ์ผ์ ์ก์ธ์คํ ์ ์์ผ๋ฉฐ ์์ํ ๋ก๋๋ฉ๋๋ค. AndroidManifest.xml์ ๋ค์์ ์ถ๊ฐํ๋ฉด ํด๊ฒฐ๋์์ต๋๋ค.
<uses-permission android:name="android.permission.INTERNET"/>
ํด๊ฒฐ ๋ฐฉ๋ฒ: Flutter ์ถ์ ์ฑ์ด ์ค์น๋ ๊ฒฝ์ฐ ๊ธฐ๊ธฐ์์ ์๋ํ์ง ์์
๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํ์ง ์์ต๋๋ค.
์ฌ์ ํ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
iOS ๊ธฐ๊ธฐ๋ ์๋ฎฌ๋ ์ดํฐ์์๋ ์๋ํ์ง ์์ต๋๋ค. 6.1.0+7 ์ฌ์ฉ
์ด ๋ฌดํ ๋ก๋ ์ค์ FullScreen์ ์๋ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋ชป๋ ๋น๋์ค ID = ์ค๋ฅ ์ฝ๋: 1
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๋ค.
์์ ๋ ์ ์๋ํ์ง๋ง ๊ธฐ์กด ํ๋ก์ ํธ ๋ด์์ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ๋ฌดํ ๋ก๋๊ฐ ๋ฐ์ํฉ๋๋ค.
์ ๊ฒฝ์ฐ์๋ webview_flutter๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค : ^0.3.20+2
๋ด pubspec์์ ์ด ์ข ์์ฑ์ ์ ๊ฑฐํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
๋น๋์ค ID๊ฐ ์ค์ ๋ก ๊ฒ์๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ๋ฌธ์ ๋ฅผ ์ฐพ์์ต๋๋ค. x์ผ ํ ํ๋ฆฌ๋ฏธ์ด๋ก ์ค์ ํฉ๋๋ค. ์ค์ YouTube ํ๋ ์ด์ด๋ ์ด์ฐ์ ์๋๊ณ ์๋ ๋์์์ ์ฌ์ํ๋ ค๊ณ ํ๋ฉด ์ด๋ ๊ฒ ๋งํฉ๋๋ค. ์๋ง๋ ์ด๊ฒ์ ์ถ๊ฐ ๊ธฐ๋ฅ์ด์ด์ผ ํ ๊ฒ์ ๋๋ค
iOS 9.3.5๊ฐ ์ค์น๋ iPad 3์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ผ๋ฉฐ ์์ ์ด๋ ๊ฒ๋ ๋์์ด ๋์ง ์์์ต๋๋ค.
v7.0.0์ผ๋ก ์์ ํด์ผ ํฉ๋๋ค.
v7.0.0์ผ๋ก ์์ ํด์ผ ํฉ๋๋ค.
7.0.0+3
๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง ๋น๋์ค ์์ ์ ๋ฌดํ ๋ก๋ฉ์ ์ฌ์ ํ โโAndroid ์๋ฎฌ๋ ์ดํฐ์์ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
๋์ผํ ๋ฌดํ ๋ก๋ฉ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
Android Pixel 2 XL ์๋ฎฌ๋ ์ดํฐ์์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. v6.1.1๋ก ๋ค์ด๊ทธ๋ ์ด๋ํ๋ฉด ๋น๋์ค๊ฐ ๋ก๋๋ฉ๋๋ค.
minSdk๋ฒ์ 21
webview_flutter๋ฅผ ํฌํจํ์ง ์์ต๋๋ค.
์ด๊ธฐํ๋ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
_controller = YoutubePlayerController(
initialVideoId: videoID,
flags: YoutubePlayerFlags(
mute: false,
enableCaption: false,
autoPlay: false,
),
);
Android Pixel 3์์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋น๋์ค๊ฐ ๊ณ์ ๋ก๋๋๊ณ iOS์์ ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค.
์๋ฎฌ๋ ์ดํฐ๋ง์ ๋ฌธ์ ์ธ๊ฐ์?? ์ค์ Android ๊ธฐ๊ธฐ๋ฅผ ์ฌ์ฉํด ๋ณธ ์ฌ๋์ด ์์ต๋๊น?
๋ชจ๋ ์ ๋ฐ์ดํธ๊ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋น๋์ค๋ ์ ์ฌ์๋์ง๋ง ๋ก๋๋ ๋น๋์ค ํ๋ฉด์ ์ผ์ชฝ ํ๋จ์์ ๊ณ์ ํ์ ํฉ๋๋ค.
๋๊ตฌ๋ ์ง ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ์์ต๋๊น?
๋๊ตฌ๋ ์ง ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ์์ต๋๊น?
6.1.1 ํจํค์ง๋ก ๋ค์ด๊ทธ๋ ์ด๋
@JigarKotak7 ํ์ ๊ฐ์ฌํฉ๋๋ค. v6.1.1 ํจํค์ง๋ก ๋ค์ด๊ทธ๋ ์ด๋ํ์ง๋ง ์ฌ์ ํ ์๋ฎฌ๋ ์ดํฐ์์ ์คํ๋์ง ์์์ต๋๋ค. ๊ทธ๋์ Define your controller in initState()
์ @Gunlek ์์ด๋์ด๋ฅผ ์๋ํ๊ณ ์๋ํ์ต๋๋ค. ์ด๊ฒ์ด ์ ์ฝ๋์
๋๋ค.
class AboutTopic extends StatefulWidget {
final String videoLink;
AboutTopic({this.videoLink});
<strong i="9">@override</strong>
_AboutTopicState createState() => _AboutTopicState();
}
class _AboutTopicState extends State<AboutTopic> {
YoutubePlayerController _controller;
<strong i="10">@override</strong>
void initState() {
_controller = YoutubePlayerController(
initialVideoId:
YoutubePlayer.convertUrlToId(widget.videoLink),
flags: YoutubePlayerFlags(
mute: false,
autoPlay: true,
disableDragSeek: true,
loop: false,
enableCaption: false),
);
super.initState();
}
<strong i="11">@override</strong>
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('About'),
centerTitle: true,
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
Navigator.of(context).pop();
},
)
),
body: YoutubePlayer(
controller: _controller,
showVideoProgressIndicator: true,
bottomActions: <Widget>[
const SizedBox(width: 14.0),
CurrentPosition(),
const SizedBox(width: 8.0),
ProgressBar(isExpanded: true),
RemainingDuration(),
],
aspectRatio: 4 / 3,
progressIndicatorColor: Colors.white,
onReady: () {
print('Player is ready.');
},
),
);
}
}
@Hardikkr ๋คํ ์
๋๋ค.
์๋ ๋งํฌ์๋ YouTube ํ๋ ์ด์ด๋ฅผ ์ฌ์ฉํ ํด๋ผ์ด์ธํธ ์ค ํ๋๋ฅผ ์ํด ๋น๋ํ ์ฑ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ ์ฝ๊ฐ ์์ต๋๋ค. ์ง๋ฌธ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์.
https://www.youtube.com/watch?v=O3dy9p4ybes
@Hardikkr ๋คํ ์ ๋๋ค.
์๋ ๋งํฌ์๋ YouTube ํ๋ ์ด์ด๋ฅผ ์ฌ์ฉํ ํด๋ผ์ด์ธํธ ์ค ํ๋๋ฅผ ์ํด ๋น๋ํ ์ฑ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ ์ฝ๊ฐ ์์ต๋๋ค. ์ง๋ฌธ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์.
https://www.youtube.com/watch?v=O3dy9p4ybes
๋๋ ๋ํ ๋น๋์ค๋ฅผ ์ฌ์ํ๋ ๋ฐ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ฌดํํ ๋ก๋๋๊ณ ์๋๋ฐ ์ด์ ๋ฅผ ์ ์ ์์ต๋๋ค.
๋ํ ๊ฐ์ ๋ฌธ์
๋์ผํ ๋ฌดํ ๋ก๋ฉ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์๋ฎฌ๋ ์ดํฐ์์๋ ์๋ํ์ง๋ง ์ค์ ์ฅ์น์์๋ ์๋ํ์ง ์์ต๋๋ค.
์๋
ํ์ธ์ @santhoshisrimanthula
๋์์ด ๋๋ ๊ฒฝ์ฐ. ๋๋ ๋น์ ์ ์ข์ ์ ๋๋ ์ ์์ต๋๋ค lol.
๊ทธ๋์. ์ต์ ๋ฒ์ ์ ์ผ๋ถ ํด๋ํฐ์์ ์๋ํ๋ฉฐ ๋ค๋ฅธ ํด๋ํฐ์์๋ ์๋ํ์ง ์์ต๋๋ค.
์๋๋ก์ด๋ ๋ฒ์ ๊ณผ ๊ด๋ จ์ด ์๋ ๊ฒ ๊ฐ์์
youtube_player_flutter: ^6.1.1
๋ฒ์ ์ผ๋ก ๋ค์ด๊ทธ๋ ์ด๋ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
๋๋ฒ๊ทธ ๋งค๋ํ์คํธ์ ๋ํด์๋ง ์ธํฐ๋ท ๊ถํ์ด ์์์ต๋๋ค. ๊ธฐ๋ณธ ๋งค๋ํ์คํธ์ ์ธํฐ๋ท ๊ถํ์ ์ถ๊ฐํ ํ ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
Android Pixel 2 XL ์๋ฎฌ๋ ์ดํฐ์์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. v6.1.1๋ก ๋ค์ด๊ทธ๋ ์ด๋ํ๋ฉด ๋น๋์ค๊ฐ ๋ก๋๋ฉ๋๋ค.
minSdk๋ฒ์ 21
webview_flutter๋ฅผ ํฌํจํ์ง ์์ต๋๋ค.
์ด๊ธฐํ๋ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.