David Liu

request permissions needed for audio/video capture

@@ -40,6 +40,7 @@ dependencies { @@ -40,6 +40,7 @@ dependencies {
40 implementation 'androidx.appcompat:appcompat:1.2.0' 40 implementation 'androidx.appcompat:appcompat:1.2.0'
41 implementation 'androidx.core:core-ktx:1.3.2' 41 implementation 'androidx.core:core-ktx:1.3.2'
42 implementation "androidx.activity:activity-ktx:1.2.1" 42 implementation "androidx.activity:activity-ktx:1.2.1"
  43 + implementation 'androidx.fragment:fragment-ktx:1.3.1'
43 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.0' 44 implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.0'
44 implementation "androidx.viewpager2:viewpager2:1.0.0" 45 implementation "androidx.viewpager2:viewpager2:1.0.0"
45 implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:${versions.androidx_lifecycle}" 46 implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:${versions.androidx_lifecycle}"
@@ -4,6 +4,8 @@ @@ -4,6 +4,8 @@
4 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 4 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
5 <uses-permission android:name="android.permission.INTERNET" /> 5 <uses-permission android:name="android.permission.INTERNET" />
6 <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 6 <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
  7 + <uses-permission android:name="android.permission.RECORD_AUDIO" />
  8 + <uses-permission android:name="android.permission.CAMERA" />
7 9
8 <application 10 <application
9 android:name=".SampleApplication" 11 android:name=".SampleApplication"
1 package io.livekit.android.sample 1 package io.livekit.android.sample
2 2
  3 +import android.Manifest
3 import android.content.Intent 4 import android.content.Intent
  5 +import android.content.pm.PackageManager
4 import android.os.Bundle 6 import android.os.Bundle
5 import android.text.SpannableStringBuilder 7 import android.text.SpannableStringBuilder
  8 +import android.widget.Toast
  9 +import androidx.activity.result.contract.ActivityResultContracts
6 import androidx.appcompat.app.AppCompatActivity 10 import androidx.appcompat.app.AppCompatActivity
  11 +import androidx.core.content.ContextCompat
7 import io.livekit.android.sample.databinding.MainActivityBinding 12 import io.livekit.android.sample.databinding.MainActivityBinding
8 13
  14 +
9 class MainActivity : AppCompatActivity() { 15 class MainActivity : AppCompatActivity() {
10 override fun onCreate(savedInstanceState: Bundle?) { 16 override fun onCreate(savedInstanceState: Bundle?) {
11 super.onCreate(savedInstanceState) 17 super.onCreate(savedInstanceState)
@@ -30,6 +36,38 @@ class MainActivity : AppCompatActivity() { @@ -30,6 +36,38 @@ class MainActivity : AppCompatActivity() {
30 } 36 }
31 37
32 setContentView(binding.root) 38 setContentView(binding.root)
  39 +
  40 + requestPermissions()
  41 +
  42 + }
  43 +
  44 + private fun requestPermissions() {
  45 + val requestPermissionLauncher =
  46 + registerForActivityResult(
  47 + ActivityResultContracts.RequestMultiplePermissions()
  48 + ) { grants ->
  49 + for (grant in grants.entries) {
  50 + if (!grant.value) {
  51 + Toast.makeText(
  52 + this,
  53 + "Missing permission: ${grant.key}",
  54 + Toast.LENGTH_SHORT
  55 + )
  56 + .show()
  57 + }
  58 + }
  59 + }
  60 + val neededPermissions = listOf(Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA)
  61 + .filter {
  62 + ContextCompat.checkSelfPermission(
  63 + this,
  64 + it
  65 + ) == PackageManager.PERMISSION_DENIED
  66 + }
  67 + .toTypedArray()
  68 + if (neededPermissions.isNotEmpty()) {
  69 + requestPermissionLauncher.launch(neededPermissions)
  70 + }
33 } 71 }
34 72
35 companion object { 73 companion object {