Explorar o código

增加了一个init方法 用于移除热重载之前所有的原生ijk对象 需要手动调用

cjl_macbook %!s(int64=6) %!d(string=hai) anos
pai
achega
f9ec29f0b1

+ 7 - 0
android/src/main/java/top/kikt/ijkplayer/IjkManager.kt

@@ -24,4 +24,11 @@ class IjkManager(private val registrar: PluginRegistry.Registrar) {
         ijkList.remove(ijk)
         ijk.dispose()
     }
+
+    fun disposeAll() {
+        for (ijk in ijkList.toList()) {
+            ijkList.remove(ijk)
+            ijk.dispose()
+        }
+    }
 }

+ 10 - 1
android/src/main/java/top/kikt/ijkplayer/IjkplayerPlugin.kt

@@ -2,6 +2,7 @@ package top.kikt.ijkplayer
 
 import android.content.Context
 import android.media.AudioManager
+import android.os.Build
 import io.flutter.plugin.common.MethodCall
 import io.flutter.plugin.common.MethodChannel
 import io.flutter.plugin.common.MethodChannel.MethodCallHandler
@@ -21,6 +22,10 @@ class IjkplayerPlugin(private val registrar: Registrar) : MethodCallHandler {
 
     private fun handleMethodCall(call: MethodCall, result: Result) {
         when (call.method) {
+            "init" -> {
+                manager.disposeAll()
+                result.success(true)
+            }
             "create" -> {
                 try {
                     val ijk = manager.create()
@@ -50,7 +55,11 @@ class IjkplayerPlugin(private val registrar: Registrar) : MethodCallHandler {
         val am = registrar.activity().getSystemService(Context.AUDIO_SERVICE) as AudioManager?
         am?.apply {
             val max = getStreamMaxVolume(AudioManager.STREAM_MUSIC)
-            val min = getStreamMinVolume(AudioManager.STREAM_MUSIC)
+            val min = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                getStreamMinVolume(AudioManager.STREAM_MUSIC)
+            } else {
+                0
+            }
             val diff: Float = (max - min).toFloat()
             val target: Int = ((min + diff) * volume).toInt()
             setStreamVolume(AudioManager.STREAM_MUSIC, target, 0)

+ 5 - 0
example/android/app/build.gradle

@@ -51,6 +51,11 @@ android {
             // Signing with the debug keys for now, so `flutter run --release` works.
             signingConfig signingConfigs.debug
         }
+        debug {
+            ndk {
+                abiFilters "armeabi-v7a","x86"
+            }
+        }
     }
 }
 

+ 4 - 4
example/ios/Podfile.lock

@@ -9,8 +9,8 @@ PODS:
 
 DEPENDENCIES:
   - Flutter (from `.symlinks/flutter/ios`)
-  - flutter_ijkplayer (from `/Users/cai/Documents/GitHub/flutter_ijkplayer/ios/flutter_ijkplayer.podspec`)
-  - photo_manager (from `/Users/cai/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-0.3.3/ios/photo_manager.podspec`)
+  - flutter_ijkplayer (from `/Users/caijinglong/Documents/GitHub/flutter_ijkplayer/ios/flutter_ijkplayer.podspec`)
+  - photo_manager (from `/Users/caijinglong/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-0.3.3/ios/photo_manager.podspec`)
 
 SPEC REPOS:
   https://github.com/cocoapods/specs.git:
@@ -20,9 +20,9 @@ EXTERNAL SOURCES:
   Flutter:
     :path: ".symlinks/flutter/ios"
   flutter_ijkplayer:
-    :path: "/Users/cai/Documents/GitHub/flutter_ijkplayer/ios/flutter_ijkplayer.podspec"
+    :path: "/Users/caijinglong/Documents/GitHub/flutter_ijkplayer/ios/flutter_ijkplayer.podspec"
   photo_manager:
-    :path: "/Users/cai/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-0.3.3/ios/photo_manager.podspec"
+    :path: "/Users/caijinglong/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-0.3.3/ios/photo_manager.podspec"
 
 SPEC CHECKSUMS:
   Flutter: 58dd7d1b27887414a370fcccb9e645c08ffd7a6a

+ 4 - 1
example/lib/main.dart

@@ -6,7 +6,10 @@ import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
 import 'package:photo/photo.dart';
 import 'package:photo_manager/photo_manager.dart';
 
-void main() => runApp(MyApp());
+void main() {
+  initIJKPlayer();
+  runApp(MyApp());
+}
 
 class MyApp extends StatefulWidget {
   @override

+ 2 - 0
ios/Classes/CoolFlutterIjkManager.h

@@ -20,4 +20,6 @@
 - (CoolFlutterIJK *)findIJKWithId:(int64_t)id1;
 
 - (void)disposeWithId:(int64_t)id;
+
+- (void)disposeAll;
 @end

+ 9 - 1
ios/Classes/CoolFlutterIjkManager.m

@@ -7,7 +7,7 @@
 #import <IJKMediaFramework/IJKMediaFramework.h>
 
 @implementation CoolFlutterIjkManager {
-    NSMutableDictionary<NSNumber *, CoolFlutterIJK * > *dict;
+    NSMutableDictionary<NSNumber *, CoolFlutterIJK *> *dict;
 }
 
 
@@ -44,4 +44,12 @@
     }
 }
 
+- (void)disposeAll {
+    NSArray<NSNumber *> *keys = dict.allKeys;
+    for (NSNumber *key in keys) {
+        CoolFlutterIJK *ijk = dict[key];
+        [dict removeObjectForKey:key];
+        [ijk dispose];
+    }
+}
 @end

+ 3 - 0
ios/Classes/IjkplayerPlugin.m

@@ -67,6 +67,9 @@ static IjkplayerPlugin *__sharedInstance;
             int volume = [params[@"setSystemVolume"] intValue];
             [self setVolume:volume];
             result(@YES);
+        } else if ([@"init" isEqualToString:call.method]) {
+            [self->manager disposeAll];
+            result(@YES);
         } else {
             result(FlutterMethodNotImplemented);
         }

+ 11 - 2
lib/src/controller.dart

@@ -185,14 +185,23 @@ class IjkMediaController {
 }
 
 /// about channel
-
-const MethodChannel _globalChannel = MethodChannel("top.kikt/ijkplayer");
+MethodChannel _globalChannel = MethodChannel("top.kikt/ijkplayer");
 
 Future<int> _createIjk() async {
   int id = await _globalChannel.invokeMethod("create");
   return id;
 }
 
+/// For the hot reload/ hot restart to release last texture resource. Release version does not have hot reload, so you can not call it.
+///
+/// release版本可不调用, 主要是为了释放hot restart/hot reload的资源,因为原生资源不参与热重载
+///
+///
+/// If this method is not invoked in the debug version, the sound before the hot reload will continue to play.
+Future<void> initIJKPlayer() async {
+  _globalChannel.invokeMethod("init");
+}
+
 class _IjkPlugin {
   MethodChannel get channel => MethodChannel("top.kikt/ijkplayer/$textureId");
 

+ 4 - 2
lib/src/widget/controller.dart

@@ -46,6 +46,7 @@ class _DefaultControllerWidgetState extends State<DefaultControllerWidget> {
   }
 
   void _onTextIdChange(int textId) {
+    print("onTextChange");
     if (textId != null) {
       startTimer();
     } else {
@@ -56,12 +57,12 @@ class _DefaultControllerWidgetState extends State<DefaultControllerWidget> {
   @override
   void deactivate() {
     super.deactivate();
-    controllerSubscription.cancel();
-    stopTimer();
   }
 
   @override
   void dispose() {
+    controllerSubscription.cancel();
+    stopTimer();
     super.dispose();
   }
 
@@ -72,6 +73,7 @@ class _DefaultControllerWidgetState extends State<DefaultControllerWidget> {
 
     progressTimer?.cancel();
     progressTimer = Timer.periodic(Duration(milliseconds: 400), (timer) {
+      print("will refresh info");
       controller.refreshVideoInfo();
     });
   }