Zum Hauptinhalt springen
tsecurity.de LIVE
Echtzeit-Radar & Feeds
Alle RSS Feeds
👥 Community & Social
Sichere ProgrammierungBreeze TTS 2 vs ElevenLabs: Open Source TTS Verdict(23.09.2026 um 05:44 Uhr)
Sichere ProgrammierungAgentic AI vs Generative AI: The 2026 Verdict(23.09.2026 um 05:44 Uhr)
Sichere ProgrammierungI made my agent prove every quote against the source document(23.09.2026 um 05:45 Uhr)
Sichere Programmierung8mb.video Alternative: Skip the Line, Skip the Upsell(23.09.2026 um 05:47 Uhr)
Sichere ProgrammierungBuilding a GTA 6 JSON API for entities and current status(23.09.2026 um 05:52 Uhr)
Sichere ProgrammierungEvery filter needs a documented exception(23.09.2026 um 06:01 Uhr)
Sichere ProgrammierungBreeze TTS 2 vs ElevenLabs: Open Source TTS Verdict(23.09.2026 um 05:44 Uhr)
Sichere ProgrammierungAgentic AI vs Generative AI: The 2026 Verdict(23.09.2026 um 05:44 Uhr)
Sichere ProgrammierungI made my agent prove every quote against the source document(23.09.2026 um 05:45 Uhr)
Sichere Programmierung8mb.video Alternative: Skip the Line, Skip the Upsell(23.09.2026 um 05:47 Uhr)
Sichere ProgrammierungBuilding a GTA 6 JSON API for entities and current status(23.09.2026 um 05:52 Uhr)
Sichere ProgrammierungEvery filter needs a documented exception(23.09.2026 um 06:01 Uhr)
Intelligence View
⚡ tsecurity.de Intelligence

Build a Flashlight in Jetpack Compose

Today we will discuss how to build a flashlight in Jetpack Compose. Step-by-step Guide Setting up dependency Setting up Manifest Code Explanation Code Implementation Setting up dependencies We will be utilising Google's new API for…

0
↗ Quelle (dev.to)
Reagiere als Erste:r — dein Feedback zählt!

Today we will discuss how to build a flashlight in Jetpack Compose.



Step-by-step Guide




  1. Setting up dependency

  2. Setting up Manifest

  3. Code Explanation

  4. Code Implementation



Setting up dependencies

We will be utilising Google's new API for permission requests in our app as it provides a more elegant way of requesting permission in our apps. Since it is a work in progress, there are some known limitations like not being able to check if the user is requesting the app for the first time etc. For more info, check this out



Now, in your build.gradle.kts or build.gradle file add the dependency




 // Dependency to request hardware permission
implementation ("com.google.accompanist:accompanist-permissions:0.32.0")






Setting up Manifest

In your AndroidManifest.xml file, add the code below inside your application tag




 <uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-permission android:name="android.permission.CAMERA" />






Code Explanation




fun toggleFlashLight(cameraManager: CameraManager, cameraId: String, isFlashOn: Boolean) {
try {
cameraManager.setTorchMode(cameraId, isFlashOn)
} catch (e: Exception) {
e.printStackTrace()
}
}

fun handlePermissionDenied(context: Context) {
Toast.makeText(context, "Please grant camera permission", Toast.LENGTH_LONG).show()
}

fun handlePermissionRationale(context: Context) {
Toast.makeText(context, "Camera permission is needed", Toast.LENGTH_LONG).show()
}









@OptIn(ExperimentalPermissionsApi::class)
fun handleLogic(
cameraPermissionState: PermissionState,
context: Context,
cameraManager: CameraManager,
cameraId: String,
isFlashOn: Boolean,
updateState: (Boolean) -> Unit,
) {
if (cameraPermissionState.status.isGranted) {
val newState = !isFlashOn
updateState(newState)
toggleFlashLight(cameraManager, cameraId, newState)
} else if (cameraPermissionState.status.shouldShowRationale) {
handlePermissionRationale(context)
cameraPermissionState.launchPermissionRequest()
} else {
handlePermissionDenied(context)
cameraPermissionState.launchPermissionRequest()
}
}






Code Implementation




import android.Manifest
import android.content.Context
import android.hardware.camera2.CameraManager
import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonColors
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.kotlin_articles.ui.theme.KotlinarticlesTheme
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.PermissionState
import com.google.accompanist.permissions.isGranted
import com.google.accompanist.permissions.rememberPermissionState
import com.google.accompanist.permissions.shouldShowRationale


class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
KotlinarticlesTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Greeting(
modifier = Modifier.padding(innerPadding)
)
}
}
}
}
}

@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun Greeting(modifier: Modifier = Modifier) {
val context: Context = LocalContext.current
val cameraPermissionState = rememberPermissionState(permission = Manifest.permission.CAMERA)
var isFlashOn: Boolean by rememberSaveable {
mutableStateOf(false)
}
val cameraManager: CameraManager = remember {
context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
}
val cameraId: String = rememberSaveable {
try {
cameraManager.cameraIdList[0]
} catch (e: Exception) {
"0"
}
}

Column(
modifier = Modifier
.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
) {
Button(
modifier = Modifier.height(50.dp),
onClick = {
handleLogic(
cameraPermissionState,
context,
cameraManager,
cameraId,
isFlashOn
) { isFlashOn = it }
},
) {
Text(
text = "Turn flashlight ${if (isFlashOn) "Off" else "On"} !",
fontSize = 16.sp,
textAlign = TextAlign.Center
)
}
}
}

fun toggleFlashLight(cameraManager: CameraManager, cameraId: String, isFlashOn: Boolean) {
try {
cameraManager.setTorchMode(cameraId, isFlashOn)
} catch (e: Exception) {
e.printStackTrace()
}
}

fun handlePermissionDenied(context: Context) {
Toast.makeText(context, "Please grant camera permission", Toast.LENGTH_LONG).show()
}

fun handlePermissionRationale(context: Context) {
Toast.makeText(context, "Camera permission is needed", Toast.LENGTH_LONG).show()
}

@OptIn(ExperimentalPermissionsApi::class)
fun handleLogic(
cameraPermissionState: PermissionState,
context: Context,
cameraManager: CameraManager,
cameraId: String,
isFlashOn: Boolean,
updateState: (Boolean) -> Unit,
) {
if (cameraPermissionState.status.isGranted) {
val newState = !isFlashOn
updateState(newState)
toggleFlashLight(cameraManager, cameraId, newState)
} else if (cameraPermissionState.status.shouldShowRationale) {
handlePermissionRationale(context)
cameraPermissionState.launchPermissionRequest()
} else {
handlePermissionDenied(context)
cameraPermissionState.launchPermissionRequest()
}
}







Happy coding!!!



You can check out the repo

Ähnliche Beiträge
🔍 Verwandte News

Auch interessante Nachrichten Build a Flashlight in Jetpack Compose

Thematisch verwandte Begriffe: Build, Flashlight, Jetpack, Compose · 6 Treffer

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Zum Aktualisieren ziehen
ZERO-DAY CVE-2026-18163 | IBM Financial Transaction Manager (FTM) for RedHat OpenShift could allow…
Advisory →
TTS Reader • tsecurity.de Voice
tsecurity.de Icon
tsecurity.de App
Offline-Lesen, Eilmeldungen & 0ms Ladezeit

Installiere tsecurity.de direkt auf deinen Home-Bildschirm für das ultimative Vollbild-Magazinerlebnis ohne Browser-Leisten.

Nächster Beitrag
Themen-Radar & Intelligence Matrix
Echtzeit-Taxonomie nach Angriffsvektoren & Plattformen

tsecurity.de Live Threat Radar

🔴 LIVE RADAR
MONITORING
AKTIV
CVE-DATENBANK
LIVE
🔍
Community Radar & Live Chat
Sentinel Bot online • Live-Stream
Dein Cluster: Security Explorer
Match:
lädt…
Verbindung zum Community-Stream wird aufgebaut...
Bearbeitungsmodus — Senden überschreibt deine Nachricht
Community-Puls — was gerade passiert
lädt…
Aktivitäten deiner Analysten
lädt…
Neues Thema oder Eilmeldung einreichen

Reiche interessante Links, Zero-Days oder Debatten ein. Die Community entscheidet per Upvote über die Veröffentlichung.

Heiß diskutierte Einreichungen
🔖 Gespeicherte Artikel
📂 Keine gespeicherten Artikel vorhanden.
Zurück Ziehen Vor
Links: vorheriger Artikel Rechts: nächster Artikel unten: schließen
News NIS-2 Frühwarnung Tier-1 Intel ⏱️ 3 Min vor 10 Min
Artikeldaten werden geladen...

Zurück: vorheriger Vor: nächster
↗ Original-Quelle
Social Reaktionen Deine Reaktion zählt
Einstufung & Relevanz-Poll 0 Stimmen
In sozialen Netzwerken teilen 1-Klick