एंड्रॉइड में Camera2 API के साथ फ्लैशलाइट नियंत्रण
यह उदाहरण दर्शाता है कि आधुनिक Camera2 API का उपयोग करके डिवाइस के कैमरा फ्लैश (टॉर्च) को प्रोग्रामेटिकली कैसे चालू/बंद किया जाए।
चरण 1: नया प्रोजेक्ट बनाएं
एंड्रॉइड स्टूडियो में File → New Project चुनें।
चरण 2: लेआउट (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:text="Tutorials Point"
android:textAlignment="center"
android:textColor="@android:color/holo_green_dark"
android:textSize="32sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/imageViewFlashlight"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_centerInParent="true"
android:src="@android:drawable/btn_star"
android:contentDescription="फ्लैशलाइट आइकन"
tools:src="@android:drawable/btn_star" />
<ToggleButton
android:id="@+id/toggleFlashlight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/imageViewFlashlight"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:textOff="फ्लैशलाइट चालू करें"
android:textOn="फ्लैशलाइट बंद करें"
android:checked="false" />
<TextView
android:id="@+id/textViewStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/toggleFlashlight"
android:layout_centerHorizontal="true"
android:layout_marginTop="16dp"
android:text="स्थिति: अज्ञात"
android:textSize="16sp" />
</RelativeLayout>
चरण 3: MainActivity.kt
import android.content.Context
import android.content.pm.PackageManager
import android.hardware.camera2.CameraAccessException
import android.hardware.camera2.CameraManager
import android.os.Build
import android.os.Bundle
import android.widget.CompoundButton
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import android.widget.ToggleButton
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
class MainActivity : AppCompatActivity() {
private lateinit var cameraManager: CameraManager
private var cameraId: String = ""
private lateinit var toggleButton: ToggleButton
private lateinit var imageView: ImageView
private lateinit var textViewStatus: TextView
private var isFlashOn = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
// UI तत्व
toggleButton = findViewById(R.id.toggleFlashlight)
imageView = findViewById(R.id.imageViewFlashlight)
textViewStatus = findViewById(R.id.textViewStatus)
// फ्लैश उपलब्धता जांचें
val hasFlash = packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)
val hasCamera = packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)
if (!hasFlash || !hasCamera) {
showNoFlashError()
return
}
// CameraManager प्राप्त करें
cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager
// पहला कैमरा ID प्राप्त करें (आमतौर पर बैक कैमरा)
try {
cameraId = cameraManager.cameraIdList.firstOrNull() ?: ""
if (cameraId.isEmpty()) {
showNoFlashError()
return
}
} catch (e: CameraAccessException) {
e.printStackTrace()
showNoFlashError()
return
}
// टॉगल बटन लिस्टनर
toggleButton.setOnCheckedChangeListener { _, isChecked ->
toggleFlashlight(isChecked)
}
// प्रारंभिक स्थिति अपडेट
updateUI(false)
}
private fun toggleFlashlight(turnOn: Boolean) {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Android 6.0+ (API 23) - setTorchMode का उपयोग करें
cameraManager.setTorchMode(cameraId, turnOn)
isFlashOn = turnOn
updateUI(turnOn)
} else {
// पुराने API के लिए फॉलबैक (कम विश्वसनीय)
Toast.makeText(this, "इस संस्करण पर फ्लैशलाइट समर्थित नहीं", Toast.LENGTH_SHORT).show()
toggleButton.isChecked = false
}
} catch (e: CameraAccessException) {
e.printStackTrace()
Toast.makeText(this, "फ्लैशलाइट त्रुटि: ${e.message}", Toast.LENGTH_SHORT).show()
toggleButton.isChecked = false
updateUI(false)
} catch (e: Exception) {
e.printStackTrace()
Toast.makeText(this, "अप्रत्याशित त्रुटि: ${e.message}", Toast.LENGTH_SHORT).show()
toggleButton.isChecked = false
updateUI(false)
}
}
private fun updateUI(isOn: Boolean) {
isFlashOn = isOn
val statusText = if (isOn) "चालू" else "बंद"
val iconRes = if (isOn) android.R.drawable.btn_star_big_on else android.R.drawable.btn_star_big_off
textViewStatus.text = "स्थिति: $statusText"
imageView.setImageResource(iconRes)
}
private fun showNoFlashError() {
AlertDialog.Builder(this)
.setTitle("फ्लैश उपलब्ध नहीं")
.setMessage("इस डिवाइस में कैमरा फ्लैश नहीं है।")
.setPositiveButton("OK") { _, _ -> finish() }
.setCancelable(false)
.show()
toggleButton.isEnabled = false
toggleButton.alpha = 0.5f
}
override fun onStop() {
super.onStop()
// ऐप बैकग्राउंड में जाने पर फ्लैशलाइट बंद करें
if (isFlashOn) {
try {
cameraManager.setTorchMode(cameraId, false)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
}
चरण 4: AndroidManifest.xml (अनुमतियां और फीचर)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.flashlight">
<!-- कैमरा अनुमति (फ्लैशलाइट के लिए आवश्यक) -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- फ्लैश फीचर घोषित करें (Play Store फ़िल्टरिंग के लिए) -->
<uses-feature
android:name="android.hardware.camera.flash"
android:required="false" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
रनटाइम अनुमति अनुरोध (Android 6.0+):
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.result.ActivityResultLauncher
class MainActivity : AppCompatActivity() {
// आधुनिक अनुमति अनुरोध API
private val requestCameraPermission = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { granted ->
if (granted) {
initializeCamera()
} else {
showPermissionDeniedDialog()
}
}
private fun checkAndRequestPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
requestCameraPermission.launch(Manifest.permission.CAMERA)
} else {
initializeCamera()
}
}
private fun showPermissionDeniedDialog() {
AlertDialog.Builder(this)
.setTitle("अनुमति आवश्यक")
.setMessage("फ्लैशलाइट के लिए कैमरा अनुमति आवश्यक है। सेटिंग्स से अनुमति दें।")
.setPositiveButton("सेटिंग्स खोलें") { _, _ ->
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = Uri.fromParts("package", packageName, null)
}
startActivity(intent)
}
.setNegativeButton("रद्द") { _, _ -> finish() }
.show()
}
}
महत्वपूर्ण नोट्स:
- FEATURE_CAMERA_FLASH: `FEATURE_CAMERA_FRONT` नहीं - मूल कोड में बग था
- setTorchMode: API 23+ के लिए उपलब्ध, सीधे टॉर्च मोड नियंत्रित करता है
- onStop में बंद करें: ऐप बैकग्राउंड में जाने पर फ्लैशलाइट बंद करें
- रियल डिवाइस पर टेस्ट करें: एमुलेटर में फ्लैशलाइट काम नहीं करता
- कैमरा ID: `cameraIdList[0]` आमतौर पर बैक कैमरा होता है जिसमें फ्लैश होता है
सामान्य समस्याएं:
| समस्या | समाधान |
|---|---|
| फ्लैशलाइट चालू नहीं होती | कैमरा अनुमति जांचें, रियल डिवाइस पर टेस्ट करें |
| अन्य ऐप द्वारा उपयोग में | `CameraAccessException` पकड़ें, उपयोगकर्ता को सूचित करें |
| बैकग्राउंड में बंद हो जाती है | `onStop()` में बंद करना सामान्य व्यवहार है |
| UI फ्रीज | कैमरा ऑपरेशन मुख्य थ्रेड पर ब्लॉक कर सकते हैं |