걸음 카드 보상 칸 · Music Shake 이어하기 재생
This commit is contained in:
@@ -6,6 +6,7 @@ import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
import 'package:webview_flutter_android/webview_flutter_android.dart';
|
||||
import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart';
|
||||
|
||||
import '../../core/i18n/app_locale.dart';
|
||||
@@ -292,7 +293,9 @@ class YoutubeEmbed extends StatefulWidget {
|
||||
!Platform.environment.containsKey('FLUTTER_TEST');
|
||||
|
||||
@visibleForTesting
|
||||
static String html(String videoId, {int startSeconds = 0}) =>
|
||||
/// [resumeAt] 이 있으면 「이어하기」 — 플레이어가 준비되면 그 자리(밀리초까지)로 옮겨 바로 튼다.
|
||||
/// 처음 시작은 지금처럼 사용자가 재생 버튼을 누른다.
|
||||
static String html(String videoId, {int startSeconds = 0, Duration? resumeAt}) =>
|
||||
'''
|
||||
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<style>html,body{margin:0;height:100%;background:#000}#p{width:100%;height:100%}</style></head>
|
||||
@@ -302,7 +305,8 @@ function post(s){Player.postMessage(JSON.stringify({s:s,t:player.getCurrentTime(
|
||||
function onYouTubeIframeAPIReady(){
|
||||
player=new YT.Player('p',{videoId:${jsonEncode(videoId)},
|
||||
playerVars:{playsinline:1,rel:0,start:$startSeconds,origin:'$appOrigin'},
|
||||
events:{onStateChange:function(e){post(e.data);},
|
||||
events:{onReady:function(){${resumeAt == null ? '' : 'player.seekTo(${resumeAt.inMilliseconds / 1000},true);player.playVideo();'}},
|
||||
onStateChange:function(e){post(e.data);},
|
||||
onError:function(e){Player.postMessage(JSON.stringify({err:e.data}));}}});
|
||||
setInterval(function(){if(player&&player.getPlayerState&&player.getPlayerState()==1)post(1);},500);
|
||||
}
|
||||
@@ -321,16 +325,32 @@ class _YoutubeEmbedState extends State<YoutubeEmbed> {
|
||||
super.initState();
|
||||
if (!YoutubeEmbed.enabled) return;
|
||||
final params = WebViewPlatform.instance is WebKitWebViewPlatform
|
||||
? WebKitWebViewControllerCreationParams(allowsInlineMediaPlayback: true)
|
||||
? WebKitWebViewControllerCreationParams(
|
||||
allowsInlineMediaPlayback: true,
|
||||
// 「이어하기」 자동 재생 — 사용자 탭 없이 재생을 허용한다.
|
||||
mediaTypesRequiringUserAction: const <PlaybackMediaTypes>{},
|
||||
)
|
||||
: const PlatformWebViewControllerCreationParams();
|
||||
_web = WebViewController.fromPlatformCreationParams(params)
|
||||
final web = _web = WebViewController.fromPlatformCreationParams(params)
|
||||
..setJavaScriptMode(JavaScriptMode.unrestricted)
|
||||
..setBackgroundColor(Colors.black)
|
||||
..addJavaScriptChannel('Player', onMessageReceived: _onMessage)
|
||||
..loadHtmlString(
|
||||
YoutubeEmbed.html(widget.videoId, startSeconds: widget.start.inSeconds),
|
||||
..addJavaScriptChannel('Player', onMessageReceived: _onMessage);
|
||||
// Android WebView 는 기본으로 탭 없는 재생을 막는다 — 이어하기 자동 재생을 위해 푼다.
|
||||
// 불러오기 전에 설정해야 첫 문서에 적용된다.
|
||||
if (web.platform case final AndroidWebViewController android) {
|
||||
unawaited(android.setMediaPlaybackRequiresUserGesture(false));
|
||||
}
|
||||
unawaited(
|
||||
web.loadHtmlString(
|
||||
YoutubeEmbed.html(
|
||||
widget.videoId,
|
||||
startSeconds: widget.start.inSeconds,
|
||||
// 이어하기(멈춘 자리가 있음)면 저장 위치로 옮겨 자동 재생한다(10/6 실기기 A-2).
|
||||
resumeAt: widget.start > Duration.zero ? widget.start : null,
|
||||
),
|
||||
baseUrl: YoutubeEmbed.appOrigin,
|
||||
);
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _onMessage(JavaScriptMessage m) {
|
||||
|
||||
Reference in New Issue
Block a user