Android’de SMS ile Gelen Doğrulama Kodunu Yakalamak: Jetpack Compose ve BroadcastReceiver Kullanımı

Bahadireray
3 min readAug 21, 2024

--

Günümüzde birçok uygulama, kullanıcılarını doğrulamak veya işlemlerini güvence altına almak için SMS ile doğrulama kodu (OTP) gönderiyor. Android uygulamalarında bu kodları otomatik olarak yakalamak ve kullanıcıya göstermek, kullanıcı deneyimini önemli ölçüde iyileştirir.

Bu makalede, Jetpack Compose ile geliştirilmiş bir Android uygulamasında, SMS ile gelen doğrulama kodlarını nasıl yakalayabileceğinizi adım adım öğreneceksiniz. Bunun için BroadcastReceiver kullanarak SMS'leri yakalayacak ve kullanıcıya bir onay penceresi (AlertDialog) ile göstereceğiz.

Adım 1: Proje Kurulumu

SMS mesajlarını yakalayabilmek için, manifest dosyanızda gerekli izinleri eklemelisiniz. RECEIVE_SMS ve READ_SMS izinleri, uygulamanızın SMS almasına ve okumasına izin verir.

<uses-permission android:name=”android.permission.RECEIVE_SMS” />
<uses-permission android:name=”android.permission.READ_SMS” />

Ek olarak, SMS mesajlarını dinleyecek olan BroadcastReceiver sınıfını manifest dosyanıza kaydetmeniz gerekir.

<receiver
android:name=".SMSReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>

Adım 2: BroadcastReceiver ile SMS Mesajlarını Dinlemek

Bir sonraki adımda, gelen SMS mesajlarını yakalamak için BroadcastReceiver sınıfını oluşturuyoruz. Bu sınıf, SMS mesajlarının içeriğini dinler ve belirli bir formata uyan doğrulama kodunu bulur.

SMSReceiver Sınıfını Oluşturun

SMSReceiver sınıfı, gelen SMS mesajlarını alır ve içeriğini inceleyerek doğrulama kodunu çıkarır.

class SMSReceiver(private val context: Context, private val onSmsReceived: (String) -> Unit) : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Log.d("SMSReceiver", "SMS Received")

if (intent?.action == "android.provider.Telephony.SMS_RECEIVED") {
val bundle = intent.extras
val pdus = bundle?.get("pdus") as? Array<*>
if (!pdus.isNullOrEmpty()) {
val messages = pdus.mapNotNull { pdu ->
SmsMessage.createFromPdu(pdu as ByteArray)
}
for (message in messages) {
val messageBody = message.messageBody
if (messageBody.contains("CODE:")) {
val pattern = Pattern.compile("CODE:(\\d+)")
val matcher = pattern.matcher(messageBody)
if (matcher.find()) {
val code = matcher.group(1)
onSmsReceived(code)
}
}
}
}
}
}
}

Bu sınıf, gelen SMS mesajlarını dinler ve içeriğinde “CODE:” ile başlayan bir doğrulama kodu olup olmadığını kontrol eder. Eğer böyle bir kod bulunursa, bu kod onSmsReceived callback fonksiyonuyla çağrılır.

Adım 3: Jetpack Compose ile SMS Alımını Entegre Etmek

SMS mesajlarını alabilmek için öncelikle kullanıcıdan SMS izinlerini istemeniz gerekiyor. rememberLauncherForActivityResult kullanarak bu izni nasıl isteyeceğinizi ve kullanıcının izni kabul ettiğinde veya reddettiğinde nasıl bir aksiyon alacağınızı öğrenelim.

MainScreen Composable Fonksiyonu

@Composable
fun MainScreen() {
var hasPermission by remember { mutableStateOf(false) }
var showConfirmationDialog by remember { mutableStateOf(false) }
var receivedCode by remember { mutableStateOf("") }
val context = LocalContext.current
val requestPermissionLauncher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
hasPermission = isGranted
}

DisposableEffect(Unit) {
val smsReceiver = SMSReceiver(context) { code ->
receivedCode = code
showConfirmationDialog = true
}
val intentFilter = IntentFilter("android.provider.Telephony.SMS_RECEIVED")
context.registerReceiver(smsReceiver, intentFilter)

onDispose {
context.unregisterReceiver(smsReceiver)
}
}
LaunchedEffect(Unit) {
checkAndRequestSmsPermission(context, requestPermissionLauncher) {
hasPermission = it
}
}

if (showConfirmationDialog) {
AlertDialog(
onDismissRequest = { showConfirmationDialog = false },
title = { Text("SMS Doğrulama") },
text = { Text("Kod: $receivedCode'i kullanmak ister misiniz?") },
confirmButton = {
Button(
onClick = {
showConfirmationDialog = false
}
) {
Text("Evet")
}
},
dismissButton = {
Button(
onClick = { showConfirmationDialog = false }
) {
Text("Hayır")
}
}
)
}
}

Bu fonksiyon, SMS izinlerinin alınıp alınmadığını kontrol eder. İzin verildiyse, SMSReceiver SMS mesajlarını dinler ve doğrulama kodu tespit edildiğinde kullanıcıya onay penceresi gösterilir.

İzinleri Kontrol Etme ve İstemek

Kullanıcıdan SMS izni istemek için aşağıdaki fonksiyonu kullanıyoruz:

fun checkAndRequestSmsPermission(
context: android.content.Context,
requestPermissionLauncher: androidx.activity.result.ActivityResultLauncher<String>,
onResult: (Boolean) -> Unit
) {
val isPermissionGranted = ContextCompat.checkSelfPermission(
context,
Manifest.permission.SEND_SMS
) == PackageManager.PERMISSION_GRANTED

if (isPermissionGranted) {
onResult(true)
} else {
requestPermissionLauncher.launch(Manifest.permission.SEND_SMS)
}
}

Bu fonksiyon, uygulamanın SMS izni olup olmadığını kontrol eder ve eğer izin yoksa, kullanıcıdan izin talep eder.

Sonuç

Bu adımlarla, Jetpack Compose kullanarak Android’de gelen SMS mesajlarını dinleyen ve doğrulama kodlarını kullanıcıya gösteren bir uygulama oluşturmuş olduk. SMS mesajları alındığında, uygulama bu mesajları işler ve belirli bir formata uygun olan doğrulama kodunu yakalar.

Bu yöntem, kullanıcı deneyimini iyileştirmek için SMS ile doğrulama yapan uygulamalar geliştiren herkes için harika bir çözümdür.

Bir başka yazımda görüşmek üzere, iyi çalışmalar dilerim.

--

--