@@ -30,15 +30,14 @@ import io.flutter.plugin.platform.PlatformView
3030class FlutterWOWZCameraView internal
3131constructor (private val context: Context ? , private val registrar: PluginRegistry .Registrar ,
3232 private val methodChannel: MethodChannel , id: Int? , params: Map <String , Any >? ) :
33- PlatformView , MethodChannel .MethodCallHandler , WOWZBroadcastStatusCallback , WOWZStatusCallback , PluginRegistry .RequestPermissionsResultListener {
34-
35- // define callback interface
36- interface PermissionCallbackInterface {
37- fun onPermissionResult (result : Boolean )
38- }
33+ PlatformView , MethodChannel .MethodCallHandler ,
34+ WOWZBroadcastStatusCallback , WOWZStatusCallback ,
35+ PluginRegistry .RequestPermissionsResultListener {
3936
4037 private var mPermissionsGranted = false
4138 private var hasRequestedPermissions = false
39+ var videoIsInitialized = false
40+ var audioIsInitialized = false
4241
4342 private val PERMISSIONS_REQUEST_CODE = 0x1
4443
@@ -49,8 +48,6 @@ constructor(private val context: Context?, private val registrar: PluginRegistry
4948// Manifest.permission.READ_PHONE_STATE
5049 )
5150
52- private var callbackFunction: PermissionCallbackInterface ? = null
53-
5451 private val goCoderCameraView: WOWZCameraView = WOWZCameraView (context)
5552 // The top-level GoCoder API interface
5653 private var goCoder: WowzaGoCoder ? = null
@@ -62,6 +59,8 @@ constructor(private val context: Context?, private val registrar: PluginRegistry
6259 private var goCoderBroadcastConfig: WOWZBroadcastConfig ? = null
6360
6461 init {
62+ registrar.addRequestPermissionsResultListener(this )
63+
6564 methodChannel.setMethodCallHandler(this )
6665 // Create a broadcaster instance
6766 goCoderBroadcaster = WOWZBroadcast ()
@@ -129,51 +128,18 @@ constructor(private val context: Context?, private val registrar: PluginRegistry
129128 goCoderCameraView.scaleMode = scale
130129 }
131130
131+ " init_go_coder" -> {
132+ if (requestPermissionToAccess())
133+ onPermissionResult(true )
134+ }
132135 " start_preview" -> {
133- if (goCoder != null ) {
134- var videoIsInitialized = false
135- var audioIsInitialized = false
136- this .hasDevicePermissionToAccess(object : PermissionCallbackInterface {
137- override fun onPermissionResult (result : Boolean ) {
138-
139- Log .i(" FlutterWOWZCameraView" , " onPermissionResult $result " )
140-
141- if (result) {
142- // Initialize the camera preview
143- if (hasDevicePermissionToAccess(Manifest .permission.CAMERA )) {
144- val availableCameras = goCoderCameraView.cameras
145- // Ensure we can access to at least one camera
146- if (availableCameras.isNotEmpty()) {
147- // Set the video broadcaster in the broadcast config
148- goCoderBroadcastConfig?.videoBroadcaster = goCoderCameraView
149- videoIsInitialized = true
150- Log .i(" FlutterWOWZCameraView" , " *** getOriginalFrameSizes - Get original frame size : " )
151- } else {
152- Log .i(" FlutterWOWZCameraView" , " Could not detect or gain access to any cameras on this device" )
153- goCoderBroadcastConfig?.isVideoEnabled = false
154- }
155- }
156-
157- if (hasDevicePermissionToAccess(Manifest .permission.RECORD_AUDIO )) {
158- // Create an audio device instance for capturing and broadcasting audio
159- goCoderAudioDevice = WOWZAudioDevice ()
160- // Set the audio broadcaster in the broadcast config
161- goCoderBroadcastConfig?.audioBroadcaster = goCoderAudioDevice
162- audioIsInitialized = true
163- }
164-
165- if (videoIsInitialized && audioIsInitialized) {
166- Log .i(" FlutterWOWZCameraView" , " startPreview" )
167- if (! goCoderCameraView.isPreviewing)
168- goCoderCameraView.startPreview()
169- }
170- }
171- }
172- })
173-
136+ if (requestPermissionToAccess()) {
137+ if (videoIsInitialized && audioIsInitialized && ! goCoderCameraView.isPreviewing )
138+ goCoderCameraView.startPreview()
139+ else
140+ onPermissionResult(true )
174141 }
175142 }
176-
177143 " pause_preview" -> activeCamera?.pausePreview()
178144
179145 " continue_preview" -> activeCamera.continuePreview()
@@ -254,29 +220,37 @@ constructor(private val context: Context?, private val registrar: PluginRegistry
254220 }
255221 }
256222
257- private fun hasDevicePermissionToAccess (callback : PermissionCallbackInterface ) {
258- this .callbackFunction = callback
259- var result = false
260-
261- if (goCoderBroadcaster != null ) {
262- if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
263- result = if (mRequiredPermissions.isNotEmpty()) hasDevicePermissionToAccess(mRequiredPermissions) else true
264-
265- if (! result && ! hasRequestedPermissions) {
266- ActivityCompat .requestPermissions(registrar.activity(),
267- mRequiredPermissions,
268- PERMISSIONS_REQUEST_CODE )
269- hasRequestedPermissions = true
270- }
223+ private fun requestPermissionToAccess (): Boolean {
224+ var result = true
225+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
226+ result = if (mRequiredPermissions.isNotEmpty()) checkPermissionToAccess(mRequiredPermissions) else true
227+
228+ if (! result && ! hasRequestedPermissions) {
229+ ActivityCompat .requestPermissions(registrar.activity(),
230+ mRequiredPermissions,
231+ PERMISSIONS_REQUEST_CODE )
232+ hasRequestedPermissions = true
271233 }
272234 }
273-
274- this .callbackFunction?.onPermissionResult(result)
235+ return result
275236 }
276237
277- private fun hasDevicePermissionToAccess ( permissions : Array < String > ): Boolean {
238+ private fun requestPermissionToAccess ( source : String ): Boolean {
278239 var result = true
240+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
241+ result = if (mRequiredPermissions.isNotEmpty()) checkPermissionToAccess(source) else true
242+ if (! result && ! hasRequestedPermissions) {
243+ ActivityCompat .requestPermissions(registrar.activity(),
244+ mRequiredPermissions,
245+ PERMISSIONS_REQUEST_CODE )
246+ hasRequestedPermissions = true
247+ }
248+ }
249+ return result
250+ }
279251
252+ private fun checkPermissionToAccess (permissions : Array <String >): Boolean {
253+ var result = true
280254 if (goCoderBroadcaster != null ) {
281255 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
282256 for (permission in permissions) {
@@ -285,19 +259,23 @@ constructor(private val context: Context?, private val registrar: PluginRegistry
285259 }
286260 }
287261 }
262+ } else {
263+ Log .e(" FlutterWOWZCameraView" , " goCoderBroadcaster is null!" )
264+ result = false
288265 }
289-
290- Log .i(" FlutterWOWZCameraView" , " hasDevicePermissionToAccess $result " )
291266 return result
292267 }
293268
294- private fun hasDevicePermissionToAccess (source : String ): Boolean {
269+ private fun checkPermissionToAccess (source : String ): Boolean {
295270 if (goCoderBroadcaster != null ) {
296271 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
297272 if (ContextCompat .checkSelfPermission(registrar.activity(), source) == PackageManager .PERMISSION_DENIED ) {
298273 return false
299274 }
300275 }
276+ } else {
277+ Log .e(" FlutterWOWZCameraView" , " goCoderBroadcaster is null!" )
278+ return false
301279 }
302280 return true
303281 }
@@ -312,9 +290,56 @@ constructor(private val context: Context?, private val registrar: PluginRegistry
312290 }
313291 }
314292 hasRequestedPermissions = false
293+ onPermissionResult(mPermissionsGranted)
315294 }
316295 }
317- this .callbackFunction?.onPermissionResult(mPermissionsGranted)
296+
297+ Log .i(" FlutterWOWZCameraView" , " onRequestPermissionsResult has requested: $hasRequestedPermissions " )
318298 return true
319299 }
300+
301+ private fun onPermissionResult (mPermissionsGranted : Boolean ) {
302+ if (goCoder != null ) {
303+ if (mPermissionsGranted) {
304+ // Initialize the camera preview
305+ if (requestPermissionToAccess(Manifest .permission.CAMERA )) {
306+ if (! videoIsInitialized) {
307+ val availableCameras = goCoderCameraView.cameras
308+ // Ensure we can access to at least one camera
309+ if (availableCameras.isNotEmpty()) {
310+ // Set the video broadcaster in the broadcast config
311+ goCoderBroadcastConfig?.videoBroadcaster = goCoderCameraView
312+ videoIsInitialized = true
313+ Log .i(" FlutterWOWZCameraView" , " *** getOriginalFrameSizes - Get original frame size : " )
314+ } else {
315+ Log .e(" FlutterWOWZCameraView" , " Could not detect or gain access to any cameras on this device" )
316+ goCoderBroadcastConfig?.isVideoEnabled = false
317+ }
318+ }
319+ } else {
320+ Log .e(" FlutterWOWZCameraView" , " Exception Fail to connect to camera service. I checked camera permission in Settings" )
321+ }
322+
323+ if (requestPermissionToAccess(Manifest .permission.RECORD_AUDIO )) {
324+ if (! audioIsInitialized) {
325+ // Create an audio device instance for capturing and broadcasting audio
326+ goCoderAudioDevice = WOWZAudioDevice ()
327+ // Set the audio broadcaster in the broadcast config
328+ goCoderBroadcastConfig?.audioBroadcaster = goCoderAudioDevice
329+ audioIsInitialized = true
330+ }
331+ } else {
332+ Log .e(" FlutterWOWZCameraView" , " Exception Fail to connect to record audio service. I checked camera permission in Settings" )
333+ }
334+
335+ if (videoIsInitialized && audioIsInitialized) {
336+ Log .i(" FlutterWOWZCameraView" , " startPreview" )
337+ if (! goCoderCameraView.isPreviewing)
338+ goCoderCameraView.startPreview()
339+ }
340+ }
341+ } else {
342+ Log .e(" FlutterWOWZCameraView" , " goCoder is null!, Please check the license key GoCoder SDK, maybe your license key GoCoder SDK is wrong!" )
343+ }
344+ }
320345}
0 commit comments