Bladeren bron

Merge pull request #89 from CaiJingLong/fix-set-datasource-error-and-crash

Fix set datasource error and dispose crash
Caijinglong 6 jaren geleden
bovenliggende
commit
5dc7494ed5

+ 19 - 5
android/src/main/java/top/kikt/ijkplayer/Ijk.kt

@@ -267,11 +267,25 @@ class Ijk(private val registry: PluginRegistry.Registrar, val options: Map<Strin
     }
 
     fun dispose() {
-        notifyChannel.dispose()
-        methodChannel.setMethodCallHandler(null)
-        textureMediaPlayer.stop()
-        textureMediaPlayer.release()
-        textureEntry.release()
+        tryCatchError {
+            notifyChannel.dispose()
+            methodChannel.setMethodCallHandler(null)
+            textureMediaPlayer.stop()
+        }
+        tryCatchError {
+            textureMediaPlayer.release()
+        }
+        tryCatchError {
+            textureEntry.release()
+        }
+    }
+
+    private fun tryCatchError(runnable: () -> Unit) {
+        try {
+            runnable()
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
     }
 
     private fun play() {

+ 2 - 0
example/lib/page/developing/develop_index.dart

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
 
 import 'develop_prepare_page.dart';
 import 'live_interruption_page.dart';
+import 'src_error_page.dart';
 
 class DevelopingIndexPage extends StatefulWidget {
   @override
@@ -19,6 +20,7 @@ class DevelopingIndexPageState extends State<DevelopingIndexPage> {
         children: <Widget>[
           buildButton("developing preare page", ForPreparePage()),
           buildButton("直播中断", LiveInterruptionPage()),
+          buildButton("视频源错误", SreErrorPage()),
         ],
       ),
     );

+ 83 - 0
example/lib/page/developing/src_error_page.dart

@@ -0,0 +1,83 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
+
+class VideoWidget extends StatefulWidget {
+  final String url;
+  VideoWidget(this.url);
+  @override
+  _VideoWidgetState createState() => _VideoWidgetState();
+}
+
+class _VideoWidgetState extends State<VideoWidget> with WidgetsBindingObserver {
+  IjkMediaController controller;
+  @override
+  void initState() {
+    super.initState();
+    controller = IjkMediaController();
+    controller.setNetworkDataSource(widget.url, autoPlay: true);
+    Stream<IjkStatus> ijkStatusStream = controller.ijkStatusStream;
+    ijkStatusStream.listen((status) {
+      if (status == IjkStatus.complete) {
+        controller?.play();
+      }
+    });
+//    SystemChannels.lifecycle.setMessageHandler((msg) {});
+  }
+
+  @override
+  void didChangeAppLifecycleState(AppLifecycleState state) {
+    if (state == AppLifecycleState.resumed) {
+      controller?.play();
+    } else if (state == AppLifecycleState.paused) {
+      controller?.pause();
+    }
+  }
+
+  @override
+  void deactivate() {
+    super.deactivate();
+    controller?.pause();
+  }
+
+  @override
+  void reassemble() {
+    super.reassemble();
+    controller?.play();
+  }
+
+  @override
+  void dispose() {
+    super.dispose();
+    controller?.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return IjkPlayer(
+      mediaController: controller,
+      controllerWidgetBuilder: (mController) => new Container(),
+    );
+  }
+}
+
+class SreErrorPage extends StatefulWidget {
+  @override
+  _SreErrorPageState createState() => _SreErrorPageState();
+}
+
+class _SreErrorPageState extends State<SreErrorPage> {
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(),
+      body: Container(
+        child: PageView.builder(
+          itemBuilder: (BuildContext context, int index) {
+            // return VideoWidget("http://114.55.36.48/1204/27/index$index.m3u8");
+            return VideoWidget("http://itv.100.ahct.lv1.vcache.cn/100/ott_baseline_kalaok/hd/151/CP0541903573/playlist.m3u8");
+          },
+        ),
+      ),
+    );
+  }
+}