Skip to content

Commit 12c433f

Browse files
committed
fix android permission not working
1 parent 32aa8c8 commit 12c433f

File tree

9 files changed

+123
-89
lines changed

9 files changed

+123
-89
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.1.5
2+
3+
* fix Android permission not working
4+
15
## 0.1.4
26

37
* fix userName vs Password is null object reference

android/src/main/AndroidManifest.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
22
package="com.namit.flutter_wowza">
33
<uses-permission android:name="android.permission.CAMERA" />
4-
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
5-
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
64
<uses-permission android:name="android.permission.RECORD_AUDIO" />
75

86
<uses-permission android:name="android.permission.INTERNET" />

android/src/main/kotlin/com/namit/flutter_wowza/FlutterWOWZCameraView.kt

Lines changed: 96 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,14 @@ import io.flutter.plugin.platform.PlatformView
3030
class FlutterWOWZCameraView internal
3131
constructor(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
}

example/lib/main.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ class _MyAppState extends State<MyApp> {
3535
width: 1280,
3636
child: WOWZCameraView(
3737
apiLicenseKey: (defaultTargetPlatform == TargetPlatform.android)
38-
? "GOSK-xxxx-xxxx-xxxx-xxxx-xxxx"
39-
: "GOSK-xxxx-xxxx-xxxx-xxxx-xxxx",
38+
? "GOSK-9C47-010C-2895-D225-9FEF"
39+
: "GOSK-9C47-010C-A9B9-EB78-3FBD",
4040
controller: controller,
4141
hostAddress: "xxx.xxx.xxx.xxx",
4242
portNumber: 1935,

example/pubspec.lock

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ packages:
8080
path: ".."
8181
relative: true
8282
source: path
83-
version: "0.0.1"
83+
version: "0.1.4"
8484
image:
8585
dependency: transitive
8686
description:
@@ -200,3 +200,4 @@ packages:
200200
version: "3.5.0"
201201
sdks:
202202
dart: ">=2.4.0 <3.0.0"
203+
flutter: ">=1.10.0 <2.0.0"

ios/Classes/FlutterWOWZCameraView.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,11 @@ public class FlutterWOWZCameraView : NSObject, FlutterPlatformView,WOWZBroadcast
133133
self.goCoder = goCoder
134134
print("gocoder is init!")
135135
WowzaGoCoder.requestPermission(for: .camera, response: { (permission) in
136-
print("Camera permission is: \(permission == .authorized ? "authorized" : "denied")")
136+
print("Camera permission is: \(permission == .authorized ? "authorized" : "denied")")
137137
})
138138

139139
WowzaGoCoder.requestPermission(for: .microphone, response: { (permission) in
140-
print("Microphone permission is: \(permission == .authorized ? "authorized" : "denied")")
140+
print("Microphone permission is: \(permission == .authorized ? "authorized" : "denied")")
141141
})
142142
self.goCoder?.config = self.goCoderConfig
143143
self.goCoder?.cameraView = self.uiView
@@ -146,11 +146,11 @@ public class FlutterWOWZCameraView : NSObject, FlutterPlatformView,WOWZBroadcast
146146
break
147147
case "start_preview":
148148
WowzaGoCoder.requestPermission(for: .camera, response: { (permission) in
149-
print("Camera permission is: \(permission == .authorized ? "authorized" : "denied")")
149+
print("Camera permission is: \(permission == .authorized ? "authorized" : "denied")")
150150
})
151151

152152
WowzaGoCoder.requestPermission(for: .microphone, response: { (permission) in
153-
print("Microphone permission is: \(permission == .authorized ? "authorized" : "denied")")
153+
print("Microphone permission is: \(permission == .authorized ? "authorized" : "denied")")
154154
})
155155
self.cameraView?.start()
156156
break;

lib/gocoder/src/wowz_camera_view.dart

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -195,12 +195,20 @@ class _WOWZCameraViewState extends State<WOWZCameraView> {
195195
widget.controller?._setChannel(_channel);
196196

197197
// license key gocoder sdk
198-
_channel.invokeMethod(_apiLicenseKey, widget.apiLicenseKey);
198+
_channel.invokeMethod(_apiLicenseKey, widget.apiLicenseKey);
199199
// Set the connection properties for the target Wowza Streaming Engine server or Wowza Streaming Cloud live stream
200-
_channel.invokeMethod(_hostAddress, widget.hostAddress);
201-
_channel.invokeMethod(_portNumber, widget.portNumber);
202-
_channel.invokeMethod(_applicationName, widget.applicationName);
203-
_channel.invokeMethod(_streamName, widget.streamName);
200+
if (widget.hostAddress != null && widget.hostAddress.isNotEmpty) {
201+
_channel.invokeMethod(_hostAddress, widget.hostAddress);
202+
}
203+
if (widget.portNumber != null) {
204+
_channel.invokeMethod(_portNumber, widget.portNumber);
205+
}
206+
if (widget.applicationName != null && widget.applicationName.isNotEmpty) {
207+
_channel.invokeMethod(_applicationName, widget.applicationName);
208+
}
209+
if (widget.streamName != null && widget.streamName.isNotEmpty) {
210+
_channel.invokeMethod(_streamName, widget.streamName);
211+
}
204212
//authentication
205213
if (widget.username != null) {
206214
_channel.invokeMethod(_username, widget.username);
@@ -219,15 +227,12 @@ class _WOWZCameraViewState extends State<WOWZCameraView> {
219227
if (widget.scaleMode != null) {
220228
_channel.invokeMethod(_scaleMode, widget.scaleMode.toString());
221229
}
222-
223230
if(widget.fps!=null){
224231
_channel.invokeListMethod(_fps,widget.fps);
225232
}
226-
227233
if(widget.bps !=null){
228234
_channel.invokeListMethod(_bps,widget.bps);
229235
}
230-
231236
if(widget.khz !=null){
232237
_channel.invokeListMethod(_bps,widget.bps);
233238
}

pubspec.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,3 +186,4 @@ packages:
186186
version: "3.5.0"
187187
sdks:
188188
dart: ">=2.4.0 <3.0.0"
189+
flutter: ">=1.10.0 <2.0.0"

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: flutter_wowza
22
description: Flutter WOWZA plugin for iOS/Android. The project is based on Wowza GoCoder SDK
33
homepage: https://github.com/VNAPNIC/flutter-wowza
4-
version: 0.1.4
4+
version: 0.1.5
55
author: vn.apnic@gmail.comn
66

77
environment:

0 commit comments

Comments
 (0)