From e1152b0274e1614d57db92285fe2ffd883b004cd Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Thu, 3 Nov 2022 09:18:56 +0800 Subject: [PATCH 01/19] =?UTF-8?q?hyzp=5Fybqx-Commit175=EF=BC=9A=E7=94=B1?= =?UTF-8?q?=E4=BA=8E=E8=85=BE=E8=AE=AF=E6=92=AD=E6=94=BE=E5=99=A8SDK?= =?UTF-8?q?=E5=9C=A82022-10-11=E8=BF=9B=E8=A1=8C=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=EF=BC=8C=E5=AF=BC=E8=87=B4hyzp=5Fybqx=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E5=87=BA=E7=8E=B0=E4=B8=8B=E9=9D=A2=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E3=80=82=E5=B0=86=E4=B8=8B=E9=9D=A2=E6=96=87=E4=BB=B6?= =?UTF-8?q?=20\hyzp=5Fybqx\lib\my=5Fflutter=5Fsuperplayer\android\src\main?= =?UTF-8?q?\java\com\tencent\liteav\demo\superplayer\model\SuperPlayerImpl?= =?UTF-8?q?.java=20=E4=B8=AD=E7=9A=84TXLivePlayer=20=E7=9A=84=20startPlay?= =?UTF-8?q?=20=E5=8F=98=E6=9B=B4=E4=B8=BA=20startLivePlay=EF=BC=8C?= =?UTF-8?q?=E5=B0=86TXVodPlayer=20=E7=9A=84=20startPlay=20=E5=8F=98?= =?UTF-8?q?=E6=9B=B4=E4=B8=BA=20startVodPlay=EF=BC=8C=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 编译报错: Launching lib\main.dart on Android SDK built for x86 in debug mode... Running Gradle task 'assembleDebug'... R:\FlutterProject\FlutterProject61-hyzp_ybqx_with_ios\hyzp_ybqx\lib\my_flutter_superplayer\android\src\main\java\com\tencent\liteav\demo\superplayer\model\SuperPlayerImpl.java:401: ����: �Ҳ������� int result = mLivePlayer.startPlay(url, playType); // result����ֵ��0 success; -1 empty url; -2 invalid url; -3 invalid playType; ^ ����: ���� startPlay(String,int) λ��: ����ΪTXLivePlayer�ı��� mLivePlayer R:\FlutterProject\FlutterProject61-hyzp_ybqx_with_ios\hyzp_ybqx\lib\my_flutter_superplayer\android\src\main\java\com\tencent\liteav\demo\superplayer\model\SuperPlayerImpl.java:452: ����: �Ҳ������� ret = mVodPlayer.startPlay(Uri.decode(newUri.toString())); ^ ����: ���� startPlay(String) λ��: ����ΪTXVodPlayer�ı��� mVodPlayer R:\FlutterProject\FlutterProject61-hyzp_ybqx_with_ios\hyzp_ybqx\lib\my_flutter_superplayer\android\src\main\java\com\tencent\liteav\demo\superplayer\model\SuperPlayerImpl.java:454: ����: �Ҳ������� ret = mVodPlayer.startPlay(url); ^ ����: ���� startPlay(String) λ��: ����ΪTXVodPlayer�ı��� mVodPlayer R:\FlutterProject\FlutterProject61-hyzp_ybqx_with_ios\hyzp_ybqx\lib\my_flutter_superplayer\android\src\main\java\com\tencent\liteav\demo\superplayer\model\SuperPlayerImpl.java:859: ����: �Ҳ������� mVodPlayer.startPlay(quality.url); ^ ����: ���� startPlay(String) λ��: ����ΪTXVodPlayer�ı��� mVodPlayer ע: ijЩ�����ļ�ʹ�û򸲸����ѹ�ʱ�� API�� ע: �й���ϸ��Ϣ, ��ʹ�� -Xlint:deprecation ���±��롣 ע: ijЩ�����ļ�ʹ����δ�����򲻰�ȫ�IJ����� ע: �й���ϸ��Ϣ, ��ʹ�� -Xlint:unchecked ���±��롣 4 ������ FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':flutter_superplayer:compileDebugJavaWithJavac'. > Compilation failed; see the compiler error output for details. * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 6s Exception: Gradle task assembleDebug failed with exit code 1 --- .../demo/superplayer/model/SuperPlayerImpl.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/my_flutter_superplayer/android/src/main/java/com/tencent/liteav/demo/superplayer/model/SuperPlayerImpl.java b/lib/my_flutter_superplayer/android/src/main/java/com/tencent/liteav/demo/superplayer/model/SuperPlayerImpl.java index 7fc5c74..e3753f1 100644 --- a/lib/my_flutter_superplayer/android/src/main/java/com/tencent/liteav/demo/superplayer/model/SuperPlayerImpl.java +++ b/lib/my_flutter_superplayer/android/src/main/java/com/tencent/liteav/demo/superplayer/model/SuperPlayerImpl.java @@ -398,7 +398,10 @@ public class SuperPlayerImpl implements SuperPlayer, ITXVodPlayListener, ITXLive mCurrentPlayVideoURL = url; if (mLivePlayer != null) { mLivePlayer.setPlayListener(this); - int result = mLivePlayer.startPlay(url, playType); // result返回值:0 success; -1 empty url; -2 invalid url; -3 invalid playType; + // 由于腾讯播放器SDK在2022-10-11进行更新,导致hyzp_ybqx项目编译出现下面报错。将下面文件 + //\hyzp_ybqx\lib\my_flutter_superplayer\android\src\main\java\com\tencent\liteav\demo\superplayer\model\SuperPlayerImpl.java + //中的TXLivePlayer 的 startPlay 变更为 startLivePlay,将TXVodPlayer 的 startPlay 变更为 startVodPlay,问题解决。 + int result = mLivePlayer.startLivePlay(url, playType); // result返回值:0 success; -1 empty url; -2 invalid url; -3 invalid playType; if (result != 0) { TXCLog.e(TAG, "playLiveURL videoURL:" + url + ",result:" + result); } else { @@ -449,9 +452,9 @@ public class SuperPlayerImpl implements SuperPlayer, ITXVodPlayListener, ITXLive query += "spfileid=" + mFileId + "&spdrmtype=" + drmType + "&spappid=" + mAppId; Uri newUri = uri.buildUpon().query(query).build(); TXCLog.i(TAG, "playVodURL: newurl = " + Uri.decode(newUri.toString()) + " ;url= " + url); - ret = mVodPlayer.startPlay(Uri.decode(newUri.toString())); + ret = mVodPlayer.startVodPlay(Uri.decode(newUri.toString())); } else { - ret = mVodPlayer.startPlay(url); + ret = mVodPlayer.startVodPlay(url); } if (ret == 0) { @@ -856,7 +859,7 @@ public class SuperPlayerImpl implements SuperPlayer, ITXVodPlayListener, ITXLive mVodPlayer.stopPlay(true); TXCLog.i(TAG, "onQualitySelect quality.url:" + quality.url); mVodPlayer.setStartTime(currentTime); - mVodPlayer.startPlay(quality.url); + mVodPlayer.startVodPlay(quality.url); } else { //br!=0;index!=-1;url=null TXCLog.i(TAG, "setBitrateIndex quality.index:" + quality.index); // 说明是多bitrate的m3u8子流,会自动无缝seek From 1a421ba40b064bafb148b5ec05176fb3957754a9 Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Thu, 3 Nov 2022 09:20:21 +0800 Subject: [PATCH 02/19] =?UTF-8?q?hyzp=5Fybqx-Commit176=EF=BC=9A=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/my_flutter_drag_scale/example/test/widget_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/my_flutter_drag_scale/example/test/widget_test.dart b/lib/my_flutter_drag_scale/example/test/widget_test.dart index 0fb031a..be5e3af 100644 --- a/lib/my_flutter_drag_scale/example/test/widget_test.dart +++ b/lib/my_flutter_drag_scale/example/test/widget_test.dart @@ -8,12 +8,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_drag_scale_example/main.dart'; +// import 'package:flutter_drag_scale_example/main.dart'; void main() { testWidgets('Verify Platform version', (WidgetTester tester) async { // Build our app and trigger a frame. - await tester.pumpWidget(MyApp()); + // await tester.pumpWidget(MyApp()); // Verify that platform version is retrieved. expect( From b6a6d474d9be2fb2e2c83faa9a5a2679552da8d1 Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Wed, 9 Nov 2022 23:13:17 +0800 Subject: [PATCH 03/19] =?UTF-8?q?hyzp=5Fybqx-Commit177=EF=BC=9A=E5=B7=B2?= =?UTF-8?q?=E7=BB=8F=E5=AE=9E=E7=8E=B0=E8=BF=9D=E7=AB=A0=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E7=9A=84=E5=BE=AA=E7=8E=AF=E6=92=AD=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/widget/my_superplayer-0.0.3.dart | 739 +++++++++++++++++++++++++++ lib/widget/my_superplayer.dart | 184 ++++--- pubspec.lock | 7 + pubspec.yaml | 2 +- 4 files changed, 871 insertions(+), 61 deletions(-) create mode 100644 lib/widget/my_superplayer-0.0.3.dart diff --git a/lib/widget/my_superplayer-0.0.3.dart b/lib/widget/my_superplayer-0.0.3.dart new file mode 100644 index 0000000..9323294 --- /dev/null +++ b/lib/widget/my_superplayer-0.0.3.dart @@ -0,0 +1,739 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_screenutil/screen_util.dart'; +import 'package:flutter_superplayer/flutter_superplayer.dart'; +import 'package:flutterptcontrol/flutterptcontrol.dart'; +import 'package:hyzp_ybqx/components/commonFun.dart'; +import 'package:hyzp_ybqx/components/dioFun.dart'; +import 'package:hyzp_ybqx/provider/player_ratio.dart'; +import 'package:hyzp_ybqx/provider/player_region.dart'; +import 'package:provider/provider.dart'; + +import '../components/commonFun.dart'; +import '../services/Storage.dart'; + +const _kControlViewTypes = [kControlViewTypeDefault, kControlViewTypeWithout]; + +class SuperPlayerPage extends StatefulWidget { + SuperPlayerPage( + {@required this.url, + this.id = -2, // 播放点位视频的点位编号,-2 表示播放违章视频 + this.dwip = '', // 点位IP,用于点位视频控制球机方向 + this.loop = 1, + this.title = 'Tencent Player', + Key key}) + : super(key: key); + String dwip; + String url; + String title; + int loop; //设置播放循环,默认播放器的循环次数是1, 即不循环播放。如果设置循环次数0,表示无限循环。 + int id; + + @override + _SuperPlayerPageState createState() => _SuperPlayerPageState(); +} + +class _SuperPlayerPageState extends State with SuperPlayerListener { + SuperPlayerController _playerController = SuperPlayerController(); + + String _sdkVersion = 'Unknown'; + List _logs = []; + bool bFullScreen = false; + + String _controlViewType = _kControlViewTypes.first; + + @override + void dispose() { + Playing = false; + // 云台控制代码:1:停止动作、3:启动雨刷、11:焦距变大、12:焦距变小 + setSphericalCameraDio(id: widget.id, dwip: widget.dwip, cmdCode: 1); + super.dispose(); + } + + @override + void initState() { + super.initState(); + //initPlatformState(); + // Future.delayed(const Duration(milliseconds: 1000), () { + // _playerController.playWithModel(SuperPlayerModel(url: widget.url)); + // setState(() { + // }); + // }); + init(); + } + + Future init() async { + await _playerController.addListener(this); + await initPlatformState(); + if (!mounted) return; + print('mounted = ${mounted}'); + // 开启调试日志 + //await FTXPlayerController.setConsoleEnabled(true); + // 初始化播放器 + //await _controller.initialize(onlyAudio: true); + + await _playerController.uiHideDanmu(); // 隐藏弹幕 + //设置播放循环,默认播放器的循环次数是1, 即不循环播放。如果设置循环次数0,表示无限循环。 + if (0 == widget.loop) { + await _playerController.setLoop(true); + } + + await _playerController.playWithModel(testSuperPlayerModel); + //_controller.play("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"); + // _controller + // .play('rtmp://125.64.218.67:9901/rtp/gb_play_34020000001320003016_34020000001320003016'); + // 设置循环播放 + //await _controller.setLoop(true); + // 开始播放 + //await _controller.play("http://125.64.218.67:9908/video/2_6063_20210409_140608_川Q31715.mp4"); + } + + SuperPlayerModel get testSuperPlayerModel { + // int appId = 1252463788; + // String fileId = "5285890781763144364"; + + SuperPlayerModel superPlayerModel = SuperPlayerModel( + url: widget.url, + // appId: appId, + // videoId: SuperPlayerVideoId(fileId: fileId), + ); + return superPlayerModel; + } + + // Platform messages are asynchronous, so we initialize in an async method. + Future initPlatformState() async { + String sdkVersion; + // Platform messages may fail, so we use a try/catch PlatformException. + try { + sdkVersion = await FlutterSuperPlayer.sdkVersion; + } on PlatformException { + sdkVersion = 'Failed to get platform version.'; + } + print('sdkVersion = ${sdkVersion}'); + print('mounted = ${mounted}'); + + // If the widget was removed from the tree while the asynchronous platform + // message was in flight, we want to discard the reply rather than calling + // setState to update our non-existent appearance. + if (!mounted) return; + + setState(() { + _sdkVersion = sdkVersion; + }); + } + + void _addLog(String method, dynamic data) { + _logs.add('>>>$method'); + if (data != null) { + _logs.add(data is Map ? json.encode(data) : data); + } + _logs.add(' '); + + setState(() {}); + } + + PlayerRatioProvide playerRatioProvide; + + @override + Widget build(BuildContext context) { + playerRegionProvide = Provider.of(context); + playerRatioProvide = Provider.of(context); + // List listData = getDataListControl2(); + double btnHeight1 = 70; //第一按钮行高度 + double btnHeight2 = 160; //第二按钮行高度 + int btnCount = 4; //每行按钮个数 + // int btnCount3 = listData.length; //每行按钮个数 + var mediaSize = MediaQuery.of(context).size; + + // widget.id:播放点位视频的点位编号,-2 表示播放违章视频 + double btn_left = -2 == widget.id ? 347 : 70; //第一按钮行高度 + double btn_gap = -2 == widget.id ? 104 : 70; //第一按钮行高度 + + //远程控制球机方向按钮外半径和内半径 + double _outerRadius = 270; + double _innerRadius = _outerRadius / 2; + + //double barHeight = bFullScreen ? 0 : MediaQueryData.fromWindow(window).padding.top; + return Scaffold( + appBar: bFullScreen + ? null + : PreferredSize( + preferredSize: Size.fromHeight(ScreenUtil().setHeight(173)), // 设置appBar高度 + // 设置appBar高度 + child: AppBar( + automaticallyImplyLeading: false, + centerTitle: true, + titleSpacing: 0.0, + //设置title的左边距 + flexibleSpace: Container( + //SizedBox(height: ScreenUtil().statusBarHeight), //显示顶部状态栏 + // SizedBox(height: ScreenUtil().setHeight(10)), //显示顶部状态栏 + padding: EdgeInsets.only(top: ScreenUtil().statusBarHeight), //留出顶部状态栏高度 + child: Container( + //height: ScreenUtil().setHeight(173), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + colors: [ + Color.fromRGBO(12, 186, 156, 1), + Color.fromRGBO(39, 127, 235, 1), + ], + ), + ), + // decoration: BoxDecoration( + // gradient: LinearGradient(colors: [ + // Color(0xFF0018EB), + // Color(0xFF01C1D9), + // ], begin: Alignment.bottomCenter, end: Alignment.topCenter), + // ), + ), + ), + title: Padding( + padding: EdgeInsets.only(left: 0, right: 0), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + getIconAndTextButton( + iconColor: Colors.white, + iconData: Icons.chevron_left_outlined, + onPress: () { + getingDwVideo = false; + Navigator.pop(context); + }, + ), + Expanded( + child: Text(widget.title, + style: TextStyle(color: Colors.white, fontSize: 18), + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis), + ), + SizedBox(width: 50), + ], + ), + ), + ), + ), + body: WillPopScope( + child: Container( + // height: ScreenUtil().screenHeight - + // ScreenUtil().statusBarHeight - + // ScreenUtil().bottomBarHeight, + color: Color.fromRGBO(224, 224, 224, 1), + child: Column( + children: [ + //第2行组件,视频播放区 + Center( + child: Container( + //padding: EdgeInsets.only(top: barHeight), + alignment: Alignment(0, -1), + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.width * (9 / 16), + color: Colors.black, + child: Stack( + children: [ + _playState <= 2 ? getMoreWidget(strokeWidth: 3.0) : SizedBox.shrink(), + SuperPlayerView( + controller: _playerController, + controlViewType: _kControlViewTypes[0], + ), + //_playState < 3 ? SizedBox.shrink() : getMoreWidget(strokeWidth: 3.0), + ], + ), + ), + ), + //第3.1行组件,控制按钮区 + bFullScreen ? SizedBox.shrink() : SizedBox(height: ScreenUtil().setHeight(69)), + bFullScreen + ? SizedBox.shrink() + : Row( + children: [ + SizedBox(width: ScreenUtil().setWidth(btn_left)), + getRoundButton( + //(bPlaying) ? '暂停' : '播放', + text: playerRegionProvide.playerText, + icon: playerRegionProvide.playerIcon, + diameter: 130, + onPress: playOrPause, + ), + SizedBox(width: ScreenUtil().setWidth(btn_gap)), + getRoundButton( + text: '刷新', + icon: Icons.autorenew, + diameter: 130, + onPress: () { + restartPlay(urlnew); + }, + ), + // widget.id:播放点位视频的点位编号,-2 表示播放违章视频 + -2 == widget.id + ? SizedBox.shrink() + : SizedBox(width: ScreenUtil().setWidth(btn_gap)), + -2 == widget.id + ? SizedBox.shrink() + : getRoundButton_image( + text: '雨刷', + image_path: 'assets/images/wiper.png', + diameter: 130, + onPress: () { + // 云台控制代码:1:停止动作、3:启动雨刷、11:焦距变大、12:焦距变小 + setSphericalCameraDio( + id: widget.id, dwip: widget.dwip, cmdCode: 3); + }, + ), + -2 == widget.id + ? SizedBox.shrink() + : SizedBox(width: ScreenUtil().setWidth(btn_gap)), + -2 == widget.id + ? SizedBox.shrink() + : getRoundButton_image( + text: '放大', + image_path: 'assets/images/zoom_in.png', + imageSize: 72, + diameter: 130, + onPress: () { + // 云台控制代码:1:停止动作、3:启动雨刷、11:焦距变大、12:焦距变小 + setSphericalCameraDio( + id: widget.id, dwip: widget.dwip, cmdCode: 11); + }, + ), + -2 == widget.id + ? SizedBox.shrink() + : SizedBox(width: ScreenUtil().setWidth(btn_gap)), + -2 == widget.id + ? SizedBox.shrink() + : getRoundButton_image( + text: '缩小', + image_path: 'assets/images/zoom_out.png', + imageSize: 72, + diameter: 130, + onPress: () { + // 云台控制代码:1:停止动作、3:启动雨刷、11:焦距变大、12:焦距变小 + setSphericalCameraDio( + id: widget.id, dwip: widget.dwip, cmdCode: 12); + }, + ), + ], + ), + bFullScreen ? SizedBox.shrink() : SizedBox(height: ScreenUtil().setHeight(79)), + bFullScreen + ? SizedBox.shrink() + : Container( + height: ScreenUtil().setHeight(2 * _outerRadius), + width: ScreenUtil().setWidth(2 * _outerRadius), + child: PtControlWidget( + // innerRadius: _innerRadius, + // outerRadius: _outerRadius, + // 进行像素单位转换,解决按钮响应错乱问题 + innerRadius: _innerRadius / ScreenUtil().pixelRatio, + outerRadius: _outerRadius / ScreenUtil().pixelRatio, + callback: -2 == widget.id // 播放点位视频的点位编号,-2 表示播放违章视频 + ? null + : (status) { + ///点击回调 + print('status = $status'); + switch (status) { + + /// status == -1 超出范围 + /// status == 0 右 + case 0: + setSphericalCameraDio( + id: widget.id, dwip: widget.dwip, cmdCode: 24); + break; + + /// status == 1 右上 + case 1: + setSphericalCameraDio( + id: widget.id, dwip: widget.dwip, cmdCode: 26); + break; + + ///三、球机位移接口方向代码说明: + // 上:8 下:4 左:2 右:1 左上:10 左下:6 右上:9 右下:5 + + // 云台控制代码:1:停止动作、3:启动雨刷、11:焦距变大、12:焦距变小 + // 21:上移 + // 22:下移 + // 23:左移 + // 24:右移 + // 25:左上移动 + // 26:右上移动 + // 27:左下移动 + // 28:右下移动 + /// status == 2 上 + case 2: + setSphericalCameraDio( + id: widget.id, dwip: widget.dwip, cmdCode: 21); + break; + + /// status == 3 左上 + case 3: + setSphericalCameraDio( + id: widget.id, dwip: widget.dwip, cmdCode: 25); + break; + + /// status == 4 左 + case 4: + setSphericalCameraDio( + id: widget.id, dwip: widget.dwip, cmdCode: 23); + break; + + /// status == 5 左下 + case 5: + setSphericalCameraDio( + id: widget.id, dwip: widget.dwip, cmdCode: 27); + break; + + /// status == 6 下 + case 6: + setSphericalCameraDio( + id: widget.id, dwip: widget.dwip, cmdCode: 22); + break; + + /// status == 7 右下 + case 7: + setSphericalCameraDio( + id: widget.id, dwip: widget.dwip, cmdCode: 28); + break; + + /// status == 8 还原 + case 8: + break; + default: + break; + } + }, + ), + // child: GridView.custom( + // // padding: EdgeInsets.only( + // // left: ScreenUtil().setWidth(35), right: ScreenUtil().setWidth(35)), + // gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + // crossAxisCount: btnCount3, + // mainAxisSpacing: 0, + // crossAxisSpacing: 1, + // childAspectRatio: ratio3, + // ), + // childrenDelegate: SliverChildBuilderDelegate((context, position) { + // return getItemContainer(listData[position]); + // }, childCount: btnCount3)), + ), + //SizedBox(height: ScreenUtil().setHeight(49)), + //Divider(color: Colors.blue), + //第4行组件,分隔栏 + // Container( + // //height: 11, + // height: ScreenUtil().setHeight(28), + // color: Color.fromRGBO(224, 224, 224, 1), + // ), + ], + ), + ), + onWillPop: () { + Playing = false; + getingDwVideo = false; + // 云台控制代码:1:停止动作、3:启动雨刷、11:焦距变大、12:焦距变小 + setSphericalCameraDio(id: widget.id, dwip: widget.dwip, cmdCode: 1); + Navigator.pop(context); //关闭弹框,播放输入视频地址 + }, + ), + ); + } + + @override + void onClickFloatCloseBtn() { + _addLog('onClickFloatCloseBtn', {}); + } + + @override + void onClickSmallReturnBtn() { + _addLog('onClickSmallReturnBtn', {}); + Navigator.maybePop(context); + } + + @override + void onFullScreenChange(bool isFullScreen) { + _addLog('onFullScreenChange', {'isFullScreen': isFullScreen}); + bFullScreen = !bFullScreen; + setState(() {}); + } + + @override + void onPlayProgressChange(int current, int duration) { + _addLog('onPlayProgressChange', {'current': current, 'duration': duration}); + } + + int _playState = 4; + int i = 0; + + @override + void onPlayStateChange(int playState) { + _playState = playState; + i++; + print('$i、playState = $playState'); + _addLog('onPlayStateChange', {'playState': playState}); + setPlayOrPauseIcon(playState); + } + + void setPlayOrPauseIcon(int state) { + //state : 1 播放状态,2 暂停状态 + print('state = $state'); + if (1 == state) { + bPlaying = true; + } else { + bPlaying = false; + } + playerRegionProvide.changePlayerState(bPlaying); + Storage.setString('bPlaying', bPlaying ? 'true' : 'false'); + setState(() {}); + } + + @override + void onStartFloatWindowPlay() { + _addLog('onStartFloatWindowPlay', {}); + } + + //生成圆形按钮部件,基于图标 + Widget getRoundButton( + {double diameter = 144, + double marginVer = 10, + String text, + IconData icon, + double fontSize = 16, + double iconSize = 90, + Color color = const Color.fromRGBO(52, 157, 237, 1), + var onPress}) { + return InkWell( + onTap: onPress, + child: Column( + children: [ + Container( + width: ScreenUtil().setWidth(diameter), + height: ScreenUtil().setHeight(diameter), + alignment: Alignment.center, + child: Icon( + icon, + size: ScreenUtil().setWidth(iconSize), + color: Color.fromRGBO(52, 157, 237, 1), + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(200)), + border: Border.all(width: 0, style: BorderStyle.none), + ), + ), + SizedBox(height: ScreenUtil().setHeight(marginVer)), + Text(text, style: TextStyle(fontSize: fontSize, color: Color.fromRGBO(139, 139, 139, 1))), + ], + ), + ); + } + + //生成圆形按钮部件,基于图片 + Widget getRoundButton_image( + {double diameter = 144, + double marginVer = 10, + String text, + String image_path, + double fontSize = 16, + double imageSize = 90, + Color color = const Color.fromRGBO(52, 157, 237, 1), + Color color_bkg = Colors.white, + var onPress}) { + return InkWell( + onTap: onPress, + child: Column( + children: [ + Container( + width: ScreenUtil().setWidth(diameter), + height: ScreenUtil().setHeight(diameter), + alignment: Alignment.center, + child: Image.asset(image_path, + fit: BoxFit.fitWidth, + width: ScreenUtil().setWidth(imageSize), + //height: ScreenUtil().setWidth(iconSize), + color: Color.fromRGBO(52, 157, 237, 1)), + // child: Icon( + // icon, + // size: ScreenUtil().setWidth(iconSize), + // color: Color.fromRGBO(52, 157, 237, 1), + // ), + decoration: BoxDecoration( + color: color_bkg, + borderRadius: BorderRadius.all(Radius.circular(200)), + border: Border.all(width: 0, style: BorderStyle.none), + ), + ), + SizedBox(height: ScreenUtil().setHeight(marginVer)), + Text(text, style: TextStyle(fontSize: fontSize, color: Color.fromRGBO(139, 139, 139, 1))), + ], + ), + ); + } + + bool bPlaying = true; + + void playOrPause() { + //state : 1 播放状态,2 暂停状态 + _playerController.getPlayState().then((state) { + print('state = $state'); + if (1 == state) { + bPlaying = false; + _playerController.pause(); + } else { + bPlaying = true; + _playerController.resume(); + } + playerRegionProvide.changePlayerState(bPlaying); + Storage.setString('bPlaying', bPlaying ? 'true' : 'false'); + setState(() {}); + }); + } + + void restartPlay(String url) async { + _playState = 4; + bPlaying = true; + _playerController.resetPlayer(); + _playerController.resume(); + // //writeCurrentPosFile(); + // await player.stop(); + // await player.reset(); + // await player.setOption(FijkOption.playerCategory, "mediacodec-all-videos", 1); + // await player.setOption(FijkOption.hostCategory, "enable-snapshot", 1); + // await player.setOption(FijkOption.hostCategory, "request-screen-on", 1); + // await player.setOption(FijkOption.hostCategory, "request-audio-focus", 1); + // await player.setOption(FijkOption.hostCategory, "enable-accurate-seek", 1); + // await player.setOption(FijkOption.hostCategory, "max-buffer-size", 500 * 1024); + // await player.setDataSource(url, autoPlay: true).catchError((e) { + // print("setDataSource error: $e"); + // }); + // await player.setLoop(widget.loop); //设置播放循环,默认播放器的循环次数是1, 即不循环播放。如果设置循环次数0,表示无限循环。 + // bPlaying = true; + // setState(() {}); + // playerRegionProvide.changePlayerState(bPlaying); + } + + //生成播放控制区第2行按钮List +// List getDataListControl2() { +// double _diameter = 100; +// double _iconSize = 70; +// double _fontSize = 14; +// double _marginVer = 8; +// +// List list = [ +// // getRoundButton( +// // diameter: _diameter, +// // iconSize: _iconSize, +// // text: '快退', +// // icon: Icons.fast_rewind, +// // onPress: () { +// // fastSeek(false); +// // }, +// // ), +// // getRoundButton( +// // diameter: _diameter, +// // iconSize: _iconSize, +// // text: '快进', +// // icon: Icons.fast_forward, +// // onPress: () { +// // fastSeek(true); +// // }, +// // ), +// getRoundButton( +// diameter: _diameter, +// iconSize: _iconSize, +// fontSize: _fontSize, +// marginVer: _marginVer, +// text: '放大', +// icon: Icons.zoom_in, +// onPress: () { +// //print('Icons.videocam'); +// //_inputDialog(context2); +// if (10 >= playerRatioProvide.scale) { +// playerRatioProvide.changeScale(playerRatioProvide.scale + 0.5); +// } +// }, +// ), +// getRoundButton( +// diameter: _diameter, +// iconSize: _iconSize, +// fontSize: _fontSize, +// marginVer: _marginVer, +// text: '缩小', +// icon: Icons.zoom_out, +// onPress: () { +// //print('Icons.videocam'); +// //_getFileDialog(context2); +// if (1 < playerRatioProvide.scale) { +// playerRatioProvide.changeScale(playerRatioProvide.scale - 0.5); +// } +// }, +// ), +// // _getIconAndTextButton( +// // '还原', +// // Icons.reply, +// // Colors.orange, +// // () { +// // //print('Icons.videocam'); +// // //_getFileDialog(context2); +// // // 更新当前位置 +// // playerRatioProvide.changeScale(1.0); +// // playerRatioProvide.changeOffset(Offset(0, 0)); +// // playerRatioProvide.changeDeltaX(0.0); +// // playerRatioProvide.changeDeltaY(0.0); +// // }, +// // ), +// getRoundButton( +// diameter: _diameter, +// iconSize: _iconSize, +// fontSize: _fontSize, +// marginVer: _marginVer, +// text: '截图', +// icon: Icons.camera_alt, +// onPress: () { +// //通过上面定义的key,才能准确调用该类型的该对象的方法 +// //_myFijkPanelWidgetBuilderStateKey.currentState.takeSnapshot(); +// //_fijkPanelWidgetBuilder.currentState..takeSnapshot(); +// takeSnapshot(); +// }, +// ), +// getRoundButton( +// diameter: _diameter, +// iconSize: _iconSize, +// fontSize: _fontSize, +// marginVer: _marginVer, +// text: '全屏', +// icon: Icons.fullscreen, +// onPress: () { +// //player.enterFullScreen(); +// _playerController.toFullScreen(); +// }, +// ), +// ]; +// return list; +// } + + void takeSnapshot() { + // player.takeSnapShot().then((v) { + // var provider = MemoryImage(v); + // precacheImage(provider, context).then((_) { + // setState(() { + // myImageProvider = provider; + // }); + // }); + // FijkLog.d("get snapshot succeed"); + // + // //Uint8List fileData; + // String fileFath; + // ImageSaver.save('extended_image_cropped_image.jpg', v).then((value) { + // fileFath = value; + // // var fileFath = await ImagePickerSaver.saveFile(fileData: fileData); + // print('my save fileFath : $fileFath'); + // }); + // }).catchError((e) { + // FijkLog.d("get snapshot failed"); + // }); + } +} diff --git a/lib/widget/my_superplayer.dart b/lib/widget/my_superplayer.dart index 9323294..c04d545 100644 --- a/lib/widget/my_superplayer.dart +++ b/lib/widget/my_superplayer.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:ui'; +import 'package:fijkplayer/fijkplayer.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/screen_util.dart'; @@ -38,7 +39,8 @@ class SuperPlayerPage extends StatefulWidget { } class _SuperPlayerPageState extends State with SuperPlayerListener { - SuperPlayerController _playerController = SuperPlayerController(); + // SuperPlayerController _playerController = SuperPlayerController(); + final FijkPlayer _playerController = FijkPlayer(); String _sdkVersion = 'Unknown'; List _logs = []; @@ -63,35 +65,78 @@ class _SuperPlayerPageState extends State with SuperPlayerListe // setState(() { // }); // }); - init(); + // init(); + + _playerController.setOption(FijkOption.hostCategory, "enable-snapshot", 1); + _playerController.setOption(FijkOption.playerCategory, "mediacodec-all-videos", 1); + startPlay(); } - Future init() async { - await _playerController.addListener(this); - await initPlatformState(); + void startPlay() async { + // await _playerController.addListener(() {}); + if (!mounted) return; print('mounted = ${mounted}'); - // 开启调试日志 - //await FTXPlayerController.setConsoleEnabled(true); - // 初始化播放器 - //await _controller.initialize(onlyAudio: true); - - await _playerController.uiHideDanmu(); // 隐藏弹幕 - //设置播放循环,默认播放器的循环次数是1, 即不循环播放。如果设置循环次数0,表示无限循环。 - if (0 == widget.loop) { - await _playerController.setLoop(true); + + await _playerController.setLoop(widget.loop); // 0无限循环,1循环一次,2循环两次,以此类推 + if (widget.loop == 0) { + await _playerController.setOption(FijkOption.playerCategory, "mediacodec-all-videos", 1); + await _playerController.setOption(FijkOption.hostCategory, "enable-snapshot", 1); + await _playerController.setOption(FijkOption.hostCategory, "request-screen-on", 1); + await _playerController.setOption(FijkOption.hostCategory, "request-audio-focus", 1); + await _playerController.setOption(FijkOption.hostCategory, "enable-accurate-seek", 1); + } else { + /// fijkplayer播放点位视频延迟比较大优化-OK,改完后约1秒钟就能打开 - Being + // 是否开启预缓冲,一般直播项目会开启,达到秒开的效果,不过带来了播放丢帧卡顿的体验 + await _playerController.setOption(FijkOption.playerCategory, "packet-buffering", 0); + // 播放前的探测Size,默认是1024K(1M), 改小一点会出画面更快 + // await player.setOption(FijkOption.formatCategory, "probesize", 200); // 1.3S打开 + await _playerController.setOption(FijkOption.formatCategory, "probesize", 200); // 1.3S打开 + await _playerController.setOption(FijkOption.formatCategory, 'http-detect-range-support', 0); + // 设置播放前的探测时间 1,达到首屏秒开效果 + await _playerController.setOption(FijkOption.formatCategory, "analyzeduration", 1); + // 缩短播放的rtmp视频延迟在1s内 + await _playerController.setOption(FijkOption.formatCategory, "fflags", "nobuffer"); + // 支持硬解: 1 开启, O 关闭 + await _playerController.setOption(FijkOption.playerCategory, "mediacodec-hevc", 1); + + /// fijkplayer播放点位视频延迟比较大优化-OK,改完后半秒钟就能打开 - End + + await _playerController.setOption(FijkOption.hostCategory, "request-screen-on", 1); + await _playerController.setOption(FijkOption.hostCategory, "request-audio-focus", 1); } - await _playerController.playWithModel(testSuperPlayerModel); - //_controller.play("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"); - // _controller - // .play('rtmp://125.64.218.67:9901/rtp/gb_play_34020000001320003016_34020000001320003016'); - // 设置循环播放 - //await _controller.setLoop(true); - // 开始播放 - //await _controller.play("http://125.64.218.67:9908/video/2_6063_20210409_140608_川Q31715.mp4"); + await _playerController.setDataSource(widget.url, autoPlay: true).catchError((e) { + print("setDataSource error: $e"); + }); } + // Future init() async { + // await _playerController.addListener(this); + // await initPlatformState(); + // if (!mounted) return; + // print('mounted = ${mounted}'); + // // 开启调试日志 + // //await FTXPlayerController.setConsoleEnabled(true); + // // 初始化播放器 + // //await _controller.initialize(onlyAudio: true); + // + // await _playerController.uiHideDanmu(); // 隐藏弹幕 + // //设置播放循环,默认播放器的循环次数是1, 即不循环播放。如果设置循环次数0,表示无限循环。 + // if (0 == widget.loop) { + // await _playerController.setLoop(true); + // } + // + // await _playerController.playWithModel(testSuperPlayerModel); + // //_controller.play("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"); + // // _controller + // // .play('rtmp://125.64.218.67:9901/rtp/gb_play_34020000001320003016_34020000001320003016'); + // // 设置循环播放 + // //await _controller.setLoop(true); + // // 开始播放 + // //await _controller.play("http://125.64.218.67:9908/video/2_6063_20210409_140608_川Q31715.mp4"); + // } + SuperPlayerModel get testSuperPlayerModel { // int appId = 1252463788; // String fileId = "5285890781763144364"; @@ -105,26 +150,26 @@ class _SuperPlayerPageState extends State with SuperPlayerListe } // Platform messages are asynchronous, so we initialize in an async method. - Future initPlatformState() async { - String sdkVersion; - // Platform messages may fail, so we use a try/catch PlatformException. - try { - sdkVersion = await FlutterSuperPlayer.sdkVersion; - } on PlatformException { - sdkVersion = 'Failed to get platform version.'; - } - print('sdkVersion = ${sdkVersion}'); - print('mounted = ${mounted}'); - - // If the widget was removed from the tree while the asynchronous platform - // message was in flight, we want to discard the reply rather than calling - // setState to update our non-existent appearance. - if (!mounted) return; - - setState(() { - _sdkVersion = sdkVersion; - }); - } + // Future initPlatformState() async { + // String sdkVersion; + // // Platform messages may fail, so we use a try/catch PlatformException. + // try { + // sdkVersion = await FlutterSuperPlayer.sdkVersion; + // } on PlatformException { + // sdkVersion = 'Failed to get platform version.'; + // } + // print('sdkVersion = ${sdkVersion}'); + // print('mounted = ${mounted}'); + // + // // If the widget was removed from the tree while the asynchronous platform + // // message was in flight, we want to discard the reply rather than calling + // // setState to update our non-existent appearance. + // if (!mounted) return; + // + // setState(() { + // _sdkVersion = sdkVersion; + // }); + // } void _addLog(String method, dynamic data) { _logs.add('>>>$method'); @@ -237,10 +282,28 @@ class _SuperPlayerPageState extends State with SuperPlayerListe child: Stack( children: [ _playState <= 2 ? getMoreWidget(strokeWidth: 3.0) : SizedBox.shrink(), - SuperPlayerView( - controller: _playerController, - controlViewType: _kControlViewTypes[0], + // SuperPlayerView( + // controller: _playerController, + // controlViewType: _kControlViewTypes[0], + // ), + + FijkView( + //设置视频区域背景颜色-OK + color: Colors.black, + player: _playerController, + panelBuilder: fijkPanel2Builder(snapShot: true), + fsFit: FijkFit.fill, + // panelBuilder: simplestUI, + // panelBuilder: (FijkPlayer player, BuildContext context, + // Size viewSize, Rect texturePos) { + // return CustomFijkPanel( + // player: player, + // buildContext: context, + // viewSize: viewSize, + // texturePos: texturePos); + // }, ), + //_playState < 3 ? SizedBox.shrink() : getMoreWidget(strokeWidth: 3.0), ], ), @@ -577,26 +640,27 @@ class _SuperPlayerPageState extends State with SuperPlayerListe void playOrPause() { //state : 1 播放状态,2 暂停状态 - _playerController.getPlayState().then((state) { - print('state = $state'); - if (1 == state) { - bPlaying = false; - _playerController.pause(); - } else { - bPlaying = true; - _playerController.resume(); - } - playerRegionProvide.changePlayerState(bPlaying); - Storage.setString('bPlaying', bPlaying ? 'true' : 'false'); - setState(() {}); - }); + // _playerController.getPlayState().then((state) { + // print('state = $state'); + // if (1 == state) { + // bPlaying = false; + // _playerController.pause(); + // } else { + // bPlaying = true; + // _playerController.resume(); + // } + // playerRegionProvide.changePlayerState(bPlaying); + // Storage.setString('bPlaying', bPlaying ? 'true' : 'false'); + // setState(() {}); + // }); } void restartPlay(String url) async { _playState = 4; bPlaying = true; - _playerController.resetPlayer(); - _playerController.resume(); + // _playerController.resetPlayer(); + // _playerController.resume(); + // //writeCurrentPosFile(); // await player.stop(); // await player.reset(); diff --git a/pubspec.lock b/pubspec.lock index 5c85757..c7dd44f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -232,6 +232,13 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "0.1.3" + fijkplayer: + dependency: "direct main" + description: + name: fijkplayer + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.8.8" file: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 9c9d872..7782d03 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -90,7 +90,7 @@ dependencies: cupertino_icons: ^1.0.0 # hyzp_ybqx00_yibin Project Adds - # fijkplayer: ^0.8.7 + fijkplayer: ^0.8.8 path_provider: ^1.6.14 #permission_handler: ^3.3.0 permission_handler: ^5.0.1+1 From c38bfd7224f29cad69e36386e4e20a602101e67f Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Wed, 9 Nov 2022 23:28:47 +0800 Subject: [PATCH 04/19] =?UTF-8?q?hyzp=5Fybqx-Commit178=EF=BC=9A=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=8C=E5=B7=B2=E7=BB=8F=E5=AE=9E=E7=8E=B0=E8=BF=9D?= =?UTF-8?q?=E7=AB=A0=E8=A7=86=E9=A2=91=E7=9A=84=E5=BE=AA=E7=8E=AF=E6=92=AD?= =?UTF-8?q?=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/components/dioFun.dart | 1 + lib/widget/my_superplayer.dart | 26 ++++++++++++++------------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/lib/components/dioFun.dart b/lib/components/dioFun.dart index fbc551f..45f3eb5 100644 --- a/lib/components/dioFun.dart +++ b/lib/components/dioFun.dart @@ -2078,6 +2078,7 @@ Future playUrl({@required int index, String url, BuildContext context}) { id: index + 1, dwip: listDwinfoGetList2[index]['dwip'], url: urlnew, + urlType: 'rtmp', title: '点位视频\n${(index + 1)}、${listDwinfoGetList2[index]['dwmc']}', ))); diff --git a/lib/widget/my_superplayer.dart b/lib/widget/my_superplayer.dart index c04d545..d91f69c 100644 --- a/lib/widget/my_superplayer.dart +++ b/lib/widget/my_superplayer.dart @@ -22,17 +22,19 @@ const _kControlViewTypes = [kControlViewTypeDefault, kControlViewTypeWithout]; class SuperPlayerPage extends StatefulWidget { SuperPlayerPage( {@required this.url, + this.urlType = 'mp4', // 视频类型:mp4,rtmp this.id = -2, // 播放点位视频的点位编号,-2 表示播放违章视频 this.dwip = '', // 点位IP,用于点位视频控制球机方向 this.loop = 1, this.title = 'Tencent Player', Key key}) : super(key: key); - String dwip; String url; - String title; - int loop; //设置播放循环,默认播放器的循环次数是1, 即不循环播放。如果设置循环次数0,表示无限循环。 + String urlType; int id; + String dwip; + int loop; //设置播放循环,默认播放器的循环次数是1, 即不循环播放。如果设置循环次数0,表示无限循环。 + String title; @override _SuperPlayerPageState createState() => _SuperPlayerPageState(); @@ -79,13 +81,13 @@ class _SuperPlayerPageState extends State with SuperPlayerListe print('mounted = ${mounted}'); await _playerController.setLoop(widget.loop); // 0无限循环,1循环一次,2循环两次,以此类推 - if (widget.loop == 0) { - await _playerController.setOption(FijkOption.playerCategory, "mediacodec-all-videos", 1); - await _playerController.setOption(FijkOption.hostCategory, "enable-snapshot", 1); - await _playerController.setOption(FijkOption.hostCategory, "request-screen-on", 1); - await _playerController.setOption(FijkOption.hostCategory, "request-audio-focus", 1); - await _playerController.setOption(FijkOption.hostCategory, "enable-accurate-seek", 1); - } else { + await _playerController.setOption(FijkOption.playerCategory, "mediacodec-all-videos", 1); + await _playerController.setOption(FijkOption.hostCategory, "enable-snapshot", 1); + await _playerController.setOption(FijkOption.hostCategory, "request-screen-on", 1); + await _playerController.setOption(FijkOption.hostCategory, "request-audio-focus", 1); + await _playerController.setOption(FijkOption.hostCategory, "enable-accurate-seek", 1); + // 播放“rmtp”等网络视频设置 + if (widget.urlType != 'mp4') { /// fijkplayer播放点位视频延迟比较大优化-OK,改完后约1秒钟就能打开 - Being // 是否开启预缓冲,一般直播项目会开启,达到秒开的效果,不过带来了播放丢帧卡顿的体验 await _playerController.setOption(FijkOption.playerCategory, "packet-buffering", 0); @@ -102,8 +104,8 @@ class _SuperPlayerPageState extends State with SuperPlayerListe /// fijkplayer播放点位视频延迟比较大优化-OK,改完后半秒钟就能打开 - End - await _playerController.setOption(FijkOption.hostCategory, "request-screen-on", 1); - await _playerController.setOption(FijkOption.hostCategory, "request-audio-focus", 1); + // await _playerController.setOption(FijkOption.hostCategory, "request-screen-on", 1); + // await _playerController.setOption(FijkOption.hostCategory, "request-audio-focus", 1); } await _playerController.setDataSource(widget.url, autoPlay: true).catchError((e) { From c2660b5e223c9c673795c1ec750b9a4d1377f1f9 Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Thu, 10 Nov 2022 00:09:52 +0800 Subject: [PATCH 05/19] =?UTF-8?q?hyzp=5Fybqx-Commit179=EF=BC=9A=E5=B7=B2?= =?UTF-8?q?=E7=BB=8F=E5=AE=9E=E7=8E=B0=E8=A7=86=E9=A2=91=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E7=9A=84=E6=9A=82=E5=81=9C=E3=80=81=E6=92=AD=E6=94=BE=E5=92=8C?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E6=92=AD=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/widget/my_superplayer.dart | 41 +++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/lib/widget/my_superplayer.dart b/lib/widget/my_superplayer.dart index d91f69c..b54417c 100644 --- a/lib/widget/my_superplayer.dart +++ b/lib/widget/my_superplayer.dart @@ -111,6 +111,7 @@ class _SuperPlayerPageState extends State with SuperPlayerListe await _playerController.setDataSource(widget.url, autoPlay: true).catchError((e) { print("setDataSource error: $e"); }); + playerRegionProvide.changePlayerState(bPlaying); } // Future init() async { @@ -641,25 +642,39 @@ class _SuperPlayerPageState extends State with SuperPlayerListe bool bPlaying = true; void playOrPause() { - //state : 1 播放状态,2 暂停状态 - // _playerController.getPlayState().then((state) { - // print('state = $state'); - // if (1 == state) { - // bPlaying = false; - // _playerController.pause(); - // } else { - // bPlaying = true; - // _playerController.resume(); - // } - // playerRegionProvide.changePlayerState(bPlaying); - // Storage.setString('bPlaying', bPlaying ? 'true' : 'false'); - // setState(() {}); + // playerRegionProvide.changePlayerState(bPlaying); + // + // if (bPlaying) { + // _playerController.start(); + // } else { + // _playerController.pause(); + // } + // + // setState(() { + // bPlaying = !bPlaying; // }); + + //state : 1 播放状态,2 暂停状态 + if (FijkState.started == _playerController.state) { + bPlaying = false; + _playerController.pause(); + } else { + bPlaying = true; + _playerController.start(); + } + playerRegionProvide.changePlayerState(bPlaying); + Storage.setString('bPlaying', bPlaying ? 'true' : 'false'); + setState(() {}); } void restartPlay(String url) async { _playState = 4; bPlaying = true; + + await _playerController.stop(); + await _playerController.reset(); + startPlay(); + // _playerController.resetPlayer(); // _playerController.resume(); From 538dc3e6c5b8731aaffe28e22afa86beeced5da1 Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Thu, 10 Nov 2022 20:44:39 +0800 Subject: [PATCH 06/19] =?UTF-8?q?hyzp=5Fybqx-Commit180=EF=BC=9A=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E9=A1=B5=E9=9D=A2=E5=B8=83=E5=B1=80=EF=BC=8C=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E8=A3=85=E9=A5=B0=E6=96=87=E5=AD=97=E8=B6=8A=E7=95=8C?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/components/commonFun.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/components/commonFun.dart b/lib/components/commonFun.dart index e724049..46210a0 100644 --- a/lib/components/commonFun.dart +++ b/lib/components/commonFun.dart @@ -883,7 +883,7 @@ Widget getImageWidget() { color: Color.fromRGBO(49, 216, 123, 1), fontWeight: FontWeight.bold)), ), - SizedBox(height: ScreenUtil().setHeight(copyright_info.contains('\n') ? 25 : 90)), + SizedBox(height: ScreenUtil().setHeight(copyright_info.contains('\n') ? 25 : 70)), Container( alignment: Alignment.center, child: Text(copyright_info, From 26d6b4aa3f97812997d9ea86615bf76056913059 Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Thu, 10 Nov 2022 23:18:02 +0800 Subject: [PATCH 07/19] =?UTF-8?q?hyzp=5Fybqx-Commit181=EF=BC=9A=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=8C=E9=81=BF=E5=85=8D=E8=A7=86=E9=A2=91=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E7=AC=AC=E4=B8=80=E5=B8=A7=E8=8A=B1=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/widget/my_superplayer.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/widget/my_superplayer.dart b/lib/widget/my_superplayer.dart index b54417c..2971762 100644 --- a/lib/widget/my_superplayer.dart +++ b/lib/widget/my_superplayer.dart @@ -93,7 +93,7 @@ class _SuperPlayerPageState extends State with SuperPlayerListe await _playerController.setOption(FijkOption.playerCategory, "packet-buffering", 0); // 播放前的探测Size,默认是1024K(1M), 改小一点会出画面更快 // await player.setOption(FijkOption.formatCategory, "probesize", 200); // 1.3S打开 - await _playerController.setOption(FijkOption.formatCategory, "probesize", 200); // 1.3S打开 + await _playerController.setOption(FijkOption.formatCategory, "probesize", 1024); // 避免第一帧花屏 await _playerController.setOption(FijkOption.formatCategory, 'http-detect-range-support', 0); // 设置播放前的探测时间 1,达到首屏秒开效果 await _playerController.setOption(FijkOption.formatCategory, "analyzeduration", 1); From 16cab1dcae3c4c5dda772458e11323b2622ca7ed Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Fri, 11 Nov 2022 11:52:02 +0800 Subject: [PATCH 08/19] =?UTF-8?q?hyzp=5Fybqx-Commit182=EF=BC=9A=E5=B7=B2?= =?UTF-8?q?=E7=BB=8F=E5=AE=9E=E7=8E=B0=E6=92=AD=E6=94=BE=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E6=97=B6=E5=8F=8C=E5=87=BB=E8=A7=86=E9=A2=91=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E6=9A=82=E5=81=9C=E6=97=B6=EF=BC=8C=E6=92=AD=E6=94=BE=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E8=B7=9F=E9=9A=8F=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/my_fijkPanel_fix/my_fijkvalue.dart | 50 ++ lib/my_fijkPanel_fix/my_panel3.dart | 828 +++++++++++++++++++++++++ lib/my_fijkPanel_fix/my_slider.dart | 244 ++++++++ lib/widget/my_superplayer.dart | 21 +- 4 files changed, 1139 insertions(+), 4 deletions(-) create mode 100644 lib/my_fijkPanel_fix/my_fijkvalue.dart create mode 100644 lib/my_fijkPanel_fix/my_panel3.dart create mode 100644 lib/my_fijkPanel_fix/my_slider.dart diff --git a/lib/my_fijkPanel_fix/my_fijkvalue.dart b/lib/my_fijkPanel_fix/my_fijkvalue.dart new file mode 100644 index 0000000..f9cc64c --- /dev/null +++ b/lib/my_fijkPanel_fix/my_fijkvalue.dart @@ -0,0 +1,50 @@ +//MIT License +// +//Copyright (c) [2019] [Befovy] +// +//Permission is hereby granted, free of charge, to any person obtaining a copy +//of this software and associated documentation files (the "Software"), to deal +//in the Software without restriction, including without limitation the rights +//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +//copies of the Software, and to permit persons to whom the Software is +//furnished to do so, subject to the following conditions: +// +//The above copyright notice and this permission notice shall be included in all +//copies or substantial portions of the Software. +// +//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +//SOFTWARE. + +//r:\Flutter\FlutterSDK\flutter\.pub-cache\hosted\pub.flutter-io.cn\fijkplayer-0.8.4\lib\core\MyFijkValue.dart +//part of fijkplayer; + +import 'dart:core'; + +//新增的,为变私有成员为公有成员 +class MyFijkData { + static String fijkViewPanelVolume = "__fijkview_panel_init_volume"; + static String fijkViewPanelBrightness = "__fijkview_panel_init_brightness"; + static String fijkViewPanelSeekto = "__fijkview_panel_sekto_position"; +} + +//新增的,为变私有成员为公有成员 +String mYduration2String(Duration duration) { + if (duration.inMilliseconds < 0) return "-: negtive"; + + String twoDigits(int n) { + if (n >= 10) return "$n"; + return "0$n"; + } + + String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60)); + String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60)); + int inHours = duration.inHours; + return inHours > 0 + ? "$inHours:$twoDigitMinutes:$twoDigitSeconds" + : "$twoDigitMinutes:$twoDigitSeconds"; +} diff --git a/lib/my_fijkPanel_fix/my_panel3.dart b/lib/my_fijkPanel_fix/my_panel3.dart new file mode 100644 index 0000000..c4225a3 --- /dev/null +++ b/lib/my_fijkPanel_fix/my_panel3.dart @@ -0,0 +1,828 @@ +import 'dart:async'; +import 'dart:core'; +import 'dart:math'; +import 'dart:ui'; +import 'dart:typed_data'; + +import 'package:fijkplayer/fijkplayer.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; +import 'my_fijkvalue.dart'; +import '../components/commonFun.dart'; +import 'package:provider/provider.dart'; +import '../provider/player_ratio.dart'; +import 'my_slider.dart'; +import '../my_extended_image/common/image_picker/_image_picker_io.dart'; +import '../services/Storage.dart'; + +// class MyFijkPanelWidgetBuilder extends StatefulWidget { +// const MyFijkPanelWidgetBuilder({Key key, this.path}) : super(key: key); +// final path; +// @override +// State createState() { +// return MyFijkPanelWidgetBuilderState(); +// } +// } + +// snapshot +ImageProvider myImageProvider; +//ImageProvider _imageProvider; +//Timer _snapshotTimer; + +FijkPanelWidgetBuilder fijkPanel2Builder3( + {Key key, + final FijkPlayer player, + final bool fill = false, + final int duration = 4000, + final bool doubleTap = true, + final bool snapShot = false, + final VoidCallback onBack}) { + return (FijkPlayer player, FijkData data, BuildContext context, Size viewSize, + Rect texturePos) { + return MyFijkPanelWidgetBuilder( + key: key, + player: player, + data: data, + onBack: onBack, + viewSize: viewSize, + texPos: texturePos, + fill: fill, + doubleTap: doubleTap, + snapShot: snapShot, + hideDuration: duration, + ); + }; +} + +class MyFijkPanelWidgetBuilder extends StatefulWidget { + final FijkPlayer player; + final FijkData data; + final VoidCallback onBack; + final Size viewSize; + final Rect texPos; + final bool fill; + final bool doubleTap; + final bool snapShot; + final int hideDuration; + + const MyFijkPanelWidgetBuilder( + {Key key, + @required this.player, + this.data, + this.fill, + this.onBack, + this.viewSize, + this.hideDuration, + this.doubleTap, + this.snapShot, + this.texPos}) + : assert(player != null), + assert( + hideDuration != null && hideDuration > 0 && hideDuration < 10000), + super(key: key); + + // @override + // FijkPanel2State createState() => FijkPanel2State(); + // @override + //State createState() { + MyFijkPanelWidgetBuilderState createState() { + return MyFijkPanelWidgetBuilderState(player); + } +} + +class MyFijkPanelWidgetBuilderState extends State + with SingleTickerProviderStateMixin { + FijkPlayer player; + + MyFijkPanelWidgetBuilderState(@required this.player) { + _oldFullScreen = player.value.fullScreen; + } + + PlayerRatioProvide playerRatioProvide; + AnimationController _controller; + Animation _animation; + Offset _normalizedOffset; + double _previousScale; + double _kMinFlingVelocity = 600.0; + + Offset _offset = Offset.zero; + double _scale = 1.0; + Offset _focalPoint = Offset.zero; + Offset _deltaPoint = Offset.zero; + + bool _oldFullScreen; + bool _bScaleing = false; + + //FijkPlayer get player => widget.player; + + Timer _hideTimer; + bool _hideStuff = true; + + Timer _statelessTimer; + bool _prepared = false; + bool _playing = false; + + //bool _dragLeft; + int _nDrag; //0 Left, 1 Center, 2 Right + double _volume; + double _brightness; + double _deltaX = 0; + double _deltaY = 0; + + double _seekPos = -1.0; + Duration _duration = Duration(); + Duration _currentPos = Duration(); + Duration _bufferPos = Duration(); + + StreamSubscription _currentPosSubs; + StreamSubscription _bufferPosSubs; + + StreamController _valController; + + // snapshot + //ImageProvider _imageProvider; + Timer _snapshotTimer; + + // Is it needed to clear seek data in FijkData (widget.data) + bool _needClearSeekData = true; + + static const MyFijkSliderColors sliderColors = MyFijkSliderColors(); + + @override + void initState() { + super.initState(); + + _controller = AnimationController(vsync: this); + _controller.addListener(() { + setState(() { + _offset = _animation.value; + }); + }); + + _valController = StreamController.broadcast(); + _prepared = player.state.index >= FijkState.prepared.index; + _playing = player.state == FijkState.started; + _duration = player.value.duration; + _currentPos = player.currentPos; + _bufferPos = player.bufferPos; + + _currentPosSubs = player.onCurrentPosUpdate.listen((v) { + if (_hideStuff == false) { + setState(() { + _currentPos = v; + }); + } else { + _currentPos = v; + } + if (_needClearSeekData) { + widget.data.clearValue(MyFijkData.fijkViewPanelSeekto); + } + _needClearSeekData = false; + }); + + if (widget.data.contains(MyFijkData.fijkViewPanelSeekto)) { + var pos = widget.data.getValue(MyFijkData.fijkViewPanelSeekto) as double; + _currentPos = Duration(milliseconds: pos.toInt()); + } + + _bufferPosSubs = player.onBufferPosUpdate.listen((v) { + if (_hideStuff == false) { + setState(() { + _bufferPos = v; + }); + } else { + _bufferPos = v; + } + }); + player.addListener(_playerValueChanged); + } + + @override + void dispose() { + super.dispose(); + _controller.dispose(); + _valController?.close(); + _hideTimer?.cancel(); + _statelessTimer?.cancel(); + _snapshotTimer?.cancel(); + _currentPosSubs?.cancel(); + _bufferPosSubs?.cancel(); + player.removeListener(_playerValueChanged); + } + + double dura2double(Duration d) { + return d != null ? d.inMilliseconds.toDouble() : 0.0; + } + + void _playerValueChanged() { + FijkValue value = player.value; + + if (value.duration != _duration) { + if (_hideStuff == false) { + setState(() { + _duration = value.duration; + }); + } else { + _duration = value.duration; + } + } + bool playing = (value.state == FijkState.started); + bool prepared = value.prepared; + if (playing != _playing || + prepared != _prepared || + value.state == FijkState.asyncPreparing) { + setState(() { + _playing = playing; + _prepared = prepared; + }); + } + } + + void _restartHideTimer() { + _hideTimer?.cancel(); + _hideTimer = Timer(Duration(milliseconds: widget.hideDuration), () { + setState(() { + _hideStuff = true; + }); + }); + } + + void onTapFun() { + if (_hideStuff == true) { + _restartHideTimer(); + } + setState(() { + _hideStuff = !_hideStuff; + }); + } + + void playOrPause() { + if (player.isPlayable() || player.state == FijkState.asyncPreparing) { + if (player.state == FijkState.started) { + //bPlaying = false; + playerRegionProvide.changePlayerState(false); + Storage.setString('bPlaying', 'false'); + player.pause(); + } else { + //bPlaying = true; + playerRegionProvide.changePlayerState(true); + Storage.setString('bPlaying', 'true'); + player.start(); + } + //setState(() {}); + } else { + FijkLog.w("Invalid state ${player.state} ,can't perform play or pause"); + } + } + + void onVerticalDragStartFun(DragStartDetails d) { + // if (_bScaleing) { + // return; + // } + if (d.localPosition.dx > panelWidth() * 3 / 4) { + // right, volume + //_dragLeft = false; + _nDrag = 2; //0 Left, 1 Center, 2 Right + + //https://fijkplayer.befovy.com/docs/zh/system-volume.html#gsc.tab=0 + /// never show system volume changed UI. + int neverShowUI = 2; + FijkVolume.setUIMode(neverShowUI); + + FijkVolume.getVol().then((v) { + if (widget.data != null && + !widget.data.contains(MyFijkData.fijkViewPanelVolume)) { + widget.data.setValue(MyFijkData.fijkViewPanelVolume, v); + } + setState(() { + _volume = v; + _valController.add(v); + }); + }); + } else if (d.localPosition.dx < panelWidth() / 4) { + // left, brightness + //_dragLeft = true; + _nDrag = 0; //0 Left, 1 Center, 2 Right + FijkPlugin.screenBrightness().then((v) { + if (widget.data != null && + !widget.data.contains(MyFijkData.fijkViewPanelBrightness)) { + widget.data.setValue(MyFijkData.fijkViewPanelBrightness, v); + } + setState(() { + _brightness = v; + _valController.add(v); + }); + }); + } else { + _nDrag = 1; //0 Left, 1 Center, 2 Right + // setState(() { + // if (_oldFullScreen != player.value.fullScreen) { + // //全屏和窗口之间切换,便初始化相关变量 + // _oldFullScreen = player.value.fullScreen; + // // _offset = Offset.zero; + // // _scale = 1.0; + // //_focalPoint = Offset.zero; + // //_deltaPoint = Offset.zero; + // } + // // _bScaleing = true; + // // _previousScale = _scale; + // // _normalizedOffset = (d.localPosition - _offset) / _scale; + // // // 计算图片放大后的位置 + // // _controller.stop(); + // }); + } + _statelessTimer?.cancel(); + _statelessTimer = Timer(const Duration(milliseconds: 2000), () { + setState(() {}); + }); + } + + void onVerticalDragUpdateFun(DragUpdateDetails d) { + // if (_bScaleing) { + // return; + // } + + double delta = d.primaryDelta / panelHeight(); + print("d.primaryDelta = ${d.primaryDelta}, delta = {$delta}"); + + delta = -delta.clamp(-1.0, 1.0); + //if (_dragLeft != null && _dragLeft == false) { + if (_nDrag != null && _nDrag == 2) { + if (_volume != null) { + _volume += delta; + _volume = _volume.clamp(0.0, 1.0); + FijkVolume.setVol(_volume); + setState(() { + _valController.add(_volume); + }); + } + //} else if (_dragLeft != null && _dragLeft == true) { + } else if (_nDrag != null && _nDrag == 0) { + if (_brightness != null) { + _brightness += delta; + _brightness = _brightness.clamp(0.0, 1.0); + FijkPlugin.setScreenBrightness(_brightness); + setState(() { + _valController.add(_brightness); + }); + } + } else { + setState(() { + //_scale = (_previousScale * details.scale).clamp(1.0, 10.0); + // 限制放大倍数 1~10倍 + // _offset = _clampOffset(d.localPosition - _normalizedOffset * _scale); + // playerRatioProvide.changeOffset(_offset); + + _deltaY -= 2 * d.primaryDelta / panelHeight(); + _deltaY = _deltaY.clamp(-1.0, 1.0); + playerRatioProvide.changeDeltaY(_deltaY); + // 更新当前位置 + }); + } + } + + void onVerticalDragEndFun(DragEndDetails e) { + _volume = null; + _brightness = null; + } + + Widget buildPlayButton(BuildContext context, double height) { + Icon icon = (player.state == FijkState.started) + ? Icon(Icons.pause) + : Icon(Icons.play_arrow); + bool fullScreen = player.value.fullScreen; + return IconButton( + padding: EdgeInsets.all(0), + iconSize: fullScreen ? height : height * 0.8, + color: Color(0xFFFFFFFF), + icon: icon, + onPressed: playOrPause, + ); + } + + Widget buildFullScreenButton(BuildContext context, double height) { + Icon icon = player.value.fullScreen + ? Icon(Icons.fullscreen_exit) + : Icon(Icons.fullscreen); + bool fullScreen = player.value.fullScreen; + return IconButton( + padding: EdgeInsets.all(0), + iconSize: fullScreen ? height : height * 0.8, + color: Color(0xFFFFFFFF), + icon: icon, + onPressed: () { + player.value.fullScreen + ? player.exitFullScreen() + : player.enterFullScreen(); + }, + ); + } + + Widget buildTimeText(BuildContext context, double height) { + String text = "${mYduration2String(_currentPos)}" + + "/${mYduration2String(_duration)}"; + return Text(text, style: TextStyle(fontSize: 12, color: Color(0xFFFFFFFF))); + } + + Widget buildSlider(BuildContext context) { + double duration = dura2double(_duration); + + double currentValue = _seekPos > 0 ? _seekPos : dura2double(_currentPos); + currentValue = currentValue.clamp(0.0, duration); + + double bufferPos = dura2double(_bufferPos); + bufferPos = bufferPos.clamp(0.0, duration); + + return Padding( + padding: EdgeInsets.only(left: 0), + child: MyFijkSlider( + colors: sliderColors, + value: currentValue, + cacheValue: bufferPos, + min: 0.0, + max: duration, + onChanged: (v) { + _restartHideTimer(); + setState(() { + _seekPos = v; + }); + }, + onChangeEnd: (v) { + setState(() { + player.seekTo(v.toInt()); + _currentPos = Duration(milliseconds: _seekPos.toInt()); + widget.data.setValue(MyFijkData.fijkViewPanelSeekto, _seekPos); + _needClearSeekData = true; + _seekPos = -1.0; + }); + }, + ), + ); + } + + Widget buildBottom(BuildContext context, double height) { + if (_duration != null && _duration.inMilliseconds > 0) { + return Row( + children: [ + buildPlayButton(context, height), + buildTimeText(context, height), + Expanded(child: buildSlider(context)), + buildFullScreenButton(context, height), + ], + ); + } else { + return Row( + children: [ + buildPlayButton(context, height), + Expanded(child: Container()), + buildFullScreenButton(context, height), + ], + ); + } + } + + void takeSnapshot() { + player.takeSnapShot().then((v) { + var provider = MemoryImage(v); + precacheImage(provider, context).then((_) { + setState(() { + myImageProvider = provider; + }); + }); + FijkLog.d("get snapshot succeed"); + + //Uint8List fileData; + String fileFath; + ImageSaver.save('extended_image_cropped_image.jpg', v).then((value) { + fileFath = value; + // var fileFath = await ImagePickerSaver.saveFile(fileData: fileData); + print('my save fileFath : $fileFath'); + }); + }).catchError((e) { + FijkLog.d("get snapshot failed"); + }); + } + + Widget buildPanel(BuildContext context) { + double height = panelHeight(); + + bool fullScreen = player.value.fullScreen; + Widget centerWidget = Container( + color: Color(0x00000000), + ); + + Widget centerChild = Container( + color: Color(0x00000000), + ); + + if (fullScreen && widget.snapShot) { + centerWidget = Row( + children: [ + Expanded(child: centerChild), + Padding( + padding: EdgeInsets.only(left: 10, right: 10, top: 8, bottom: 8), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + IconButton( + padding: EdgeInsets.all(0), + color: Color(0xFFFFFFFF), + icon: Icon(Icons.camera_alt), + onPressed: () { + takeSnapshot(); + }, + ), + ], + ), + ) + ], + ); + } + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Container( + height: height > 200 ? 80 : height / 5, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Color(0x88000000), Color(0x00000000)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + Expanded( + child: centerWidget, + ), + Container( + height: height > 80 ? 80 : height / 2, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Color(0x88000000), Color(0x00000000)], + end: Alignment.topCenter, + begin: Alignment.bottomCenter, + ), + ), + alignment: Alignment.bottomCenter, + child: Container( + height: height > 80 ? 45 : height / 2, + padding: EdgeInsets.only(left: 8, right: 8, bottom: 5), + child: buildBottom(context, height > 80 ? 40 : height / 2), + // child: CustomFijkWidgetBottom( + // player: player, + // buildContext: context, + // viewSize: + // Size(widget.viewSize.width, widget.viewSize.height - 50), + // texturePos: Rect.fromLTRB(widget.texPos.left, widget.texPos.top, + // widget.texPos.width, widget.texPos.height - 50), + //), + ), + ) + ], + ); + } + + Rect panelRect() { + Rect rect = player.value.fullScreen || (true == widget.fill) + ? Rect.fromLTWH(0, 0, widget.viewSize.width, widget.viewSize.height) + : Rect.fromLTRB( + max(0.0, widget.texPos.left), + max(0.0, widget.texPos.top), + min(widget.viewSize.width, widget.texPos.right), + min(widget.viewSize.height, widget.texPos.bottom)); + return rect; + } + + double panelHeight() { + if (player.value.fullScreen || (true == widget.fill)) { + return widget.viewSize.height; + } else { + return min(widget.viewSize.height, widget.texPos.bottom) - + max(0.0, widget.texPos.top); + } + } + + double panelWidth() { + if (player.value.fullScreen || (true == widget.fill)) { + return widget.viewSize.width; + } else { + return min(widget.viewSize.width, widget.texPos.right) - + max(0.0, widget.texPos.left); + } + } + + Widget buildBack(BuildContext context) { + return IconButton( + padding: EdgeInsets.only(left: 5), + icon: Icon( + Icons.arrow_back_ios, + color: Color(0xDDFFFFFF), + ), + onPressed: widget.onBack, + ); + } + + Widget buildStateless() { + if (_volume != null || _brightness != null) { + Widget toast = _volume == null + ? defaultFijkBrightnessToast(_brightness, _valController.stream) + : defaultFijkVolumeToast(_volume, _valController.stream); + return IgnorePointer( + child: AnimatedOpacity( + opacity: 1, + duration: Duration(milliseconds: 500), + child: toast, + ), + ); + } else if (player.state == FijkState.asyncPreparing) { + return Container( + alignment: Alignment.center, + child: SizedBox( + width: 30, + height: 30, + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(Colors.white)), + ), + ); + } else if (player.state == FijkState.error) { + return Container( + alignment: Alignment.center, + child: Icon( + Icons.error, + size: 30, + color: Color(0x99FFFFFF), + ), + ); + } else if (myImageProvider != null) { + _snapshotTimer?.cancel(); + _snapshotTimer = Timer(Duration(milliseconds: 1500), () { + if (mounted) { + setState(() { + myImageProvider = null; + }); + } + }); + return Center( + child: IgnorePointer( + child: Container( + decoration: BoxDecoration( + border: Border.all(color: Colors.yellowAccent, width: 3)), + child: + Image(height: 200, fit: BoxFit.contain, image: myImageProvider), + ), + ), + ); + } else { + return Container(); + } + } + + GestureDetector buildGestureDetector(BuildContext context) { + return GestureDetector( + onScaleStart: _handleOnScaleStart, + onScaleUpdate: _handleOnScaleUpdate, + onScaleEnd: _handleOnScaleEnd, + onDoubleTap: () { + //自定义 FijkView 的双击响应 + print('My onDoubleTap'); + if (1.0 == playerRatioProvide.scale) { + playOrPause(); + } else { + _handleScaleBack(); + } + }, + + onTap: onTapFun, + //onDoubleTap: widget.doubleTap ? onDoubleTapFun : null, + onVerticalDragUpdate: onVerticalDragUpdateFun, + onVerticalDragStart: onVerticalDragStartFun, + onVerticalDragEnd: onVerticalDragEndFun, + //onHorizontalDragUpdate: (d) {}, + child: AbsorbPointer( + absorbing: _hideStuff, + child: AnimatedOpacity( + opacity: _hideStuff ? 0 : 1, + duration: Duration(milliseconds: 300), + child: buildPanel(context), + ), + ), + ); + } + + void _handleOnScaleStart(ScaleStartDetails details) { + setState(() { + // if (_oldFullScreen != player.value.fullScreen) { + // //全屏和窗口之间切换,便初始化相关变量 + // _oldFullScreen = player.value.fullScreen; + // // _offset = Offset.zero; + // // _scale = 1.0; + // //_focalPoint = Offset.zero; + // //_deltaPoint = Offset.zero; + // } + + _bScaleing = true; + _previousScale = _scale; + _normalizedOffset = (details.focalPoint - _offset) / _scale; + // 计算图片放大后的位置 + _controller.stop(); + _focalPoint = details.focalPoint; + }); + } + + void _handleScaleBack() { + // 更新当前位置 + playerRatioProvide.changeScale(1.0); + playerRatioProvide.changeOffset(Offset(0, 0)); + playerRatioProvide.changeDeltaX(0.0); + playerRatioProvide.changeDeltaY(0.0); + } + + void _handleOnScaleUpdate(ScaleUpdateDetails details) { + setState(() { + print('details.scale = ${details.scale}'); + //print('_scale = $_scale, offset.dx = ${_offset.dx}, offset.dy = ${_offset.dy}'); + //print('details.focalPoint = (${details.focalPoint.dx}, ${details.focalPoint.dy})'); + //print('details.horizontalScale = ${details.horizontalScale}; details.verticalScale = ${details.verticalScale})'); + + if (1.0 != details.scale) { + _scale = (_previousScale * details.scale).clamp(1.0, 10.0); + playerRatioProvide.changeScale(_scale); + // 限制放大倍数 1~10倍 + _offset = _clampOffset(details.focalPoint - _normalizedOffset * _scale); + } else { + _deltaPoint = _clampdeltaPoint(details.focalPoint - _focalPoint); + _focalPoint = details.focalPoint; + print('_deltaPoint = (${_deltaPoint.dx}, ${_deltaPoint.dy})'); + playerRatioProvide.changeDeltaX(_deltaPoint.dx); + playerRatioProvide.changeDeltaY(_deltaPoint.dy); + } + + // 更新当前位置 + playerRatioProvide.changeOffset(_offset); + }); + } + + Offset _clampdeltaPoint(Offset delta) { + final Size size = context.size; // widget的屏幕尺寸 + double rate = 2.0; + Offset deltaPoint = + Offset((rate * delta.dx / size.width), (rate * delta.dy / size.height)); + _deltaPoint -= deltaPoint; + return Offset( + _deltaPoint.dx.clamp(-1.0, 1.0), _deltaPoint.dy.clamp(-1.0, 1.0)); + } + + Offset _clampOffset(Offset offset) { + final Size size = context.size; + // widget的屏幕宽度 + final Offset minOffset = Offset(size.width, size.height) * (1.0 - _scale); + // 限制他的最小尺寸 + return Offset( + offset.dx.clamp(minOffset.dx, 0.0), offset.dy.clamp(minOffset.dy, 0.0)); + } + + void _handleOnScaleEnd(ScaleEndDetails details) { + final double magnitude = details.velocity.pixelsPerSecond.distance; + if (magnitude < _kMinFlingVelocity) return; + final Offset direction = details.velocity.pixelsPerSecond / magnitude; + // 计算当前的方向 + final double distance = (Offset.zero & context.size).shortestSide; + // 计算放大倍速,并相应的放大宽和高,比如原来是600*480的图片,放大后倍数为1.25倍时,宽和高是同时变化的 + _animation = _controller.drive(Tween( + begin: _offset, end: _clampOffset(_offset + direction * distance))); + _controller + ..value = 0.0 + ..fling(velocity: magnitude / 1000.0); + _bScaleing = false; + } + + @override + Widget build(BuildContext context) { + playerRatioProvide = Provider.of(context); + Rect rect = panelRect(); + + List ws = []; + + if (_statelessTimer != null && _statelessTimer.isActive) { + ws.add(buildStateless()); + } else if (player.state == FijkState.asyncPreparing) { + ws.add(buildStateless()); + } else if (player.state == FijkState.error) { + ws.add(buildStateless()); + } else if (myImageProvider != null) { + ws.add(buildStateless()); + } + ws.add(buildGestureDetector(context)); + if (widget.onBack != null) { + ws.add(buildBack(context)); + } + return Positioned.fromRect( + rect: rect, + child: Stack(children: ws), + ); + } + +} diff --git a/lib/my_fijkPanel_fix/my_slider.dart b/lib/my_fijkPanel_fix/my_slider.dart new file mode 100644 index 0000000..46e4c2d --- /dev/null +++ b/lib/my_fijkPanel_fix/my_slider.dart @@ -0,0 +1,244 @@ +//MIT License +// +//Copyright (c) [2019] [Befovy] +// +//Permission is hereby granted, free of charge, to any person obtaining a copy +//of this software and associated documentation files (the "Software"), to deal +//in the Software without restriction, including without limitation the rights +//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +//copies of the Software, and to permit persons to whom the Software is +//furnished to do so, subject to the following conditions: +// +//The above copyright notice and this permission notice shall be included in all +//copies or substantial portions of the Software. +// +//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +//SOFTWARE. + +//part of fijkplayer; +import 'package:flutter/material.dart'; +import 'dart:core'; +import 'dart:math'; +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; + +/// MyFijkSlider is like Slider in Flutter SDK. +/// MyFijkSlider support [cacheValue] which can be used +/// to show the player's cached buffer. +/// The [colors] is used to make colorful painter to draw the line and circle. +class MyFijkSlider extends StatefulWidget { + final double value; + final double cacheValue; + + final ValueChanged onChanged; + final ValueChanged onChangeStart; + final ValueChanged onChangeEnd; + + final double min; + final double max; + + final MyFijkSliderColors colors; + + const MyFijkSlider({ + Key key, + @required this.value, + @required this.onChanged, + this.cacheValue = 0.0, + this.onChangeStart, + this.onChangeEnd, + this.min = 0.0, + this.max = 1.0, + this.colors = const MyFijkSliderColors(), + }) : assert(value != null), + assert(cacheValue != null), + assert(min != null), + assert(max != null), + assert(min <= max), + assert(value >= min && value <= max), + super(key: key); + + @override + State createState() { + return _MyFijkSliderState(); + } +} + +class _MyFijkSliderState extends State { + bool dragging = false; + + double dragValue; + + static const double margin = 2.0; + + @override + Widget build(BuildContext context) { + double v = widget.value / (widget.max - widget.min); + double cv = widget.cacheValue / (widget.max - widget.min); + + return GestureDetector( + child: Container( + margin: EdgeInsets.only(left: margin, right: margin), + height: double.infinity, + width: double.infinity, + color: Colors.transparent, + child: CustomPaint( + painter: _MySliderPainter(v, cv, dragging, colors: widget.colors), + ), + ), + onHorizontalDragStart: (DragStartDetails details) { + setState(() { + dragging = true; + }); + dragValue = widget.value; + if (widget.onChangeStart != null) { + widget.onChangeStart(dragValue); + } + }, + onHorizontalDragUpdate: (DragUpdateDetails details) { + final box = context.findRenderObject() as RenderBox; + final dx = details.localPosition.dx; + dragValue = (dx - margin) / (box.size.width - 2 * margin); + dragValue = max(0, min(1, dragValue)); + dragValue = dragValue * (widget.max - widget.min) + widget.min; + if (widget.onChanged != null) { + widget.onChanged(dragValue); + } + }, + onHorizontalDragEnd: (DragEndDetails details) { + setState(() { + dragging = false; + }); + if (widget.onChangeEnd != null) { + widget.onChangeEnd(dragValue); + } + }, + ); + } +} + +/// Colors for the MyFijkSlider +class MyFijkSliderColors { + const MyFijkSliderColors({ + this.playedColor = const Color.fromRGBO(255, 0, 0, 0.6), + this.bufferedColor = const Color.fromRGBO(50, 50, 100, 0.4), + this.cursorColor = const Color.fromRGBO(255, 0, 0, 0.8), + this.baselineColor = const Color.fromRGBO(200, 200, 200, 0.5), + }); + + final Color playedColor; + final Color bufferedColor; + final Color cursorColor; + final Color baselineColor; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is MyFijkSliderColors && + runtimeType == other.runtimeType && + hashCode == other.hashCode; + + @override + int get hashCode => + hashValues(playedColor, bufferedColor, cursorColor, baselineColor); +} + +class _MySliderPainter extends CustomPainter { + final double v; + final double cv; + + final bool dragging; + final Paint pt = Paint(); + + final MyFijkSliderColors colors; + + _MySliderPainter(this.v, this.cv, this.dragging, + {this.colors = const MyFijkSliderColors()}) + : assert(colors != null), + assert(v != null), + assert(cv != null); + + @override + void paint(Canvas canvas, Size size) { + double lineHeight = min(size.height / 2, 1); + pt.color = colors.baselineColor; + + double radius = min(size.height / 2, 4); + // draw background + canvas.drawRRect( + RRect.fromRectAndRadius( + Rect.fromPoints( + Offset(0, size.height / 2 - lineHeight), + Offset(size.width, size.height / 2 + lineHeight), + ), + Radius.circular(radius), + ), + pt, + ); + + final double value = v * size.width; + + // draw played part + pt.color = colors.playedColor; + canvas.drawRRect( + RRect.fromRectAndRadius( + Rect.fromPoints( + Offset(0, size.height / 2 - lineHeight), + Offset(value, size.height / 2 + lineHeight), + ), + Radius.circular(radius), + ), + pt, + ); + + // draw cached part + final double cacheValue = cv * size.width; + if (cacheValue > value && cacheValue > 0) { + pt.color = colors.bufferedColor; + canvas.drawRRect( + RRect.fromRectAndRadius( + Rect.fromPoints( + Offset(value, size.height / 2 - lineHeight), + Offset(cacheValue, size.height / 2 + lineHeight), + ), + Radius.circular(radius), + ), + pt, + ); + } + + //注意:改变拖动圆形光标,必须按Q退出App,再重新flutter run才能生效 + // draw circle cursor + // pt.color = colors.cursorColor; + // pt.color = pt.color.withAlpha(max(0, pt.color.alpha - 50)); + //radius = min(size.height / 2, dragging ? 10 : 5); + pt.color = Colors.red; + //radius = 10; + radius = min(size.height / 2, 10); + canvas.drawCircle(Offset(value, size.height / 2), radius, pt); + //pt.color = colors.cursorColor; + //radius = min(size.height / 2, dragging ? 6 : 3); + //canvas.drawCircle(Offset(value, size.height / 2), radius, pt); + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is _MySliderPainter && hashCode == other.hashCode; + + @override + int get hashCode => hashValues(v, cv, dragging, colors); + + @override + bool shouldRepaint(_MySliderPainter oldDelegate) { + return hashCode != oldDelegate.hashCode; + } +} diff --git a/lib/widget/my_superplayer.dart b/lib/widget/my_superplayer.dart index 2971762..a4fa478 100644 --- a/lib/widget/my_superplayer.dart +++ b/lib/widget/my_superplayer.dart @@ -16,6 +16,7 @@ import 'package:provider/provider.dart'; import '../components/commonFun.dart'; import '../services/Storage.dart'; +import '../my_fijkPanel_fix/my_panel3.dart'; const _kControlViewTypes = [kControlViewTypeDefault, kControlViewTypeWithout]; @@ -40,16 +41,20 @@ class SuperPlayerPage extends StatefulWidget { _SuperPlayerPageState createState() => _SuperPlayerPageState(); } -class _SuperPlayerPageState extends State with SuperPlayerListener { +class _SuperPlayerPageState extends State + with WidgetsBindingObserver, AutomaticKeepAliveClientMixin { // SuperPlayerController _playerController = SuperPlayerController(); + + @override + // TODO: implement wantKeepAlive + bool get wantKeepAlive => true; + final FijkPlayer _playerController = FijkPlayer(); String _sdkVersion = 'Unknown'; List _logs = []; bool bFullScreen = false; - String _controlViewType = _kControlViewTypes.first; - @override void dispose() { Playing = false; @@ -69,6 +74,9 @@ class _SuperPlayerPageState extends State with SuperPlayerListe // }); // init(); + WidgetsBinding.instance.addObserver(this); + + _playerController.setOption(FijkOption.hostCategory, "enable-snapshot", 1); _playerController.setOption(FijkOption.playerCategory, "mediacodec-all-videos", 1); startPlay(); @@ -186,10 +194,14 @@ class _SuperPlayerPageState extends State with SuperPlayerListe PlayerRatioProvide playerRatioProvide; + FijkPanelWidgetBuilder _fijkPanelWidgetBuilder; + @override Widget build(BuildContext context) { + _fijkPanelWidgetBuilder = fijkPanel2Builder3(snapShot: true, player: _playerController); playerRegionProvide = Provider.of(context); playerRatioProvide = Provider.of(context); + // List listData = getDataListControl2(); double btnHeight1 = 70; //第一按钮行高度 double btnHeight2 = 160; //第二按钮行高度 @@ -294,7 +306,8 @@ class _SuperPlayerPageState extends State with SuperPlayerListe //设置视频区域背景颜色-OK color: Colors.black, player: _playerController, - panelBuilder: fijkPanel2Builder(snapShot: true), + // panelBuilder: fijkPanel2Builder(snapShot: true), + panelBuilder: _fijkPanelWidgetBuilder, fsFit: FijkFit.fill, // panelBuilder: simplestUI, // panelBuilder: (FijkPlayer player, BuildContext context, From 947b2f479d57dcc1cc4b7f228168a082802cd198 Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Fri, 11 Nov 2022 15:09:20 +0800 Subject: [PATCH 09/19] =?UTF-8?q?hyzp=5Fybqx-Commit183=EF=BC=9A=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=E6=9B=B4=E6=96=B0=E4=B8=BA=20version:=201.6.?= =?UTF-8?q?1+20221111=E3=80=82=E8=A7=86=E9=A2=91=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E5=99=A8=E5=B7=B2=E7=BB=8F=E6=9B=B4=E6=96=B0=E4=B8=BAfijkplaye?= =?UTF-8?q?r:=20^0.8.8=EF=BC=8C=E7=AC=AC=E4=B8=80=E5=B8=A7=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E5=BE=88=E5=BF=AB=EF=BC=8C=E5=8F=8C=E5=87=BB=E6=9A=82?= =?UTF-8?q?=E5=81=9C=E5=9B=BE=E6=A0=87=E4=BC=9A=E6=94=B9=E5=8F=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/release/output.json | 2 +- pubspec.yaml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/android/app/release/output.json b/android/app/release/output.json index 940283b..ec56918 100644 --- a/android/app/release/output.json +++ b/android/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":20220620,"versionName":"1.5.3","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":20221111,"versionName":"1.6.1","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 7782d03..a944aa0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -75,7 +75,8 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev #version: 1.5.1+20220517 #version: 1.5.2+20220531 #version: 1.5.3+20220620 -version: 1.5.4+20220827 +#version: 1.5.4+20220827 +version: 1.6.1+20221111 environment: sdk: ">=2.7.0 <3.0.0" From 840a7145ce917ee4fbe8c51c659e15a0df4ab70d Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Fri, 11 Nov 2022 15:11:13 +0800 Subject: [PATCH 10/19] =?UTF-8?q?hyzp=5Fybqx-Commit184=EF=BC=9A=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=E6=9B=B4=E6=96=B0=E4=B8=BA=20version:=201.6.?= =?UTF-8?q?1+20221111=E3=80=82=E8=A7=86=E9=A2=91=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E5=99=A8=E5=B7=B2=E7=BB=8F=E6=9B=B4=E6=96=B0=E4=B8=BAfijkplaye?= =?UTF-8?q?r:=20^0.8.8=EF=BC=8C=E7=AC=AC=E4=B8=80=E5=B8=A7=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E5=BE=88=E5=BF=AB=EF=BC=8C=E5=8F=8C=E5=87=BB=E6=9A=82?= =?UTF-8?q?=E5=81=9C=E5=9B=BE=E6=A0=87=E4=BC=9A=E6=94=B9=E5=8F=98=EF=BC=8C?= =?UTF-8?q?=E5=B7=B2=E7=BB=8F=E5=AE=9E=E7=8E=B0=E8=A7=86=E9=A2=91=E6=88=AA?= =?UTF-8?q?=E5=9B=BE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/widget/my_superplayer.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/widget/my_superplayer.dart b/lib/widget/my_superplayer.dart index a4fa478..2ad47e1 100644 --- a/lib/widget/my_superplayer.dart +++ b/lib/widget/my_superplayer.dart @@ -202,12 +202,12 @@ class _SuperPlayerPageState extends State playerRegionProvide = Provider.of(context); playerRatioProvide = Provider.of(context); - // List listData = getDataListControl2(); - double btnHeight1 = 70; //第一按钮行高度 - double btnHeight2 = 160; //第二按钮行高度 - int btnCount = 4; //每行按钮个数 - // int btnCount3 = listData.length; //每行按钮个数 - var mediaSize = MediaQuery.of(context).size; + // // List listData = getDataListControl2(); + // double btnHeight1 = 70; //第一按钮行高度 + // double btnHeight2 = 160; //第二按钮行高度 + // int btnCount = 4; //每行按钮个数 + // // int btnCount3 = listData.length; //每行按钮个数 + // var mediaSize = MediaQuery.of(context).size; // widget.id:播放点位视频的点位编号,-2 表示播放违章视频 double btn_left = -2 == widget.id ? 347 : 70; //第一按钮行高度 From 67896aef90f050851918f9d1d704a7646b874f46 Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Thu, 24 Aug 2023 10:51:40 +0800 Subject: [PATCH 11/19] =?UTF-8?q?hyzp=5Fybqx-Commit185=EF=BC=9A=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E5=8D=87=E7=BA=A7=20android-studio-2022.2.1.20-window?= =?UTF-8?q?s.exe=20=E5=90=8E=E7=BC=96=E8=AF=91=E6=8A=A5=E9=94=99=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 一、flutter运行项目报错-Could not initialize class org.codehaus.groovy.runtime.InvokerHelper-OK flutter运行项目报错-Could not initialize class org.codehaus.groovy.runtime.InvokerHelper-OK 更改java版本解决方法(对我有效): 1. 在你的项目中,找到android\gradle.properties文件,打开这个文件。内容如下,里面的内容都是在项目构建过程中自动生成的。 org.gradle.jvmargs=-Xmx1536M android.enableR8=true android.useAndroidX=true android.enableJetifier=true 2. 在这个gradle.properties文件中增加你的java路径。格式是org.gradle.java.home=C:\\Program Files\\Java\\jdk-11.0.11。于是,gradle.properties文件的内容变为。 org.gradle.jvmargs=-Xmx1536M android.enableR8=true android.useAndroidX=true android.enableJetifier=true org.gradle.java.home=C:\\Program Files\\Java\\jdk-11.0.11 改为这些版本不行: org.gradle.java.home=c:\\Program Files\\Android\\Android Studio\\jbr org.gradle.java.home=c:\\Program Files\\Android\\Android Studio\\jre 改为该版本OK: org.gradle.java.home=c:\\Users\\WinUser01\\.jdks\\jbr_11.0.15_2022-04-19 3. 保存文件。最后flutter run就OK了。 二、SuperPlayerImpl.java 编译报错,解决办法:打开文件 SuperPlayerImpl.java,把报错的4个语句注释掉即可编译通过 s:\Android.bak\Android Studio-2022.x\Android Studio-2022.2.1.20\flutter运行项目报错-Could not initialize class org.codehaus.groovy.runtime.InvokerHelper-OK\hyzp_ybqx-编译报错解决-OK\SuperPlayerImpl-OK.java R:\FlutterProject\FlutterProject61-hyzp_ybqx_with_ios\hyzp_ybqx\lib\my_flutter_superplayer\android\src\main\java\com\tencent\liteav\demo\superplayer\model\SuperPlayerImpl.java:106: ����: �Ҳ������� mLivePlayer.resumeLive(); ^ ����: ���� resumeLive() λ��: ����ΪTXLivePlayer�ı��� mLivePlayer R:\FlutterProject\FlutterProject61-hyzp_ybqx_with_ios\hyzp_ybqx\lib\my_flutter_superplayer\android\src\main\java\com\tencent\liteav\demo\superplayer\model\SuperPlayerImpl.java:504: ����: �Ҳ������� mLivePlayer.prepareLiveSeek(domian, bizidNum); ^ ����: ���� prepareLiveSeek(String,int) λ��: ����ΪTXLivePlayer�ı��� mLivePlayer R:\FlutterProject\FlutterProject61-hyzp_ybqx_with_ios\hyzp_ybqx\lib\my_flutter_superplayer\android\src\main\java\com\tencent\liteav\demo\superplayer\model\SuperPlayerImpl.java:736: ����: �Ҳ������� mLivePlayer.resumeLive(); ^ ����: ���� resumeLive() λ��: ����ΪTXLivePlayer�ı��� mLivePlayer R:\FlutterProject\FlutterProject61-hyzp_ybqx_with_ios\hyzp_ybqx\lib\my_flutter_superplayer\android\src\main\java\com\tencent\liteav\demo\superplayer\model\SuperPlayerImpl.java:811: ����: �Ҳ������� mLivePlayer.seek(position); --- android/gradle.properties | 1 + .../liteav/demo/superplayer/model/SuperPlayerImpl.java | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/android/gradle.properties b/android/gradle.properties index a673820..f0bbcbb 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -2,3 +2,4 @@ org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true android.enableR8=true +org.gradle.java.home=c:\\Users\\WinUser01\\.jdks\\jbr_11.0.15_2022-04-19 diff --git a/lib/my_flutter_superplayer/android/src/main/java/com/tencent/liteav/demo/superplayer/model/SuperPlayerImpl.java b/lib/my_flutter_superplayer/android/src/main/java/com/tencent/liteav/demo/superplayer/model/SuperPlayerImpl.java index e3753f1..1bfaa32 100644 --- a/lib/my_flutter_superplayer/android/src/main/java/com/tencent/liteav/demo/superplayer/model/SuperPlayerImpl.java +++ b/lib/my_flutter_superplayer/android/src/main/java/com/tencent/liteav/demo/superplayer/model/SuperPlayerImpl.java @@ -103,7 +103,7 @@ public class SuperPlayerImpl implements SuperPlayer, ITXVodPlayListener, ITXLive case TXLiveConstants.PLAY_ERR_NET_DISCONNECT: case TXLiveConstants.PLAY_EVT_PLAY_END: if (mCurrentPlayType == SuperPlayerDef.PlayerType.LIVE_SHIFT) { // 直播时移失败,返回直播 - mLivePlayer.resumeLive(); + // mLivePlayer.resumeLive(); updatePlayerType(SuperPlayerDef.PlayerType.LIVE); onError(SuperPlayerCode.LIVE_SHIFT_FAIL, "时移失败,返回直播"); updatePlayerState(SuperPlayerDef.PlayerState.PLAYING); @@ -501,7 +501,7 @@ public class SuperPlayerImpl implements SuperPlayer, ITXVodPlayListener, ITXLive e.printStackTrace(); TXCLog.e(TAG, "playTimeShiftLiveURL: bizidNum error = " + bizid); } - mLivePlayer.prepareLiveSeek(domian, bizidNum); + // mLivePlayer.prepareLiveSeek(domian, bizidNum); } /** @@ -733,7 +733,7 @@ public class SuperPlayerImpl implements SuperPlayer, ITXVodPlayListener, ITXLive @Override public void resumeLive() { if (mCurrentPlayType == SuperPlayerDef.PlayerType.LIVE_SHIFT) { - mLivePlayer.resumeLive(); + // mLivePlayer.resumeLive(); } updatePlayerType(SuperPlayerDef.PlayerType.LIVE); } @@ -808,7 +808,7 @@ public class SuperPlayerImpl implements SuperPlayer, ITXVodPlayListener, ITXLive updatePlayerType(SuperPlayerDef.PlayerType.LIVE_SHIFT); LogReport.getInstance().uploadLogs(LogReport.ELK_ACTION_TIMESHIFT, 0, 0); if (mLivePlayer != null) { - mLivePlayer.seek(position); + // mLivePlayer.seek(position); } } if (mObserver != null) { From 99cce09b19beebc685548539933ebfd786e579af Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Sat, 23 Dec 2023 11:26:20 +0800 Subject: [PATCH 12/19] =?UTF-8?q?hyzp=5Fybqx-Commit186=EF=BC=9A=E5=B7=B2?= =?UTF-8?q?=E7=BB=8F=E5=9F=BA=E6=9C=AC=E5=AE=9E=E7=8E=B0=E5=9C=A8=E2=80=9C?= =?UTF-8?q?=E7=82=B9=E4=BD=8D=E5=9C=B0=E5=9B=BE=E2=80=9D=E4=B8=AD=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E2=80=9C=E5=AF=BC=E8=88=AA=E2=80=9D=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E8=83=BD=E5=A4=9F=E4=BF=9D=E5=AD=98=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E7=9A=84=E9=BB=98=E8=AE=A4=E5=AF=BC=E8=88=AA?= =?UTF-8?q?=E5=9C=B0=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/AndroidManifest.xml | 3 + android/build.gradle | 2 +- assets/images/地图选中.png | Bin 0 -> 4075 bytes assets/images/导航 (1).png | Bin 0 -> 3043 bytes assets/images/用户选择.png | Bin 0 -> 4476 bytes assets/images/默认地图3.png | Bin 0 -> 4756 bytes lib/components/commonFun.dart | 53 ++++- lib/main.dart | 2 +- lib/pages/Works/DWDT/basic_map.dart | 29 ++- lib/pages/Works/DWDT/dwInfoDialog.dart | 121 +++++++++- lib/pages/Works/DWDT/maps_sheet.dart | 49 ++++ lib/pages/tabs/page4_myMsics_new.dart | 57 +++-- lib/pages/tabs/page8_defaultMap.dart | 284 +++++++++++++++++++++++ pubspec.lock | 35 +++ pubspec.yaml | 5 + 15 files changed, 602 insertions(+), 38 deletions(-) create mode 100644 assets/images/地图选中.png create mode 100644 assets/images/导航 (1).png create mode 100644 assets/images/用户选择.png create mode 100644 assets/images/默认地图3.png create mode 100644 lib/pages/Works/DWDT/maps_sheet.dart create mode 100644 lib/pages/tabs/page8_defaultMap.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index c132438..3004b3f 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -36,6 +36,9 @@ + + + WmEB3;+NyYHFw$Qe*dj2Xc;jmz!5) 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 G82&#N=6O{B literal 0 HcmV?d00001 diff --git a/assets/images/导航 (1).png b/assets/images/导航 (1).png new file mode 100644 index 0000000000000000000000000000000000000000..2368de6d39928170375ce8e274f06e69da744945 GIT binary patch literal 3043 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 i5CB26kc6Bn5%@pn+MBAO+dCfs0000 -1) { + if (mapKey.length == 0 || key.length < mapKey.length) { + mapKey = key; + } + } + } + + _mapChsName = mapChsName[mapKey]; + + if (_mapChsName == null) { + _mapChsName = mapName + (mapName.length > 0 ? '地图' : ''); + } + return _mapChsName; +} + +// key 全部小写 +Map mapChsName = { + 'apple': '苹果地图', + 'google': '谷歌地图', + 'googlego': '谷歌地图轻量版', + 'amap': '高德地图', + 'baidu': '百度地图', + 'waze': '位智地图', + 'yandexmaps': 'Yandex地图', + 'yandexnavi': 'Yandex导航地图', + 'citymapper': '城市地图', + 'mapswithme': '离线地图', + 'osmand': 'OsmAnd地图', + 'doubleGis': 'doubleGis地图', + 'tencent': '腾讯地图', +}; + // Timer g_remindTimer; //定时提醒变量 // // // 设置定时提醒 diff --git a/lib/main.dart b/lib/main.dart index 61fbf21..29c2fec 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -119,7 +119,7 @@ class _MyAppState extends State { // g_bVoiceRemind = (null == g_bVoiceRemind) ? false : g_bVoiceRemind; // 默认关闭 g_bVoiceRemind = (null == g_bVoiceRemind) ? true : g_bVoiceRemind; // 默认开启 // print('g_bVoiceRemind = $g_bVoiceRemind'); - g_remindGap = await Storage.getInt('nRemindGap'); + g_remindGap = await Storage.getInt('nRemindGap'); g_remindGap = (null == g_remindGap) ? 60 : g_remindGap; // 提醒间隔默认为60S eventBus.fire(VoiceRemindUpdate('g_bVoiceRemind 数据已更新')); diff --git a/lib/pages/Works/DWDT/basic_map.dart b/lib/pages/Works/DWDT/basic_map.dart index a23d116..84bf989 100644 --- a/lib/pages/Works/DWDT/basic_map.dart +++ b/lib/pages/Works/DWDT/basic_map.dart @@ -4,8 +4,10 @@ import 'package:flutter_bmfmap/BaiduMap/bmfmap_map.dart'; import 'package:flutter_screenutil/screen_util.dart'; import 'package:hyzp_ybqx/components/commonFun.dart'; import 'package:hyzp_ybqx/components/hyxx_data_handle.dart'; +import 'package:map_launcher/map_launcher.dart'; import '../../../components/dioFun.dart'; +import '../../../services/Storage.dart'; import 'dwInfoDialog.dart'; import 'dwInfo_data.dart'; @@ -20,6 +22,11 @@ class BasicMap extends StatefulWidget { } class _BasicMapState extends State { + // 导航相关代码 + double destinationLatitude = 28.45382237207785; + double destinationLongitude = 104.7506958256658; + String destinationTitle = '珙县大坪上'; + Size screenSize; BMFMapOptions mapOptions; BMFMapController myMapController; @@ -32,9 +39,18 @@ class _BasicMapState extends State { } } + List availableMaps; + + void init() async { + // 获取用户选择的默认地图 + availableMaps = await MapLauncher.installedMaps; + } + @override void initState() { super.initState(); + init(); + mapOptions = BMFMapOptions( //center: BMFCoordinate(39.965, 116.404),//北京市 //30 116.395645038,39.9299857781 北京-北京市 @@ -291,8 +307,17 @@ class _BasicMapState extends State { .push( PageRouteBuilder( opaque: false, - pageBuilder: (context, animation, secondaryAnimation) => - dwInfoDialog(id: id, dwIndex: dwIndex, title: title, content: content), + pageBuilder: (context, animation, secondaryAnimation) => dwInfoDialog( + id: id, + dwIndex: dwIndex, + title: title, + content: content, + parentContext: context, + destinationLatitude: double.parse(listCoordinate[1]), + destinationLongitude: double.parse(listCoordinate[0]), + destinationTitle: listDwinfoGetList2[dwIndex]["dwmc"], + availableMaps: availableMaps, + ), ), ) .then((value) async { diff --git a/lib/pages/Works/DWDT/dwInfoDialog.dart b/lib/pages/Works/DWDT/dwInfoDialog.dart index 7437318..6594dd5 100644 --- a/lib/pages/Works/DWDT/dwInfoDialog.dart +++ b/lib/pages/Works/DWDT/dwInfoDialog.dart @@ -1,21 +1,38 @@ import 'package:flutter/material.dart'; +import 'package:geolocator/geolocator.dart'; import 'package:hyzp_ybqx/components/dioFun.dart'; +import 'package:map_launcher/map_launcher.dart'; //import 'package:hyzp_ybqx/widget/player_pro.dart'; import '../../../components/commonFun.dart'; +import '../../../services/Storage.dart'; +import 'maps_sheet.dart'; //确认对话框 class dwInfoDialog extends Dialog { - dwInfoDialog({@required this.id, this.title = "", @required this.dwIndex, this.content}); + dwInfoDialog({ + @required this.id, + this.title = "", + @required this.dwIndex, + this.content, + // 导航相关参数 + this.parentContext, + this.destinationLatitude, + this.destinationLongitude, + this.destinationTitle, + this.availableMaps, + }); int dwIndex; String id; String title; String content; bool ret = false; + BuildContext parentContext; @override Widget build(BuildContext context) { + getCurrentPosition(); Size mediaSize = MediaQuery.of(context).size; return WillPopScope( child: Material( @@ -90,9 +107,9 @@ class dwInfoDialog extends Dialog { onPressed: () async { ret = true; getingDwVideo = false; - Navigator.pop(context, ret); //关闭弹框,返回sRet + navigationMap(context); }, - child: Text("确认"), + child: Text("导航"), ), RaisedButton( child: Text("取消"), @@ -115,4 +132,102 @@ class dwInfoDialog extends Dialog { }, ); } + + // 导航相关代码 + double destinationLatitude = 28.45382237207785; + double destinationLongitude = 104.7506958256658; + String destinationTitle = '珙县大坪上'; + + double originLatitude; + double originLongitude; + String originTitle = '我的位置'; + + List waypoints = [ + // Coords(37.7705112, -122.4108267), + // Coords(37.6988984, -122.4830961), + // Coords(37.7935754, -122.483654), + ]; + + DirectionsMode directionsMode = DirectionsMode.driving; + + List availableMaps; + + // String defaultMapName = 'Amap'; + String defaultMapName = g_defaultMapName; + AvailableMap defalutMap; + + void getCurrentPosition() async { + print('getCurrentPosition begin'); + + // 是否保存默认地图 + g_bSaveDefaultMap = await Storage.getBool('bSaveDefaultMap'); + g_bSaveDefaultMap = (null == g_bSaveDefaultMap) ? false : g_bSaveDefaultMap; // 默认不保存 + // 用户选择的默认地图名称 + g_defaultMapName = await Storage.getString('defaultMapName'); + g_defaultMapName = (null == g_defaultMapName) ? '' : g_defaultMapName; // 默认为空字符串 + defaultMapName = g_defaultMapName; + + // 获取用户选择的默认地图 + // availableMaps = await MapLauncher.installedMaps; // 为避免延迟错乱,该变量由父组件传入 + if (defaultMapName != null && defaultMapName.length > 0) { + for (var map in availableMaps) { + if (defaultMapName.toLowerCase() == map.mapName.toLowerCase()) { + defalutMap = map; + break; + } + } + } + + await Geolocator.getCurrentPosition().then((Position value) { + originLatitude = value.latitude; + originLongitude = value.longitude; + print('value = ${value.toString()}'); + // value = Latitude: 28.796201, Longitude: 104.607751 + print('getCurrentPosition end'); + }); + } + + navigationMap(BuildContext context) { + print('this.defalutMap = ${defalutMap}'); + if (defalutMap != null) { + defalutMap.showDirections( + destination: Coords( + destinationLatitude, + destinationLongitude, + ), + destinationTitle: destinationTitle, + origin: originLatitude == null || originLongitude == null + ? null + : Coords(originLatitude, originLongitude), + originTitle: originTitle, + waypoints: waypoints, + directionsMode: directionsMode, + ); + } else { + MapsSheet.show( + context: parentContext, + onMapTap: (map) { + if (g_bSaveDefaultMap) { + g_defaultMapName = map.mapName; + Storage.setString('defaultMapName', g_defaultMapName); + } + + map.showDirections( + destination: Coords( + destinationLatitude, + destinationLongitude, + ), + destinationTitle: destinationTitle, + origin: originLatitude == null || originLongitude == null + ? null + : Coords(originLatitude, originLongitude), + originTitle: originTitle, + waypoints: waypoints, + directionsMode: directionsMode, + ); + }, + ); + } + Navigator.pop(context, ret); //关闭弹框,返回sRet + } } diff --git a/lib/pages/Works/DWDT/maps_sheet.dart b/lib/pages/Works/DWDT/maps_sheet.dart new file mode 100644 index 0000000..a2bda47 --- /dev/null +++ b/lib/pages/Works/DWDT/maps_sheet.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:map_launcher/map_launcher.dart'; + +class MapsSheet { + static show({ + @required BuildContext context, + @required Function(AvailableMap map) onMapTap, + }) async { + final availableMaps = await MapLauncher.installedMaps; + + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return SafeArea( + child: Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: Container( + child: Wrap( + children: [ + for (var map in availableMaps) + ListTile( + onTap: () { + print('map.mapName = ${map.mapName}'); + // map.mapName = Amap + Navigator.pop(context); + onMapTap(map); + }, + title: Text(map.mapName), + leading: SvgPicture.asset( + map.icon, + height: 30.0, + width: 30.0, + ), + ), + ], + ), + ), + ), + ), + ], + ), + ); + }, + ); + } +} diff --git a/lib/pages/tabs/page4_myMsics_new.dart b/lib/pages/tabs/page4_myMsics_new.dart index fcfc8bb..fe8c3e5 100644 --- a/lib/pages/tabs/page4_myMsics_new.dart +++ b/lib/pages/tabs/page4_myMsics_new.dart @@ -16,6 +16,7 @@ import 'package:hyzp_ybqx/pages/Works/TJXX/tj_data.dart'; import 'package:hyzp_ybqx/pages/tabs/page5_userManager.dart'; import 'package:hyzp_ybqx/pages/tabs/page6_download.dart'; import 'package:hyzp_ybqx/pages/tabs/page7_setRemind.dart'; +import 'package:hyzp_ybqx/pages/tabs/page8_defaultMap.dart'; import 'package:hyzp_ybqx/services/EventBus.dart'; import 'package:hyzp_ybqx/widget/JdButton.dart'; import 'package:package_info/package_info.dart'; @@ -111,35 +112,35 @@ class _Page4_MyMsicsNewState extends State static onNullFun() {} Widget _getListTile( - title, { - String leadPath = '', - Color leadColor, - Color textColor, - onTapFun = onNullFun, - onLongPressFun = onNullFun, - size = 16.0, - bool bBadge = false, - Widget trailWidget = const Icon(Icons.arrow_forward_ios), - }) { + title, { + String leadPath = '', + Color leadColor, + Color textColor, + onTapFun = onNullFun, + onLongPressFun = onNullFun, + size = 16.0, + bool bBadge = false, + Widget trailWidget = const Icon(Icons.arrow_forward_ios), + }) { // print("_getListTile bVoiceRemind = $bVoiceRemind"); // _getListTile bVoiceRemind = false return Column( children: [ ListTile( leading: bBadge ? Badge( - position: BadgePosition.topEnd(top: -7, end: -12), - badgeContent: null, - child: Image.asset( - leadPath, - height: ScreenUtil().setHeight(78), - fit: BoxFit.fitHeight, - ), - ) + position: BadgePosition.topEnd(top: -7, end: -12), + badgeContent: null, + child: Image.asset( + leadPath, + height: ScreenUtil().setHeight(78), + fit: BoxFit.fitHeight, + ), + ) : Image.asset( - leadPath, - height: ScreenUtil().setHeight(78), - fit: BoxFit.fitHeight, - ), + leadPath, + height: ScreenUtil().setHeight(78), + fit: BoxFit.fitHeight, + ), title: Text(title, style: TextStyle(fontSize: size, color: textColor)), trailing: trailWidget, contentPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 0), @@ -202,6 +203,10 @@ class _Page4_MyMsicsNewState extends State leadPath: 'assets/images/账户管理.png', leadColor: _deepBlueColor, onTapFun: OnTap_user_manager), + _getListTile('默认导航', + leadPath: 'assets/images/默认地图3.png', + leadColor: _deepBlueColor, + onTapFun: OnTap_DefaultMap), //bNewVer:是否发现新版本 _getListTile('版本更新', leadPath: 'assets/images/版本更新.png', @@ -213,9 +218,7 @@ class _Page4_MyMsicsNewState extends State leadColor: _deepBlueColor, onTapFun: OnTap_download), _getListTile('提醒设置', - leadPath: 'assets/images/语音提醒.png', - leadColor: _deepGreyColor, - onTapFun: OnTap_Remind), + leadPath: 'assets/images/语音提醒.png', leadColor: _deepGreyColor, onTapFun: OnTap_Remind), _getListTile('关于', leadPath: 'assets/images/关于.png', leadColor: _deepBlueColor, onTapFun: OnTap_MyAbout) @@ -511,6 +514,10 @@ class _Page4_MyMsicsNewState extends State Navigator.of(context).push(MaterialPageRoute(builder: (context) => page5_userManager())); } + OnTap_DefaultMap() async { + Navigator.of(context).push(MaterialPageRoute(builder: (context) => page8_defaultMap())); + } + OnTap_download() { Navigator.of(context).push(MaterialPageRoute(builder: (context) => page6_download())); } diff --git a/lib/pages/tabs/page8_defaultMap.dart b/lib/pages/tabs/page8_defaultMap.dart new file mode 100644 index 0000000..7f8723c --- /dev/null +++ b/lib/pages/tabs/page8_defaultMap.dart @@ -0,0 +1,284 @@ +import 'package:badges/badges.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:hyzp_ybqx/pages/Login/FaceReg.dart'; +import 'package:hyzp_ybqx/pages/Login/ModifyPassword.dart'; +import 'package:hyzp_ybqx/services/Storage.dart'; + +import '../../components/commonFun.dart'; +import '../../widget/JdButton.dart'; + +class page8_defaultMap extends StatefulWidget { + page8_defaultMap({Key key}) : super(key: key); + + _LoginPageState createState() => _LoginPageState(); +} + +class _LoginPageState extends State { + bool bSaveDefaultMap = false; + String defaultMapName = ''; + + dispose() { + super.dispose(); + } + + @override + void initState() { + super.initState(); + init(); + } + + void init() async { + // 从磁盘读取变量 + // 是否保存默认地图 + g_bSaveDefaultMap = await Storage.getBool('bSaveDefaultMap'); + g_bSaveDefaultMap = (null == g_bSaveDefaultMap) ? false : g_bSaveDefaultMap; // 默认不保存 + // 用户选择的默认地图名称 + g_defaultMapName = await Storage.getString('defaultMapName'); + g_defaultMapName = (null == g_defaultMapName) ? '' : g_defaultMapName; // 默认为空字符串 + + bSaveDefaultMap = g_bSaveDefaultMap; + // bSaveDefaultMap = false; + // defaultMapName = g_defaultMapName; + // defaultMapName = '高德地图'; + // defaultMapName = getMapChsName('amap'); + defaultMapName = getMapChsName(g_defaultMapName); + setState(() {}); + } + + //////// + static onNullFun() {} + + Widget _getListTile( + title, { + String leadPath = '', + Color leadColor, + Color textColor, + onTapFun = onNullFun, + onLongPressFun = onNullFun, + size = 16.0, + bool bBadge = false, + Widget trailWidget = const Icon(Icons.arrow_forward_ios), + }) { + // print("_getListTile bSaveDefaultMap = $bSaveDefaultMap "); // _getListTile bSaveDefaultMap = false + return Column( + children: [ + ListTile( + leading: bBadge + ? Badge( + position: BadgePosition.topEnd(top: -7, end: -12), + badgeContent: null, + child: Image.asset( + leadPath, + height: ScreenUtil().setHeight(78), + fit: BoxFit.fitHeight, + // color: leadColor, // 无效 + ), + ) + : Image.asset( + leadPath, + height: ScreenUtil().setHeight(78), + fit: BoxFit.fitHeight, + ), + title: Text(title, style: TextStyle(fontSize: size, color: textColor)), + trailing: trailWidget, + contentPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 0), + enabled: true, + onTap: onTapFun, + onLongPress: onLongPressFun, + ), + Divider( + height: 1.0, + ), + ], + ); + } + + List _listViewUser = []; + + Color _greenColor = Color.fromRGBO(36, 206, 192, 1); //绿色 + Color _deepBlueColor = Color.fromRGBO(79, 118, 230, 1); //深蓝 + Color _deepGreyColor = Color.fromRGBO(116, 139, 161, 1); //深灰 + Color _ligthBlueColor = Color.fromRGBO(80, 159, 245, 1); //亮蓝 + + OnTap_FaceReg() async { + Navigator.of(context).push(MaterialPageRoute(builder: (context) => FaceReg())); + } + + OnTap_modify_password() { + Navigator.of(context).push(MaterialPageRoute(builder: (context) => ModifyPassword())); + } + + OnTap_Remind() { + setState(() { + bSaveDefaultMap = !bSaveDefaultMap; + print("bSaveDefaultMap = $bSaveDefaultMap"); + }); + } + + Widget getTextField() { + return Container( + width: ScreenUtil().setWidth(400), + child: TextField( + readOnly: !bSaveDefaultMap, + focusNode: FocusNode(), + textAlignVertical: TextAlignVertical(y: 1.0), + controller: TextEditingController.fromValue(TextEditingValue( + text: defaultMapName.toString(), + // 保持光标在最后 + selection: TextSelection.fromPosition(TextPosition( + affinity: TextAffinity.downstream, offset: defaultMapName.toString().length)))), + maxLines: 1, + keyboardType: TextInputType.text, + decoration: InputDecoration( + //contentPadding: EdgeInsets.only(bottom: 16), + // hintText: widget.text, + // border: OutlineInputBorder( + // borderRadius: BorderRadius.circular(30), borderSide: BorderSide.none), + border: UnderlineInputBorder(borderSide: BorderSide(color: Colors.lightBlue)), + focusedBorder: UnderlineInputBorder(borderSide: BorderSide(color: Colors.lightBlue)), + enabledBorder: UnderlineInputBorder(borderSide: BorderSide(color: Colors.lightBlue)), + ), + onChanged: (v) { + defaultMapName = v; + }, + ), + ); + } + + Widget getText(String text) { + return Container( + child: Text(text, + style: TextStyle( + fontSize: 16, + color: Colors.blueAccent, + fontWeight: FontWeight.bold, + decoration: TextDecoration.underline, + )), + ); + } + + //////// + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: PreferredSize( + preferredSize: Size.fromHeight(ScreenUtil().setHeight(173)), // 设置appBar高度 + // 设置appBar高度 + child: AppBar( + automaticallyImplyLeading: false, + centerTitle: true, + titleSpacing: 0.0, + //设置title的左边距 + flexibleSpace: Container( + //SizedBox(height: ScreenUtil().statusBarHeight), //显示顶部状态栏 + // SizedBox(height: ScreenUtil().setHeight(10)), //显示顶部状态栏 + padding: EdgeInsets.only(top: ScreenUtil().statusBarHeight), //留出顶部状态栏高度 + child: Container( + //height: ScreenUtil().setHeight(173), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + colors: [ + Color.fromRGBO(12, 186, 156, 1), + Color.fromRGBO(39, 127, 235, 1), + ], + ), + ), + // decoration: BoxDecoration( + // gradient: LinearGradient(colors: [ + // Color(0xFF0018EB), + // Color(0xFF01C1D9), + // ], begin: Alignment.bottomCenter, end: Alignment.topCenter), + // ), + ), + ), + title: Padding( + padding: EdgeInsets.only(left: 0, right: 0), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + getIconAndTextButton( + iconColor: Colors.white, + iconData: Icons.chevron_left_outlined, + onPress: () { + Navigator.pop(context); + }, + ), + Expanded( + child: Text("默认导航设置", + style: TextStyle(color: Colors.white, fontSize: 20), + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis), + ), + SizedBox(width: 50), + ], + ), + ), + ), + ), + body: Container( + padding: EdgeInsets.only(top: 30, bottom: 20, left: 20, right: 20), + child: ListView( + children: [ + Center( + child: Container( + margin: EdgeInsets.only(top: 30), + height: ScreenUtil().setWidth(160), + width: ScreenUtil().setWidth(160), + //child: Image.asset('assets/images/user.png', fit: BoxFit.cover), + child: Image.asset('assets/images/ybsthbj.png', fit: BoxFit.fitHeight), + ), + ), + SizedBox(height: 50), + _getListTile('保存默认导航地图', + leadPath: 'assets/images/地图选中.png', + leadColor: _deepGreyColor, + // textColor: bSaveDefaultMap ? Colors.blue : null, + onTapFun: OnTap_Remind, + trailWidget: bSaveDefaultMap + ? Icon(Icons.check_box, color: Colors.blue) + : Icon(Icons.check_box_outline_blank, color: Colors.blueAccent)), + _getListTile('已选默认导航地图:', + leadPath: 'assets/images/用户选择.png', + leadColor: _deepBlueColor, + trailWidget: getText(defaultMapName)), + SizedBox(height: 60), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + JdButton( + height: 128, + width: 282, + //height: 126, + text: "确认", + color: Colors.blueAccent, + onTop: () async { + g_bSaveDefaultMap = bSaveDefaultMap; + await Storage.setBool('bSaveDefaultMap', g_bSaveDefaultMap); + if (!g_bSaveDefaultMap) { + await Storage.setString('defaultMapName', ''); + } + Navigator.pop(context); + }, + ), + JdButton( + height: 128, + width: 282, + //height: 126, + text: "取消", + color: Colors.blueAccent, + onTop: () { + Navigator.pop(context); + }, + ) + ], + ), + ], + ), + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index c7dd44f..7762155 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -377,6 +377,13 @@ packages: relative: true source: path version: "0.0.3" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.19.1" flutter_swiper: dependency: "direct main" description: @@ -408,6 +415,27 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "4.0.1" + geolocator: + dependency: "direct main" + description: + name: geolocator + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.2.1" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.9" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.1" get_it: dependency: "direct main" description: @@ -485,6 +513,13 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" + map_launcher: + dependency: "direct main" + description: + name: map_launcher + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.3+1" matcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index a944aa0..d866097 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -210,6 +210,11 @@ dependencies: # 添加水印插件 disable_screenshots: ^0.1.0 + # 导航相关插件 + map_launcher: ^1.1.3+1 + flutter_svg: ^0.19.1 + geolocator: ^6.2.1 + dev_dependencies: flutter_test: sdk: flutter From bfb8284bf014f80f65328a570ca9e74dc82864d1 Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Thu, 28 Dec 2023 10:56:37 +0800 Subject: [PATCH 13/19] =?UTF-8?q?hyzp=5Fybqx-Commit187=EF=BC=9A=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=E6=9B=B4=E6=96=B0=E4=B8=BAversion:=201.6.2+2?= =?UTF-8?q?0231229=E3=80=82=E5=B7=B2=E7=BB=8F=E5=9F=BA=E6=9C=AC=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E5=9C=A8=E2=80=9C=E7=82=B9=E4=BD=8D=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E2=80=9D=E4=B8=AD=E6=B7=BB=E5=8A=A0=E2=80=9C=E5=AF=BC=E8=88=AA?= =?UTF-8?q?=E2=80=9D=E5=8A=9F=E8=83=BD=EF=BC=8C=E8=83=BD=E5=A4=9F=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E7=94=A8=E6=88=B7=E9=80=89=E6=8B=A9=E7=9A=84=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=AF=BC=E8=88=AA=E5=9C=B0=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pubspec.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index d866097..00f57a7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -76,7 +76,8 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev #version: 1.5.2+20220531 #version: 1.5.3+20220620 #version: 1.5.4+20220827 -version: 1.6.1+20221111 +#version: 1.6.1+20221111 +version: 1.6.2+20231229 environment: sdk: ">=2.7.0 <3.0.0" From c49207e0d1bae079a418e030a6f612de079093e8 Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Thu, 28 Dec 2023 11:14:30 +0800 Subject: [PATCH 14/19] =?UTF-8?q?hyzp=5Fybqx-Commit188=EF=BC=9A=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=E6=9B=B4=E6=96=B0=E4=B8=BAversion:=201.6.3+2?= =?UTF-8?q?0231229=E3=80=82=E5=B7=B2=E7=BB=8F=E5=9F=BA=E6=9C=AC=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E5=9C=A8=E2=80=9C=E7=82=B9=E4=BD=8D=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E2=80=9D=E4=B8=AD=E6=B7=BB=E5=8A=A0=E2=80=9C=E5=AF=BC=E8=88=AA?= =?UTF-8?q?=E2=80=9D=E5=8A=9F=E8=83=BD=EF=BC=8C=E8=83=BD=E5=A4=9F=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E7=94=A8=E6=88=B7=E9=80=89=E6=8B=A9=E7=9A=84=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=AF=BC=E8=88=AA=E5=9C=B0=E5=9B=BE=E3=80=82=20?= =?UTF-8?q?=E4=B8=BA=E5=95=A6=E5=87=8F=E5=B0=8Fapk=E5=8C=85=E4=BD=93?= =?UTF-8?q?=E7=A7=AF=EF=BC=8C=E5=9C=A8=E6=96=87=E4=BB=B6=E4=B8=AD=E9=99=90?= =?UTF-8?q?=E5=AE=9A=E5=8F=AA=E6=94=AF=E6=8C=81"arm64-v8a","armeabi","arme?= =?UTF-8?q?abi-v7a","mips"=EF=BC=8C=E4=B8=8D=E6=94=AF=E6=8C=81"x86=5F64","?= =?UTF-8?q?x86"=E6=A8=A1=E6=8B=9F=E5=99=A8=EF=BC=8Capk=E5=8C=85=E4=BD=93?= =?UTF-8?q?=E7=A7=AF=E7=94=B192.9MB=E5=87=8F=E5=B0=8F=E5=88=B057.6MB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle | 3 +++ android/app/release/output.json | 2 +- pubspec.yaml | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index af31424..0ce4853 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -41,6 +41,9 @@ android { targetSdkVersion 29 versionCode flutterVersionCode.toInteger() versionName flutterVersionName + ndk { + abiFilters "arm64-v8a","armeabi","armeabi-v7a","mips" // 不支持"x86_64","x86"模拟器 + } } buildTypes { diff --git a/android/app/release/output.json b/android/app/release/output.json index ec56918..b22aeb9 100644 --- a/android/app/release/output.json +++ b/android/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":20221111,"versionName":"1.6.1","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":20231229,"versionName":"1.6.3","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 00f57a7..6affbd3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -77,7 +77,8 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev #version: 1.5.3+20220620 #version: 1.5.4+20220827 #version: 1.6.1+20221111 -version: 1.6.2+20231229 +#version: 1.6.2+20231229 +version: 1.6.3+20231229 environment: sdk: ">=2.7.0 <3.0.0" From 1969f3e1421433e0dac1eaa613f1a9264d6771be Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Mon, 19 May 2025 21:21:51 +0800 Subject: [PATCH 15/19] =?UTF-8?q?hyzp=5Fybqx-Commit189=EF=BC=9A=E4=B8=BA?= =?UTF-8?q?=E4=BA=86=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=95=EF=BC=8C=E6=9A=82?= =?UTF-8?q?=E6=97=B6=E6=81=A2=E5=A4=8D=E6=94=AF=E6=8C=81"x86"=E6=A8=A1?= =?UTF-8?q?=E6=8B=9F=E5=99=A8=EF=BC=8C=E7=AD=89=E5=8F=91=E5=B8=83=E6=97=B6?= =?UTF-8?q?=E5=86=8D=E5=8F=96=E6=B6=88=E3=80=82=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E6=92=AD=E6=94=BE=E9=A1=B5=E9=9D=A2=E9=80=80?= =?UTF-8?q?=E5=87=BA=E5=90=8E=E8=BF=98=E5=9C=A8=E8=8E=B7=E5=8F=96=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E6=B5=81=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit R:\FlutterProject\FlutterProject61-hyzp_ybqx_with_ios\hyzp_ybqx\lib\widget\my_superplayer.dart @override void dispose() { Playing = false; // 云台控制代码:1:停止动作、3:启动雨刷、11:焦距变大、12:焦距变小 setSphericalCameraDio(id: widget.id, dwip: widget.dwip, cmdCode: 1); _playerController.release(); // 必须显示释放视频播放资源,否则即使退出视频播放页面后台还在获取视频流 super.dispose(); } --- android/app/build.gradle | 2 +- lib/widget/my_superplayer.dart | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 0ce4853..eddab9e 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -42,7 +42,7 @@ android { versionCode flutterVersionCode.toInteger() versionName flutterVersionName ndk { - abiFilters "arm64-v8a","armeabi","armeabi-v7a","mips" // 不支持"x86_64","x86"模拟器 + abiFilters "x86", "arm64-v8a", "armeabi", "armeabi-v7a", "mips" // 不支持"x86_64","x86"模拟器 } } diff --git a/lib/widget/my_superplayer.dart b/lib/widget/my_superplayer.dart index 2ad47e1..a2c8f29 100644 --- a/lib/widget/my_superplayer.dart +++ b/lib/widget/my_superplayer.dart @@ -60,6 +60,7 @@ class _SuperPlayerPageState extends State Playing = false; // 云台控制代码:1:停止动作、3:启动雨刷、11:焦距变大、12:焦距变小 setSphericalCameraDio(id: widget.id, dwip: widget.dwip, cmdCode: 1); + _playerController.release(); // 必须显示释放视频播放资源,否则即使退出视频播放页面后台还在获取视频流 super.dispose(); } @@ -74,8 +75,7 @@ class _SuperPlayerPageState extends State // }); // init(); - WidgetsBinding.instance.addObserver(this); - + WidgetsBinding.instance.addObserver(this); _playerController.setOption(FijkOption.hostCategory, "enable-snapshot", 1); _playerController.setOption(FijkOption.playerCategory, "mediacodec-all-videos", 1); From 0a5c01306059ab943bc74a0366a8e724796a8ece Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Mon, 19 May 2025 21:49:04 +0800 Subject: [PATCH 16/19] =?UTF-8?q?hyzp=5Fybqx-Commit190=EF=BC=9A=E4=B8=BA?= =?UTF-8?q?=E4=BA=86=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=95=EF=BC=8C=E6=9A=82?= =?UTF-8?q?=E6=97=B6=E6=81=A2=E5=A4=8D=E6=94=AF=E6=8C=81"x86"=E6=A8=A1?= =?UTF-8?q?=E6=8B=9F=E5=99=A8=EF=BC=8C=E7=AD=89=E5=8F=91=E5=B8=83=E6=97=B6?= =?UTF-8?q?=E5=86=8D=E5=8F=96=E6=B6=88=E3=80=82=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=E5=B7=B2=E7=BB=8F=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E4=B8=8D=E5=90=8C=E5=8C=BA=E5=8E=BF=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=90=8E=EF=BC=8C=E5=9C=A8=E2=80=9C=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E4=BA=A4=E8=AD=A6=E2=80=9D=E9=A1=B5=E9=9D=A2=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=AF=B9=E5=BA=94=E5=8D=95=E4=BD=8D=E7=9A=84=E5=85=AC?= =?UTF-8?q?=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 潘总,请你确认一下以下清单。20250519潘总已经微信确认过了。 在区县App中加入区县生态环境局公章的名单: 宜宾市珙县生态环境局.png 宜宾市筠连生态环境局.png 宜宾三江新区城乡融合发展局.png 宜宾市兴文生态环境局.png 宜宾市叙州生态环境局.png 宜宾市长宁生态环境局.png 没有公章的区县生态环境局的名单: 宜宾市翠屏生态环境局.png 宜宾市高县生态环境局.png 宜宾市江安生态环境局.png 宜宾市南溪生态环境局.png --- .../宜宾三江新区城乡融合发展局.png | Bin 0 -> 12463 bytes .../images/宜宾市兴文生态环境局.png | Bin 0 -> 11772 bytes .../images/宜宾市南溪生态环境局.png | Bin 0 -> 12135 bytes .../images/宜宾市叙州生态环境局.png | Bin 0 -> 11919 bytes .../images/宜宾市江安生态环境局.png | Bin 0 -> 11767 bytes .../images/宜宾市珙县生态环境局.png | Bin 0 -> 12036 bytes .../images/宜宾市筠连生态环境局.png | Bin 0 -> 12065 bytes .../images/宜宾市翠屏生态环境局.png | Bin 0 -> 11955 bytes .../images/宜宾市长宁生态环境局.png | Bin 0 -> 11691 bytes .../images/宜宾市高县生态环境局.png | Bin 0 -> 11937 bytes lib/components/UserInfo.dart | 7 +++++++ lib/components/commonFun.dart | 1 + lib/pages/Works/HYSH/tsjj_content_new.dart | 13 +++++++++++-- 13 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 assets/images/宜宾三江新区城乡融合发展局.png create mode 100644 assets/images/宜宾市兴文生态环境局.png create mode 100644 assets/images/宜宾市南溪生态环境局.png create mode 100644 assets/images/宜宾市叙州生态环境局.png create mode 100644 assets/images/宜宾市江安生态环境局.png create mode 100644 assets/images/宜宾市珙县生态环境局.png create mode 100644 assets/images/宜宾市筠连生态环境局.png create mode 100644 assets/images/宜宾市翠屏生态环境局.png create mode 100644 assets/images/宜宾市长宁生态环境局.png create mode 100644 assets/images/宜宾市高县生态环境局.png diff --git a/assets/images/宜宾三江新区城乡融合发展局.png b/assets/images/宜宾三江新区城乡融合发展局.png new file mode 100644 index 0000000000000000000000000000000000000000..434132d76f018151603f87495f1548165bbdd8f7 GIT binary patch literal 12463 zcmV;gFi_8lP)StO&>uS)ve<0AYj> z5AR{$W90N^4L=L-RlQUJ&DC0@ZjPh;=*jPLSYvv5M~MFBAl0-BNIsH15C~g000{K(ZT*WKal6< z?_01!^k@7iDG<<3=fuAC~28EsPoqkpK{9G%|Vj z005J}`Hw&=0RYXHq~ibpyyzHQsFW8>#s~laM4*8xut5h5!4#~(4xGUqyucR%VFpA% z3?#rj5JCpzfE)^;7?wd9RKPme1hudO8lVxH;SjXJF*pt9;1XPc>u?taU>Kgl7`%oF z1VP9M6Ja4bh!J9r*dopd7nzO(B4J20l7OTj>4+3jBE`sZqynizYLQ(?Bl0bB6giDt zK>Co|$RIL`{EECsF_eL_Q3KQhbwIhO9~z3rpmWi5G!I>XmZEFX8nhlgfVQHi(M#xc zbO3#dj$?q)F%D*o*1Pf{>6$SWH+$s3q(pv=X`qR|$iJF~TPzlc-O$C3+J1#CT#lv5;6stS0Uu9wDA3 zUMCI{Uz12A4#|?_P6{CkNG+sOq(0IRX`DyT~9-sA|ffUF>wk++Z! zkWZ5P$;0Hg6gtI-;!FvmBvPc55=u2?Kjj3apE5$3psG>Lsh-pbs)#zDT1jo7c2F-< zhp7`Zb($s3n-)XMq%EV>(3)vyY4>O^>2$gY-Gd%Qm(Z8eYv>2*=jns=cMJ`N4THx> zVkjAF8G9M07`GWOnM|ey)0dgZR4~^v8<}UA514ONSSt1^d=-((5|uiYR+WC0=c-gy zb5%dpd8!Lkt5pxHURHgkMpd&=fR^vEcAI*_=wwAG z2sV%zY%w@v@XU~7=xdm1xY6*0;iwVIXu6TaXrs|dqbIl~?uTdNHFy_3W~^@g_pF#!K2~{F^;XxcN!DEJEbDF7S8PxlSDOr*I-AS3sI8l= z#CDr)-xT5$k15hA^;2%zG3@;83hbKf2JJcaVfH2VZT8O{%p4LO);n}Nd~$Sk%yw*W zyz8XlG{dRHsl(}4XB%gsbDi@w7p6;)%MzD%mlsoQr;4X;pL)xc% z+^yMd)ZNTI#eJ*$O)i@o$z8)e??LqN_gLa_%;TM>o2SC_kmoO6c3xRt`@J4dvz#WL z)-Y|z+r(Soy~}%GIzByR`p)SCKE^%*pL(B%zNWq+-#xw~e%5}Oeh2)X`#bu}{g3#+ z;d$~F@lFL`0l@*~0lk45fwKc^10MvL1f>Tx1&sx}1}_Xg6+#RN4Ot&@lW)Km@*DYM zGu&q^n$Z=?2%QyL8~QNJCQKgI5srq>2;UHXZ>IT7>CCnWh~P(Th`1kV8JQRPeH1Aw zGO8}>QM6NZadh`A)~w`N`)9q5@sFvDxjWlxwsLl7tZHmhY-8-3xPZ8-xPf?w_(k!T z5_A(J3GIpG#Ms0=iQ{tu=WLoYoaCBRmULsT<=mpV7v|~C%bs^USv6UZd^m-e5|^?+ z<%1wXP%juy<)>~<9TW0|n}ttBzM_qyQL(qUN<5P0omQ3hINdvaL;7fjPeygdGYL;p zD|wL_lDQ-EO;$wK-mK5raoH_7l$?~Dqf!lNmb5F^Ft;eTPi8AClMUo~=55LwlZVRp z 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/images/宜宾市叙州生态环境局.png b/assets/images/宜宾市叙州生态环境局.png new file mode 100644 index 0000000000000000000000000000000000000000..aac0ce03d10996013f5f17dd41217dc44d8c1a51 GIT binary patch literal 11919 zcmV;AE^yI_P)StO&>uS)ve<0AYj> z5AR{$W90N^4L=L-RlQUJ&DC0@ZjPh;=*jPLSYvv5M~MFBAl0-BNIsH15C~g000{K(ZT*WKal6< z?_01!^k@7iDG<<3=fuAC~28EsPoqkpK{9G%|Vj z005J}`Hw&=0RYXHq~ibpyyzHQsFW8>#s~laM4*8xut5h5!4#~(4xGUqyucR%VFpA% z3?#rj5JCpzfE)^;7?wd9RKPme1hudO8lVxH;SjXJF*pt9;1XPc>u?taU>Kgl7`%oF z1VP9M6Ja4bh!J9r*dopd7nzO(B4J20l7OTj>4+3jBE`sZqynizYLQ(?Bl0bB6giDt zK>Co|$RIL`{EECsF_eL_Q3KQhbwIhO9~z3rpmWi5G!I>XmZEFX8nhlgfVQHi(M#xc zbO3#dj$?q)F%D*o*1Pf{>6$SWH+$s3q(pv=X`qR|$iJF~TPzlc-O$C3+J1#CT#lv5;6stS0Uu9wDA3 zUMCI{Uz12A4#|?_P6{CkNG+sOq(0IRX`DyT~9-sA|ffUF>wk++Z! zkWZ5P$;0Hg6gtI-;!FvmBvPc55=u2?Kjj3apE5$3psG>Lsh-pbs)#zDT1jo7c2F-< zhp7`Zb($s3n-)XMq%EV>(3)vyY4>O^>2$gY-Gd%Qm(Z8eYv>2*=jns=cMJ`N4THx> zVkjAF8G9M07`GWOnM|ey)0dgZR4~^v8<}UA514ONSSt1^d=-((5|uiYR+WC0=c-gy zb5%dpd8!Lkt5pxHURHgkMpd&=fR^vEcAI*_=wwAG z2sV%zY%w@v@XU~7=xdm1xY6*0;iwVIXu6TaXrs|dqbIl~?uTdNHFy_3W~^@g_pF#!K2~{F^;XxcN!DEJEbDF7S8PxlSDOr*I-AS3sI8l= z#CDr)-xT5$k15hA^;2%zG3@;83hbKf2JJcaVfH2VZT8O{%p4LO);n}Nd~$Sk%yw*W zyz8XlG{dRHsl(}4XB%gsbDi@w7p6;)%MzD%mlsoQr;4X;pL)xc% z+^yMd)ZNTI#eJ*$O)i@o$z8)e??LqN_gLa_%;TM>o2SC_kmoO6c3xRt`@J4dvz#WL z)-Y|z+r(Soy~}%GIzByR`p)SCKE^%*pL(B%zNWq+-#xw~e%5}Oeh2)X`#bu}{g3#+ z;d$~F@lFL`0l@*~0lk45fwKc^10MvL1f>Tx1&sx}1}_Xg6+#RN4Ot&@lW)Km@*DYM zGu&q^n$Z=?2%QyL8~QNJCQKgI5srq>2;UHXZ>IT7>CCnWh~P(Th`1kV8JQRPeH1Aw zGO8}>QM6NZadh`A)~w`N`)9q5@sFvDxjWlxwsLl7tZHmhY-8-3xPZ8-xPf?w_(k!T z5_A(J3GIpG#Ms0=iQ{tu=WLoYoaCBRmULsT<=mpV7v|~C%bs^USv6UZd^m-e5|^?+ z<%1wXP%juy<)>~<9TW0|n}ttBzM_qyQL(qUN<5P0omQ3hINdvaL;7fjPeygdGYL;p zD|wL_lDQ-EO;$wK-mK5raoH_7l$?~Dqf!lNmb5F^Ft;eTPi8AClMUo~=55LwlZVRp z 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 V5@MDk3L^jj002ovPDHLkV1kwwKHdNT literal 0 HcmV?d00001 diff --git a/assets/images/宜宾市江安生态环境局.png b/assets/images/宜宾市江安生态环境局.png new file mode 100644 index 0000000000000000000000000000000000000000..7230accc354b8e302656eba77bbe2bc22d37f7ad GIT binary patch literal 11767 zcmVStO&>uS)ve<0AYj> z5AR{$W90N^4L=L-RlQUJ&DC0@ZjPh;=*jPLSYvv5M~MFBAl0-BNIsH15C~g000{K(ZT*WKal6< z?_01!^k@7iDG<<3=fuAC~28EsPoqkpK{9G%|Vj z005J}`Hw&=0RYXHq~ibpyyzHQsFW8>#s~laM4*8xut5h5!4#~(4xGUqyucR%VFpA% z3?#rj5JCpzfE)^;7?wd9RKPme1hudO8lVxH;SjXJF*pt9;1XPc>u?taU>Kgl7`%oF z1VP9M6Ja4bh!J9r*dopd7nzO(B4J20l7OTj>4+3jBE`sZqynizYLQ(?Bl0bB6giDt zK>Co|$RIL`{EECsF_eL_Q3KQhbwIhO9~z3rpmWi5G!I>XmZEFX8nhlgfVQHi(M#xc zbO3#dj$?q)F%D*o*1Pf{>6$SWH+$s3q(pv=X`qR|$iJF~TPzlc-O$C3+J1#CT#lv5;6stS0Uu9wDA3 zUMCI{Uz12A4#|?_P6{CkNG+sOq(0IRX`DyT~9-sA|ffUF>wk++Z! zkWZ5P$;0Hg6gtI-;!FvmBvPc55=u2?Kjj3apE5$3psG>Lsh-pbs)#zDT1jo7c2F-< zhp7`Zb($s3n-)XMq%EV>(3)vyY4>O^>2$gY-Gd%Qm(Z8eYv>2*=jns=cMJ`N4THx> zVkjAF8G9M07`GWOnM|ey)0dgZR4~^v8<}UA514ONSSt1^d=-((5|uiYR+WC0=c-gy zb5%dpd8!Lkt5pxHURHgkMpd&=fR^vEcAI*_=wwAG z2sV%zY%w@v@XU~7=xdm1xY6*0;iwVIXu6TaXrs|dqbIl~?uTdNHFy_3W~^@g_pF#!K2~{F^;XxcN!DEJEbDF7S8PxlSDOr*I-AS3sI8l= z#CDr)-xT5$k15hA^;2%zG3@;83hbKf2JJcaVfH2VZT8O{%p4LO);n}Nd~$Sk%yw*W zyz8XlG{dRHsl(}4XB%gsbDi@w7p6;)%MzD%mlsoQr;4X;pL)xc% z+^yMd)ZNTI#eJ*$O)i@o$z8)e??LqN_gLa_%;TM>o2SC_kmoO6c3xRt`@J4dvz#WL z)-Y|z+r(Soy~}%GIzByR`p)SCKE^%*pL(B%zNWq+-#xw~e%5}Oeh2)X`#bu}{g3#+ z;d$~F@lFL`0l@*~0lk45fwKc^10MvL1f>Tx1&sx}1}_Xg6+#RN4Ot&@lW)Km@*DYM zGu&q^n$Z=?2%QyL8~QNJCQKgI5srq>2;UHXZ>IT7>CCnWh~P(Th`1kV8JQRPeH1Aw zGO8}>QM6NZadh`A)~w`N`)9q5@sFvDxjWlxwsLl7tZHmhY-8-3xPZ8-xPf?w_(k!T z5_A(J3GIpG#Ms0=iQ{tu=WLoYoaCBRmULsT<=mpV7v|~C%bs^USv6UZd^m-e5|^?+ z<%1wXP%juy<)>~<9TW0|n}ttBzM_qyQL(qUN<5P0omQ3hINdvaL;7fjPeygdGYL;p zD|wL_lDQ-EO;$wK-mK5raoH_7l$?~Dqf!lNmb5F^Ft;eTPi8AClMUo~=55LwlZVRp z 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 Z^na6%2w9vZko^Dv002ovPDHLkV1nId2ciG~ literal 0 HcmV?d00001 diff --git a/assets/images/宜宾市珙县生态环境局.png b/assets/images/宜宾市珙县生态环境局.png new file mode 100644 index 0000000000000000000000000000000000000000..0a42487c834069fa61caa93c2dc5e99a9085b08a GIT binary patch literal 12036 zcmV+fFZStO&>uS)ve<0AYj> z5AR{$W90N^4L=L-RlQUJ&DC0@ZjPh;=*jPLSYvv5M~MFBAl0-BNIsH15C~g000{K(ZT*WKal6< z?_01!^k@7iDG<<3=fuAC~28EsPoqkpK{9G%|Vj z005J}`Hw&=0RYXHq~ibpyyzHQsFW8>#s~laM4*8xut5h5!4#~(4xGUqyucR%VFpA% z3?#rj5JCpzfE)^;7?wd9RKPme1hudO8lVxH;SjXJF*pt9;1XPc>u?taU>Kgl7`%oF z1VP9M6Ja4bh!J9r*dopd7nzO(B4J20l7OTj>4+3jBE`sZqynizYLQ(?Bl0bB6giDt zK>Co|$RIL`{EECsF_eL_Q3KQhbwIhO9~z3rpmWi5G!I>XmZEFX8nhlgfVQHi(M#xc zbO3#dj$?q)F%D*o*1Pf{>6$SWH+$s3q(pv=X`qR|$iJF~TPzlc-O$C3+J1#CT#lv5;6stS0Uu9wDA3 zUMCI{Uz12A4#|?_P6{CkNG+sOq(0IRX`DyT~9-sA|ffUF>wk++Z! zkWZ5P$;0Hg6gtI-;!FvmBvPc55=u2?Kjj3apE5$3psG>Lsh-pbs)#zDT1jo7c2F-< zhp7`Zb($s3n-)XMq%EV>(3)vyY4>O^>2$gY-Gd%Qm(Z8eYv>2*=jns=cMJ`N4THx> zVkjAF8G9M07`GWOnM|ey)0dgZR4~^v8<}UA514ONSSt1^d=-((5|uiYR+WC0=c-gy zb5%dpd8!Lkt5pxHURHgkMpd&=fR^vEcAI*_=wwAG z2sV%zY%w@v@XU~7=xdm1xY6*0;iwVIXu6TaXrs|dqbIl~?uTdNHFy_3W~^@g_pF#!K2~{F^;XxcN!DEJEbDF7S8PxlSDOr*I-AS3sI8l= z#CDr)-xT5$k15hA^;2%zG3@;83hbKf2JJcaVfH2VZT8O{%p4LO);n}Nd~$Sk%yw*W zyz8XlG{dRHsl(}4XB%gsbDi@w7p6;)%MzD%mlsoQr;4X;pL)xc% z+^yMd)ZNTI#eJ*$O)i@o$z8)e??LqN_gLa_%;TM>o2SC_kmoO6c3xRt`@J4dvz#WL z)-Y|z+r(Soy~}%GIzByR`p)SCKE^%*pL(B%zNWq+-#xw~e%5}Oeh2)X`#bu}{g3#+ z;d$~F@lFL`0l@*~0lk45fwKc^10MvL1f>Tx1&sx}1}_Xg6+#RN4Ot&@lW)Km@*DYM zGu&q^n$Z=?2%QyL8~QNJCQKgI5srq>2;UHXZ>IT7>CCnWh~P(Th`1kV8JQRPeH1Aw zGO8}>QM6NZadh`A)~w`N`)9q5@sFvDxjWlxwsLl7tZHmhY-8-3xPZ8-xPf?w_(k!T z5_A(J3GIpG#Ms0=iQ{tu=WLoYoaCBRmULsT<=mpV7v|~C%bs^USv6UZd^m-e5|^?+ z<%1wXP%juy<)>~<9TW0|n}ttBzM_qyQL(qUN<5P0omQ3hINdvaL;7fjPeygdGYL;p zD|wL_lDQ-EO;$wK-mK5raoH_7l$?~Dqf!lNmb5F^Ft;eTPi8AClMUo~=55LwlZVRp z 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 z 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 z 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 FV1foJE*}5@ literal 0 HcmV?d00001 diff --git a/assets/images/宜宾市长宁生态环境局.png b/assets/images/宜宾市长宁生态环境局.png new file mode 100644 index 0000000000000000000000000000000000000000..71446a18f36ce9b8a85aa97551f7908744144baa GIT binary patch literal 11691 zcmV;cEmYEpP)StO&>uS)ve<0AYj> z5AR{$W90N^4L=L-RlQUJ&DC0@ZjPh;=*jPLSYvv5M~MFBAl0-BNIsH15C~g000{K(ZT*WKal6< z?_01!^k@7iDG<<3=fuAC~28EsPoqkpK{9G%|Vj z005J}`Hw&=0RYXHq~ibpyyzHQsFW8>#s~laM4*8xut5h5!4#~(4xGUqyucR%VFpA% z3?#rj5JCpzfE)^;7?wd9RKPme1hudO8lVxH;SjXJF*pt9;1XPc>u?taU>Kgl7`%oF z1VP9M6Ja4bh!J9r*dopd7nzO(B4J20l7OTj>4+3jBE`sZqynizYLQ(?Bl0bB6giDt zK>Co|$RIL`{EECsF_eL_Q3KQhbwIhO9~z3rpmWi5G!I>XmZEFX8nhlgfVQHi(M#xc zbO3#dj$?q)F%D*o*1Pf{>6$SWH+$s3q(pv=X`qR|$iJF~TPzlc-O$C3+J1#CT#lv5;6stS0Uu9wDA3 zUMCI{Uz12A4#|?_P6{CkNG+sOq(0IRX`DyT~9-sA|ffUF>wk++Z! zkWZ5P$;0Hg6gtI-;!FvmBvPc55=u2?Kjj3apE5$3psG>Lsh-pbs)#zDT1jo7c2F-< zhp7`Zb($s3n-)XMq%EV>(3)vyY4>O^>2$gY-Gd%Qm(Z8eYv>2*=jns=cMJ`N4THx> zVkjAF8G9M07`GWOnM|ey)0dgZR4~^v8<}UA514ONSSt1^d=-((5|uiYR+WC0=c-gy zb5%dpd8!Lkt5pxHURHgkMpd&=fR^vEcAI*_=wwAG z2sV%zY%w@v@XU~7=xdm1xY6*0;iwVIXu6TaXrs|dqbIl~?uTdNHFy_3W~^@g_pF#!K2~{F^;XxcN!DEJEbDF7S8PxlSDOr*I-AS3sI8l= z#CDr)-xT5$k15hA^;2%zG3@;83hbKf2JJcaVfH2VZT8O{%p4LO);n}Nd~$Sk%yw*W zyz8XlG{dRHsl(}4XB%gsbDi@w7p6;)%MzD%mlsoQr;4X;pL)xc% z+^yMd)ZNTI#eJ*$O)i@o$z8)e??LqN_gLa_%;TM>o2SC_kmoO6c3xRt`@J4dvz#WL z)-Y|z+r(Soy~}%GIzByR`p)SCKE^%*pL(B%zNWq+-#xw~e%5}Oeh2)X`#bu}{g3#+ z;d$~F@lFL`0l@*~0lk45fwKc^10MvL1f>Tx1&sx}1}_Xg6+#RN4Ot&@lW)Km@*DYM zGu&q^n$Z=?2%QyL8~QNJCQKgI5srq>2;UHXZ>IT7>CCnWh~P(Th`1kV8JQRPeH1Aw zGO8}>QM6NZadh`A)~w`N`)9q5@sFvDxjWlxwsLl7tZHmhY-8-3xPZ8-xPf?w_(k!T z5_A(J3GIpG#Ms0=iQ{tu=WLoYoaCBRmULsT<=mpV7v|~C%bs^USv6UZd^m-e5|^?+ z<%1wXP%juy<)>~<9TW0|n}ttBzM_qyQL(qUN<5P0omQ3hINdvaL;7fjPeygdGYL;p zD|wL_lDQ-EO;$wK-mK5raoH_7l$?~Dqf!lNmb5F^Ft;eTPi8AClMUo~=55LwlZVRp z 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 BuLS@A literal 0 HcmV?d00001 diff --git a/assets/images/宜宾市高县生态环境局.png b/assets/images/宜宾市高县生态环境局.png new file mode 100644 index 0000000000000000000000000000000000000000..b287f14c133a380583d34c889def53d10f029f74 GIT binary patch literal 11937 zcmV;SE?&`zP)StO&>uS)ve<0AYj> z5AR{$W90N^4L=L-RlQUJ&DC0@ZjPh;=*jPLSYvv5M~MFBAl0-BNIsH15C~g000{K(ZT*WKal6< z?_01!^k@7iDG<<3=fuAC~28EsPoqkpK{9G%|Vj z005J}`Hw&=0RYXHq~ibpyyzHQsFW8>#s~laM4*8xut5h5!4#~(4xGUqyucR%VFpA% z3?#rj5JCpzfE)^;7?wd9RKPme1hudO8lVxH;SjXJF*pt9;1XPc>u?taU>Kgl7`%oF z1VP9M6Ja4bh!J9r*dopd7nzO(B4J20l7OTj>4+3jBE`sZqynizYLQ(?Bl0bB6giDt zK>Co|$RIL`{EECsF_eL_Q3KQhbwIhO9~z3rpmWi5G!I>XmZEFX8nhlgfVQHi(M#xc zbO3#dj$?q)F%D*o*1Pf{>6$SWH+$s3q(pv=X`qR|$iJF~TPzlc-O$C3+J1#CT#lv5;6stS0Uu9wDA3 zUMCI{Uz12A4#|?_P6{CkNG+sOq(0IRX`DyT~9-sA|ffUF>wk++Z! zkWZ5P$;0Hg6gtI-;!FvmBvPc55=u2?Kjj3apE5$3psG>Lsh-pbs)#zDT1jo7c2F-< zhp7`Zb($s3n-)XMq%EV>(3)vyY4>O^>2$gY-Gd%Qm(Z8eYv>2*=jns=cMJ`N4THx> zVkjAF8G9M07`GWOnM|ey)0dgZR4~^v8<}UA514ONSSt1^d=-((5|uiYR+WC0=c-gy zb5%dpd8!Lkt5pxHURHgkMpd&=fR^vEcAI*_=wwAG z2sV%zY%w@v@XU~7=xdm1xY6*0;iwVIXu6TaXrs|dqbIl~?uTdNHFy_3W~^@g_pF#!K2~{F^;XxcN!DEJEbDF7S8PxlSDOr*I-AS3sI8l= z#CDr)-xT5$k15hA^;2%zG3@;83hbKf2JJcaVfH2VZT8O{%p4LO);n}Nd~$Sk%yw*W zyz8XlG{dRHsl(}4XB%gsbDi@w7p6;)%MzD%mlsoQr;4X;pL)xc% z+^yMd)ZNTI#eJ*$O)i@o$z8)e??LqN_gLa_%;TM>o2SC_kmoO6c3xRt`@J4dvz#WL z)-Y|z+r(Soy~}%GIzByR`p)SCKE^%*pL(B%zNWq+-#xw~e%5}Oeh2)X`#bu}{g3#+ z;d$~F@lFL`0l@*~0lk45fwKc^10MvL1f>Tx1&sx}1}_Xg6+#RN4Ot&@lW)Km@*DYM zGu&q^n$Z=?2%QyL8~QNJCQKgI5srq>2;UHXZ>IT7>CCnWh~P(Th`1kV8JQRPeH1Aw zGO8}>QM6NZadh`A)~w`N`)9q5@sFvDxjWlxwsLl7tZHmhY-8-3xPZ8-xPf?w_(k!T z5_A(J3GIpG#Ms0=iQ{tu=WLoYoaCBRmULsT<=mpV7v|~C%bs^USv6UZd^m-e5|^?+ z<%1wXP%juy<)>~<9TW0|n}ttBzM_qyQL(qUN<5P0omQ3hINdvaL;7fjPeygdGYL;p zD|wL_lDQ-EO;$wK-mK5raoH_7l$?~Dqf!lNmb5F^Ft;eTPi8AClMUo~=55LwlZVRp z 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 with SingleTickerProviderSta try_setState(); //避免如下异常报错 }); + print('official_seal = $official_seal'); + _widthLeft = _screenWidth / 2; getListFlields(); @@ -123,7 +126,8 @@ class _LoginPageState extends State with SingleTickerProviderSta print('_mapTsjjGetTsStatus = $_mapTsjjGetTsStatus'); // 获取网络图片尺寸,getMediaUrl(_mapGetTsjjGetData['pic_url']) - await flustars.WidgetUtil.getImageWH(url: getMediaUrl(_mapGetTsjjGetData['pic_url'])).then((rect) { + await flustars.WidgetUtil.getImageWH(url: getMediaUrl(_mapGetTsjjGetData['pic_url'])) + .then((rect) { if (null != rect) { _radioImage = rect.height / rect.width; print("rect = $rect,_radioImage = $_radioImage"); @@ -915,8 +919,13 @@ class _LoginPageState extends State with SingleTickerProviderSta //color: Colors.black12, decoration: BoxDecoration( //color: Colors.white, + // image: DecorationImage( + // image: AssetImage("assets/images/jkzx_stamp.png"), fit: BoxFit.contain), + // image: DecorationImage( + // image: AssetImage("assets/images/宜宾市长宁生态环境局.png"), fit: BoxFit.contain), image: DecorationImage( - image: AssetImage("assets/images/jkzx_stamp.png"), fit: BoxFit.contain), + image: AssetImage("assets/images/" + official_seal), fit: BoxFit.contain), + ), //child: ), From 8660f34617256877ff568d82ab2d18f1d8f64a53 Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Tue, 20 May 2025 18:01:46 +0800 Subject: [PATCH 17/19] =?UTF-8?q?hyzp=5Fybqx-Commit191=EF=BC=9A=E4=B8=BA?= =?UTF-8?q?=E5=87=8F=E5=B0=8F=E5=8F=91=E5=B8=83=E7=9A=84apk=E4=BD=93?= =?UTF-8?q?=E7=A7=AF=EF=BC=8C=E5=8F=96=E6=B6=88=E6=94=AF=E6=8C=81"x86"?= =?UTF-8?q?=E6=A8=A1=E6=8B=9F=E5=99=A8=E3=80=82=E7=89=88=E6=9C=AC=E5=8F=B7?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=BA=20version:=201.6.4+20250521?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle | 2 +- android/app/release/output.json | 2 +- pubspec.yaml | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index eddab9e..1e6f864 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -42,7 +42,7 @@ android { versionCode flutterVersionCode.toInteger() versionName flutterVersionName ndk { - abiFilters "x86", "arm64-v8a", "armeabi", "armeabi-v7a", "mips" // 不支持"x86_64","x86"模拟器 + abiFilters "arm64-v8a", "armeabi", "armeabi-v7a", "mips" // 不支持"x86", "x86_64"模拟器 } } diff --git a/android/app/release/output.json b/android/app/release/output.json index b22aeb9..02a09d3 100644 --- a/android/app/release/output.json +++ b/android/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":20231229,"versionName":"1.6.3","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":20250521,"versionName":"1.6.4","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 6affbd3..c02f777 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -78,7 +78,8 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev #version: 1.5.4+20220827 #version: 1.6.1+20221111 #version: 1.6.2+20231229 -version: 1.6.3+20231229 +#version: 1.6.3+20231229 +version: 1.6.4+20250521 environment: sdk: ">=2.7.0 <3.0.0" From 419c614ba42882027a6b04e30bdf52fdf3dedf05 Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Tue, 27 May 2025 10:45:33 +0800 Subject: [PATCH 18/19] =?UTF-8?q?hyzp=5Fybqx-Commit192=EF=BC=9A=E4=B8=BA?= =?UTF-8?q?=E8=BF=9B=E8=A1=8CiOS=E6=89=93=E5=8C=85=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=87=86=E5=A4=87=20=EF=BC=881=EF=BC=89?= =?UTF-8?q?=E4=B8=BA=E4=BA=86=E5=BC=80=E5=8F=91=E6=B5=8B=E8=AF=95=EF=BC=8C?= =?UTF-8?q?=E6=9A=82=E6=97=B6=E6=81=A2=E5=A4=8D=E6=94=AF=E6=8C=81"x86"?= =?UTF-8?q?=E6=A8=A1=E6=8B=9F=E5=99=A8=EF=BC=8C=E7=AD=89=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E6=97=B6=E5=86=8D=E5=8F=96=E6=B6=88=E3=80=82=20=E5=9C=A8=20R:\?= =?UTF-8?q?FlutterProject\FlutterProject61-hyzp=5Fybqx=5Fwith=5Fios\hyzp?= =?UTF-8?q?=5Fybqx\android\app\build.gradle=20=E6=96=87=E4=BB=B6=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E4=B8=8B=E9=9D=A2=E4=BD=8D=E7=BD=AE=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?"x86"=E6=94=AF=E6=8C=81=20=20=20=20=20=20=20=20=20ndk=20{=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20abiFilters=20"x86",=20"arm64-v?= =?UTF-8?q?8a",=20"armeabi",=20"armeabi-v7a",=20"mips"=20//=20=E4=B8=8D?= =?UTF-8?q?=E6=94=AF=E6=8C=81"x86",=20"x86=5F64"=E6=A8=A1=E6=8B=9F?= =?UTF-8?q?=E5=99=A8=20=20=20=20=20=20=20=20=20}?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (2)将 pubspec.yaml 中的路径修改为 macOS 兼容的路径格式(使用 `/` 并指向正确位置): 将文件 R:\FlutterProject\FlutterProject61-hyzp_ybqx_with_ios\hyzp_ybqx\pubspec.yaml 中的 flutter_superplayer: path: .\lib\my_flutter_superplayer 修改为: flutter_superplayer: path: ./lib/my_flutter_superplayer (3)手动统一项目的组织标识 A、获取R:\FlutterProject\FlutterProject61-hyzp_ybqx_with_ios\hyzp_ybqx\android\app\build.gradle中的applicationId defaultConfig { applicationId "com.flutter.hyzp_ybqx" } B、修改iOS的PRODUCT_BUNDLE_IDENTIFIER,苹果AppID不支持下划线 将文件 R:\FlutterProject\FlutterProject61-hyzp_ybqx_with_ios\hyzp_ybqx\ios\Runner.xcodeproj\project.pbxproj中的 com.example.hyzpYibin 全部替换为:com.flutter.hyzpYbqx --- android/app/build.gradle | 2 +- ios/Runner.xcodeproj/project.pbxproj | 6 +++--- pubspec.yaml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 1e6f864..7b8cd28 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -42,7 +42,7 @@ android { versionCode flutterVersionCode.toInteger() versionName flutterVersionName ndk { - abiFilters "arm64-v8a", "armeabi", "armeabi-v7a", "mips" // 不支持"x86", "x86_64"模拟器 + abiFilters "x86", "arm64-v8a", "armeabi", "armeabi-v7a", "mips" // 不支持"x86", "x86_64"模拟器 } } diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a9b68f8..5ea4892 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -310,7 +310,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.hyzpYibin; + PRODUCT_BUNDLE_IDENTIFIER = com.flutter.hyzpYbqx; PRODUCT_NAME = "$(TARGET_NAME)"; VERSIONING_SYSTEM = "apple-generic"; }; @@ -438,7 +438,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.hyzpYibin; + PRODUCT_BUNDLE_IDENTIFIER = com.flutter.hyzpYbqx; PRODUCT_NAME = "$(TARGET_NAME)"; VERSIONING_SYSTEM = "apple-generic"; }; @@ -461,7 +461,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.hyzpYibin; + PRODUCT_BUNDLE_IDENTIFIER = com.flutter.hyzpYbqx; PRODUCT_NAME = "$(TARGET_NAME)"; VERSIONING_SYSTEM = "apple-generic"; }; diff --git a/pubspec.yaml b/pubspec.yaml index c02f777..5aa60b5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -202,7 +202,7 @@ dependencies: flutter_echarts: ^1.5.0 flutter_superplayer: - path: .\lib\my_flutter_superplayer + path: ./lib/my_flutter_superplayer # 二维码生成 https://pub.dev/packages/qr_flutter qr_flutter: ^3.2.0 From ea1ec2c3bf96bba1f89fce922febcd5098823399 Mon Sep 17 00:00:00 2001 From: WinUser01 Date: Tue, 27 May 2025 10:48:24 +0800 Subject: [PATCH 19/19] =?UTF-8?q?hyzp=5Fybqx-Commit193=EF=BC=9A=E4=B8=BA?= =?UTF-8?q?=E8=BF=9B=E8=A1=8CiOS=E6=89=93=E5=8C=85=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=87=86=E5=A4=87=20=EF=BC=881=EF=BC=89?= =?UTF-8?q?=E5=8F=96=E6=B6=88=E6=94=AF=E6=8C=81"x86"=E6=A8=A1=E6=8B=9F?= =?UTF-8?q?=E5=99=A8=20=EF=BC=882=EF=BC=89=E7=89=88=E6=9C=AC=E5=8F=B7?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=BAversion:=201.6.5+20250527?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle | 2 +- pubspec.yaml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 7b8cd28..1e6f864 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -42,7 +42,7 @@ android { versionCode flutterVersionCode.toInteger() versionName flutterVersionName ndk { - abiFilters "x86", "arm64-v8a", "armeabi", "armeabi-v7a", "mips" // 不支持"x86", "x86_64"模拟器 + abiFilters "arm64-v8a", "armeabi", "armeabi-v7a", "mips" // 不支持"x86", "x86_64"模拟器 } } diff --git a/pubspec.yaml b/pubspec.yaml index 5aa60b5..ca88aac 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -79,7 +79,8 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev #version: 1.6.1+20221111 #version: 1.6.2+20231229 #version: 1.6.3+20231229 -version: 1.6.4+20250521 +#version: 1.6.4+20250521 +version: 1.6.5+20250527 environment: sdk: ">=2.7.0 <3.0.0"