davidliu
Committed by GitHub

Permissions cleanup (#12)

* bringing in audio/video perms into sdk and documentation

* Update README.md
... ... @@ -67,6 +67,11 @@ class MainActivity : AppCompatActivity(), RoomListener {
}
```
### Permissions
LiveKit relies on the `RECORD_AUDIO` and `CAMERA` permissions to use the microphone and camera.
These permission must be requested at runtime. Reference the [sample app](https://github.com/livekit/client-sdk-android/blob/4e76e36e0d9f895c718bd41809ab5ff6c57aabd4/sample-app-compose/src/main/java/io/livekit/android/composesample/MainActivity.kt#L134) for an example.
## Dev Environment
To develop the Android SDK itself, you'll need:
... ...
... ... @@ -51,7 +51,7 @@ ext {
minVersion : 21,
]
versions = [
androidx_core : "1.2.0",
androidx_core : "1.6.0",
androidx_lifecycle: "2.3.1",
dagger : "2.27",
groupie : "2.9.0",
... ...
... ... @@ -101,6 +101,8 @@ dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.1.0'
api 'com.github.webrtc-sdk:android:92.4515.01'
api "com.squareup.okhttp3:okhttp:4.9.0"
implementation "androidx.annotation:annotation:1.2.0"
implementation "androidx.core:core:${versions.androidx_core}"
implementation "com.google.protobuf:protobuf-java:${versions.protobuf}"
implementation "com.google.protobuf:protobuf-java-util:${versions.protobuf}"
... ...
... ... @@ -3,4 +3,7 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
</manifest>
... ...
package io.livekit.android.room.participant
import android.Manifest
import android.content.Context
import android.media.MediaCodecInfo
import androidx.annotation.RequiresPermission
import com.google.protobuf.ByteString
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
... ... @@ -32,6 +34,11 @@ internal constructor(
private val localTrackPublications
get() = tracks.values.toList()
/**
* Creates an audio track, recording audio through the microphone with the given [options].
*
* @exception SecurityException will be thrown if [Manifest.permission.RECORD_AUDIO] permission is missing.
*/
fun createAudioTrack(
name: String = "",
options: LocalAudioTrackOptions = LocalAudioTrackOptions(),
... ... @@ -45,9 +52,14 @@ internal constructor(
MediaConstraints.KeyValuePair("googTypingNoiseDetection", options.typingNoiseDetection.toString()),
)
audioConstraints.optional.addAll(items)
return LocalAudioTrack.createTrack(peerConnectionFactory, audioConstraints, name)
return LocalAudioTrack.createTrack(context, peerConnectionFactory, audioConstraints, name)
}
/**
* Creates a video track, recording video through the camera with the given [options].
*
* @exception SecurityException will be thrown if [Manifest.permission.CAMERA] permission is missing.
*/
fun createVideoTrack(
name: String = "",
options: LocalVideoTrackOptions = LocalVideoTrackOptions(),
... ...
package io.livekit.android.room.track
import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import androidx.core.content.ContextCompat
import org.webrtc.MediaConstraints
import org.webrtc.PeerConnectionFactory
import org.webrtc.RtpSender
... ... @@ -27,10 +31,17 @@ class LocalAudioTrack(
companion object {
internal fun createTrack(
context: Context,
factory: PeerConnectionFactory,
audioConstraints: MediaConstraints = MediaConstraints(),
name: String = ""
): LocalAudioTrack {
if (ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO) !=
PackageManager.PERMISSION_GRANTED
) {
throw SecurityException("Record audio permissions are required to create an audio track.")
}
val audioSource = factory.createAudioSource(audioConstraints)
val rtcAudioTrack =
factory.createAudioTrack(UUID.randomUUID().toString(), audioSource)
... ...
package io.livekit.android.room.track
import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import androidx.core.content.ContextCompat
import io.livekit.android.util.LKLog
import org.webrtc.*
import java.util.*
... ... @@ -83,6 +86,7 @@ class LocalVideoTrack(
}
companion object {
internal fun createTrack(
peerConnectionFactory: PeerConnectionFactory,
context: Context,
... ... @@ -90,6 +94,13 @@ class LocalVideoTrack(
options: LocalVideoTrackOptions,
rootEglBase: EglBase,
): LocalVideoTrack {
if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) !=
PackageManager.PERMISSION_GRANTED
) {
throw SecurityException("Camera permissions are required to create a camera video track.")
}
val source = peerConnectionFactory.createVideoSource(options.isScreencast)
val capturer = createVideoCapturer(context, options.position) ?: TODO()
capturer.initialize(
... ...
... ... @@ -52,7 +52,7 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation deps.kotlinx_coroutines
implementation 'androidx.core:core-ktx:1.6.0'
implementation "androidx.core:core-ktx:${versions.androidx_core}"
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation "androidx.compose.ui:ui:$compose_version"
... ...
... ... @@ -5,8 +5,6 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<application
android:allowBackup="true"
... ...
... ... @@ -38,7 +38,7 @@ dependencies {
implementation deps.kotlinx_coroutines
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.core:core-ktx:1.3.2'
implementation "androidx.core:core-ktx:${versions.androidx_core}"
implementation "androidx.activity:activity-ktx:1.2.2"
implementation 'androidx.fragment:fragment-ktx:1.3.2'
implementation 'androidx.preference:preference:1.1.1'
... ...
... ... @@ -4,8 +4,6 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<application
android:name=".SampleApplication"
... ...