2026/04/19

오늘의 이야기

개발자들을 위한 퍼플렉시티 AI 활용법: 효율적인 검색과 정보 요약


ai가 그린 이미지




• 퍼플렉시티 AI는 출처가 명확한 요약된 답변을 제공하는 AI 기반 검색 엔진으로, 기존 검색 엔진의 한계를 극복하고 개발자들에게 유용한 정보를 신속하게 제공합니다.

• 실시간 웹 검색 기능을 통해 최신 기술 트렌드를 파악하고, 다양한 AI 모델(OpenAI GPT-4, Anthropic Claude 등)을 지원하여 다양한 질문에 정확한 답변을 제공합니다.

• 검색 결과의 신뢰성을 높이기 위해 모든 답변에 출처를 명시하고, 웹, 학술, 소셜 모드 등 검색 범위를 선택할 수 있는 옵션을 제공하여 사용자에게 정보의 투명성을 보장합니다.

• 최근 도입된 딥 리서치 기능은 AI가 문서를 분석하여 핵심 내용을 종합한 보고서를 생성하며,  'Humanity’s Last Exam' 벤치마크에서 높은 정확도를 기록하여 주목받고 있습니다. (현재 무료 제공, 향후 Pro 구독자에게 무제한 제공 예정)

• 검색어를 구체적으로 입력하는 것이 중요하며, 검색 대상과 범위를 명확히 설정하고, 원하는 결과물의 형태를 지정하고, 배경과 상황을 추가하여 더욱 정확한 답변을 얻을 수 있습니다.  (/site:, /filetype:, /after:, /before: 명령어 활용법 등이 제시됨)

• 퍼플렉시티 AI는 후속 질문 기능을 제공하여 심층적인 정보 분석을 가능하게 하지만, 모든 출처의 신뢰도를 보장할 수 없으므로, 결과 확인 및 출처 검증이 필요하며, 무료 버전의 기능 제한 또한 고려해야 합니다.

• 퍼플렉시티 AI는 챗GPT와 달리 대화형 인터페이스가 아닌 검색 및 요약에 초점을 맞춘 도구이므로, 복잡한 질문이나 연속적인 분석에는 추가 검색이 필요할 수 있습니다.

https://yozm.wishket.com/magazine/detail/3001/

개발자들이 사랑하는 ‘퍼플렉시티 AI’ 잘 쓰는 법 | 요즘IT

최근 기술 변화의 속도는 그야말로 광속이다. 새로운 라이브러리, 프레임워크, 베스트 프랙티스가 하루가 다르게 등장하는 이 시대에, 더 이상 오래된 블로그 글이나 부정확한 답변을 뒤적일 시

yozm.wishket.com





오늘의 이야기


#스하리1000명프로젝트

오늘 내가 만든앱 하나 알려주고 싶어, 이 앱은 알림수집기 라고 이름을 붙였는 데,
내 폰에 표시 되는 알림을 읽어서 내가 지정한 단어가 들어 있고, 지출기록을 남겨야 하는 알림이
있으면 수집하고, 카카오톡으로 친구에게 전달해 주는 기능을 구현해 줄꺼야. 📲

이번 패치에서는 하루 한번 지정한 시간에 나에게 알림(노티) 하도록 기능을 추가 했어. 🙏
한번 써보고 불편한 거 있으면 말해줘.

앱 바로가기
👉 https://play.google.com/store/apps/details?id=com.nari.notify2kakao





오늘의 이야기


#스하리1000명프로젝트

오늘 내가 만든앱 하나 알려주고 싶어, 이 앱은 알림수집기 라고 이름을 붙였는 데,
내 폰에 표시 되는 알림을 읽어서 내가 지정한 단어가 들어 있고, 지출기록을 남겨야 하는 알림이
있으면 수집하고, 카카오톡으로 친구에게 전달해 주는 기능을 구현해 줄꺼야. 📲

이번 패치에서는 하루 한번 지정한 시간에 나에게 알림(노티) 하도록 기능을 추가 했어. 🙏
한번 써보고 불편한 거 있으면 말해줘.

앱 바로가기
👉 https://play.google.com/store/apps/details?id=com.nari.notify2kakao





오늘의 이야기

**디젤 차량의 DPF 재생 방법과 유지 관리 팁**


경고등 이미지




**DPF란 무엇인가요?**
디젤 차량에는 DPF(Diesel Particulate Filter)라는 매연 필터가 장착되어 있습니다. 이 필터는 디젤 엔진에서 나오는 미세 입자를 걸러내어 배출가스를 줄이는 역할을 합니다. 그러나 DPF가 지속적으로 입자를 모으다 보면 점점 막혀서 성능이 떨어지기 때문에 주기적으로 재생(클리닝)해야 합니다.

**DPF 재생이란?**
DPF 재생은 높은 온도로 필터 내부의 입자를 태워서 제거하는 과정을 말합니다. 차량이 고속 주행과 같은 특정 조건을 만족할 때 엔진이 충분한 열을 발생시키며 재생이 이루어집니다. 일반적으로 **고속도로에서 60km 이상 주행**하거나, **자동변속기 2단 이상에서 엔진 회전수를 1,500 ~ 2,000rpm으로 25분 이상 주행**하면 재생이 이루어집니다.

**DPF 재생 주기**
DPF 재생 주기는 차량의 주행 조건과 운전 습관에 따라 달라질 수 있습니다. 일반적으로 **200~500km** 주행 후에 재생이 이루어집니다. 고속도로 주행과 같은 일정한 속도로 주행할 때 재생 주기가 길어질 수 있으며, 시내 주행과 같이 자주 멈추고 서는 경우 재생 주기가 짧아질 수 있습니다.

**DPF 성능을 유지하는 방법**
1. **고속 주행**: 주기적으로 고속도로에서 60km 이상 주행을 하면 DPF가 효율적으로 재생될 수 있습니다.
2. **고급 연료 사용**: 저품질 연료는 더 많은 재를 발생시킬 수 있으므로, 고급 연료를 사용하는 것이 좋습니다.
3. **정기적인 차량 점검**: 주기적으로 차량을 점검하고 DPF 상태를 확인하면 성능 저하를 예방할 수 있습니다.
4. **엔진 오일 교환**: 오염된 엔진 오일이 DPF에 영향을 미칠 수 있으므로, 적절한 주기마다 엔진 오일을 교환하는 것이 중요합니다.
5. **적절한 운전 습관**: 급가속과 급제동을 피하고, 일정한 속도로 주행하는 습관을 가지면 DPF의 성능을 유지하는 데 도움이 됩니다.

이렇게 DPF 재생을 통해 차량의 성능을 유지하고 배출가스를 줄일 수 있습니다. 정기적으로 점검하고, 적절한 주행 조건을 유지하여 DPF의 성능을 향상시켜 보세요!





오늘의 이야기

AI 기반 Figma 워크플로우 자동화 시스템 구축

dpf




• 본 시스템은 Figma 파일의 다수 댓글을 일일이 확인하는 데 드는 시간을 절약하기 위해, Make.com과 Google Gemini AI를 활용하여 Figma 댓글을 자동으로 분류하고 Google Docs에 구조화된 요약본을 생성하는 자동화 시스템을 구축하였습니다.

• 구체적으로, Make.com을 통해 Figma의 댓글을 가져와 불필요한 정보를 제거한 후, Google Gemini AI의 'Gemini 1.0 Pro' 모델을 이용하여 댓글을 최대 4개의 카테고리로 분류하고 각 카테고리별 요약 및 댓글 예시를 포함하는 요약 문서를 15초 이내에 생성합니다.

• 자동화된 요약 보고서는 설정된 시간 간격에 따라 자동 생성되며, Google Docs에 저장 후 Slack 알림을 통해 팀원들과 공유되어 협업 효율을 높입니다.  다만, AI의 응답 정확도를 고려하여 생성된 요약본은 검토가 필요하며, 댓글이 많은 파일에는 자동화 실행 주기를 설정하여 최신 정보를 유지하는 것이 좋습니다.

https://news.hada.io/topic?id=19432

AI로 Figma 워크플로우 자동화하기  | GeekNews

문제점 : 다양한 팀 구성원들이 Figma 파일에 남긴 수많은 댓글을 일일이 확인하고 분류하여 유용한 인사이트로 요약하는 데 많은 시간이 소요됨해결책 : AI를 활용하여 Figma 댓글을 자동으로 분류

news.hada.io





오늘의 이야기

피카 AI: 특징과 업데이트에 대한 종합적인 개요


길거리 표지판





• 피카 AI는 밈부터 영화적 걸작에 이르기까지 다양한 비디오 콘텐츠를 만들기 위해 설계된 무료 AI 비디오 생성기 플랫폼으로, 매끄럽고 직관적인 사용자 경험을 제공합니다.

• 최근 업데이트로는 성능과 효율성, 기능이 강화된 피카 2.1과 동영상 생성 속도를 3배 높이는 동시에 신용 사용량을 7배 줄이고 고품질 출력을 유지하는 터보 모델이 있다.

• 피카 2.0은 장면 재료를 도입해 캐릭터, 객체, 설정의 이미지를 업로드해 동영상을 개인화할 수 있으며, 정밀하고 유동적인 서사 생성을 위해 타의 추종을 불허하는 텍스트 정렬을 할 수 있다.

• 피카 1.5는 애니메이션에서 사실감을 높이고 피카펙트를 도입해 포케 잇, 필 잇, 찢어 잇, 레비테이트 잇, 디퍼테이테이션 잇, 아이팝 잇, 짜잔 잇, 디플레이트, 크럼블, 디졸브 등 창의적인 효과를 제공해 역동적인 시각적 요소를 더했다.

• 피카 1.5는 빅 스크린 샷도 특징으로, 불렛 타임, 버티고, 돌리 레프트, 크레인 다운 등 전문가 수준의 영화 카메라 컨트롤을 제공해 영상 제작 품질을 높였다.

• 피카 1.5의 새로운 움직임은 부드럽고 사실적인 캐릭터 움직임을 만들 수 있게 하여 장면에 유동성과 사실성을 더하는 반면, 개선된 사실성은 애니메이션 전반에 걸쳐 핵심 초점이다.

• 피카는 피카 2.0에서 다양한 비디오 템플릿을 제공하여 비디오 생성을 단순화하고 피카디션은 실제 영상과 상상력 요소를 혼합하여 사용자가 새로운 사용자를 위해 15개의 무료 세대가 있는 모든 비디오에 무엇이든 삽입할 수 있습니다.

https://pikartai.com/



 


Pika AI - Free AI Video Generator


 


pikartai.com




 





오늘의 이야기

Jetpack Compose를 사용하여 채팅 앱에 음성 입력 기능 추가하기


음성듣기 사용예제



 


안녕하세요, 여러분! 오늘은 Jetpack Compose를 사용하여 안드로이드 채팅 앱에 음성 입력 기능을 추가하는 방법에 대해 알아보겠습니다. 음성 입력 기능은 사용자가 텍스트를 입력하는 대신 음성을 통해 메시지를 입력할 수 있도록 도와줍니다.


1. 프로젝트 설정


우선, 프로젝트의 build.gradle 파일에 필요한 의존성을 추가합니다:



Gradle


dependencies {
implementation "androidx.core:core-ktx:1.7.0"
implementation "androidx.compose.ui:ui:1.0.5"
implementation "androidx.compose.material:material:1.0.5"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0"
implementation "androidx.activity:activity-compose:1.4.0"
}





2. 음성 입력 컴포넌트 구현


이제 SpeechRecognizer를 사용하여 음성 입력을 처리하고, 이를 Jetpack Compose UI와 연동해보겠습니다.





Kotlin
 



import android.Manifest
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.speech.RecognizerIntent
import android.speech.SpeechRecognizer
import androidx.activity.ComponentActivity
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.core.app.ActivityCompat
import com.example.myapplication.ui.theme.MyApplicationTheme
import java.util.*

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyApplicationTheme {
Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background) {
ChatScreen()
}
}
}
}
}

@Composable
fun ChatScreen() {
var message by remember { mutableStateOf("") }
val context = LocalContext.current as Activity

// Request microphone permission
val requestPermissionLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.RequestPermission(),
onResult = { isGranted: Boolean ->
if (isGranted) {
// Permission granted
} else {
// Permission denied
}
}
)

LaunchedEffect(Unit) {
requestPermissionLauncher.launch(Manifest.permission.RECORD_AUDIO)
}

val speechRecognizer = remember { SpeechRecognizer.createSpeechRecognizer(context) }
val recognizerIntent = remember {
Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault())
}
}

val speechResultLauncher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val matches = result.data?.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS)
matches?.let {
message = it[0]
}
}
}

Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
TextField(
value = message,
onValueChange = { message = it },
modifier = Modifier.fillMaxWidth(),
placeholder = { Text("Enter your message") }
)
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = {
speechResultLauncher.launch(recognizerIntent)
}) {
Text("Start Voice Input")
}
}
}





3. 매니페스트 파일 수정


음성 입력을 사용하려면 매니페스트 파일에 RECORD_AUDIO 권한을 추가해야 합니다:





XML
 





<uses-permission android:name="android.permission.RECORD_AUDIO"/>

결론


이제 Jetpack Compose를 사용하여 채팅 앱에 음성 입력 기능을 성공적으로 추가할 수 있습니다. 음성 인식을 통해 더 편리한 채팅 경험을 제공할 수 있게 되었습니다. 필요에 따라 음성 인식 결과를 처리하는 추가적인 로직을 구현하여 사용자의 음성 입력을 더 정교하게 처리할 수 있습니다.





오늘의 이야기



#스치니1000프로젝트 #재미 #행운기원 #Compose #Firebase

🎯 야 너 토요일마다 로또 확인하냐?
나도 맨날 “혹시나~” 하면서 봤거든 ㅋㅋ

근데 이제는 그냥 안 해
AI한테 맡겼어 🤖✨

그것도 구글 Gemini로다가!

그래서 앱 하나 만들었지
👉 “로또 예상번호 by Gemini” 🎱

AI가 분석해서 번호 딱! 뽑아줌
그냥 보고 참고만 하면 됨

재미로 해도 좋고…
혹시 모르는 거잖아? 😏


https://play.google.com/store/apps/details?id=com.billcorea.gptlotto1127




오늘의 이야기


#스하리1000명프로젝트,
In Korea verloren? Selbst wenn Sie kein Koreanisch sprechen, hilft Ihnen diese App dabei, sich problemlos fortzubewegen.
Sprechen Sie einfach Ihre Sprache – es übersetzt, sucht und zeigt Ergebnisse in Ihrer Sprache an.
Ideal für Reisende! Unterstützt mehr als 10 Sprachen, darunter Englisch, Japanisch, Chinesisch, Vietnamesisch und mehr.
Probieren Sie es jetzt aus!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/04/18

오늘의 이야기


#billcorea #운동동아리관리앱
🏸スチーニーたち、バドミントン同好会必須アプリ登場!
👉マッチプレイ - スコア記録&試合相手を探す🎉
一人で、友達、同好会どこでもぴったりです! 🤝
バドミントン好きならぜひ使ってみてください

アプリショートカット👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay




오늘의 이야기

MS 코파일럿, 월 200달러 챗GPT 고급 AI 기능 무료 제공





• 마이크로소프트(MS)가 자사의 코파일럿에 오픈AI의 고급 AI 모델인 o1을 활용한 '씽크 디퍼' 기능을 무료로 제공한다고 발표했습니다. 기존에 챗GPT 프로에서 월 200달러에 제공되던 o1 모델을 코파일럿 사용자라면 누구나 무료로 이용할 수 있게 함으로써, 고성능 AI 접근성을 대폭 높였습니다.

• 씽크 디퍼는 몇 초간 분석 및 검색을 거쳐 심층적인 답변을 제공하며, 기후 변화 분석, 역사적 사건 해석, 프로그래밍 코드 작성 등 복잡한 작업에도 강점을 보입니다.  이는 단순하고 짧은 답변에 집중했던 기존 코파일럿과는 다른 접근 방식이며, 2023년 10월까지의 데이터를 기반으로 동작합니다.

• 현재 MS는 씽크 디퍼의 유료화 계획을 밝히지 않았으나,  오픈AI가 더욱 발전된 o3 모델을 출시한 점을 고려할 때, AI 업계의 빠른 기술 발전 속도와 향후 서비스 정책 변화 가능성을 주목해야 합니다.

https://www.cio.com/article/3813934/ms-%EC%9B%94-200%EB%8B%AC%EB%9F%AC-%EC%B1%97gpt-%EA%B3%A0%EA%B8%89-ai-%EA%B8%B0%EB%8A%A5-%EC%9C%88%EB%8F%84%EC%9A%B0-%EC%82%AC%EC%9A%A9%EC%9E%90%EC%97%90-%EB%AC%B4%EB%A3%8C-%EC%A0%9C.html?amp=1

MS “월 200달러 챗GPT 고급 AI 기능, 윈도우 사용자에 무료 제공”

MS가 코파일럿의 새로운 ‘씽크 디퍼(Think Deeper)’ 기능을 통해 오픈AI의 o1 모델을 무료로 제공한다.

www.cio.com





오늘의 이야기


 




jQuery 배열 복사 방법


행운이 함께 하길 기원 드려요



  1. slice() 메서드 사용:


  2. javascript



    var originalArray = [1, 2, 3, 4];
    var copiedArray = originalArray.slice();




  3. concat() 메서드 사용:


  4. javascript



    var originalArray = [1, 2, 3, 4];
    var copiedArray = [].concat(originalArray);




  5. Array.from() 메서드 사용:


  6. javascript



    var originalArray = [1, 2, 3, 4];
    var copiedArray = Array.from(originalArray);




  7. 스프레드 연산자 사용 (ES6):


  8. javascript



    var originalArray = [1, 2, 3, 4];
    var copiedArray = [...originalArray];





jQuery를 사용한 배열 요소 이름과 갯수 확인



javascript



var originalArray = ['apple', 'banana', 'cherry', 'date'];

// 요소 이름 출력
originalArray.forEach(function(element) {
console.log(element);
});

// 요소 갯수 출력
console.log('Array length:', originalArray.length);




jQuery를 사용한 객체 배열의 이름과 값 확인



javascript



var originalArray = [
{ name: 'apple', color: 'red' },
{ name: 'banana', color: 'yellow' },
{ name: 'cherry', color: 'red' },
{ name: 'date', color: 'brown' }
];

// 객체 배열의 이름과 값 출력
originalArray.forEach(function(element) {
console.log('Name: ' + element.name + ', Color: ' + element.color);
});




객체 배열의 속성 이름을 모를 때



javascript



var originalArray = [
{ name: 'apple', color: 'red' },
{ name: 'banana', color: 'yellow' },
{ name: 'cherry', color: 'red' },
{ name: 'date', color: 'brown' }
];

// 모든 키와 값 출력
originalArray.forEach(function(element) {
Object.keys(element).forEach(function(key) {
console.log(key + ': ' + element[key]);
});
console.log('---'); // 각 객체 사이에 구분선 추가
});









오늘의 이야기

안녕하세요! 오늘은 Jetpack Compose와 com.afollestad.material-dialogs 라이브러리를 사용하여 비밀번호 입력 다이얼로그를 구현하는 방법에 대해 알아보겠습니다. Jetpack Compose는 최신 Android UI 툴킷으로, 선언형 프로그래밍 모델을 사용하여 UI를 효율적으로 구축할 수 있습니다. com.afollestad.material-dialogs는 다양한 유형의 다이얼로그를 쉽게 만들 수 있게 해주는 라이브러리입니다.


 


비밀번호 입력



 


사전 준비


먼저, 프로젝트의 build.gradle 파일에 다음 의존성을 추가해야 합니다.


 

dependencies {
implementation "com.afollestad.material-dialogs:core:3.3.0"
implementation "com.afollestad.material-dialogs:input:3.3.0"
}

위의 의존성을 추가한 후, Gradle을 동기화(Sync)합니다.


비밀번호 입력 다이얼로그 구현


이제 Jetpack Compose에서 com.afollestad.material-dialogs 라이브러리를 사용하여 비밀번호 입력 다이얼로그를 구현하는 방법을 단계별로 살펴보겠습니다.


1. MainActivity 설정


먼저 MainActivity를 설정합니다. Jetpack Compose의 setContent를 사용하여 UI를 설정합니다.


 

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import com.example.myapp.ui.theme.MyAppTheme

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyAppTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
PasswordDialogExample()
}
}
}
}
}

2. PasswordDialogExample 컴포저블


PasswordDialogExample 컴포저블은 버튼을 클릭할 때 비밀번호 입력 다이얼로그를 표시합니다. 다이얼로그가 닫히면 입력된 비밀번호를 표시합니다.


 

@Composable
fun PasswordDialogExample() {
var showDialog by remember { mutableStateOf(false) }
var password by remember { mutableStateOf("") }

if (showDialog) {
PasswordInputDialog(
onDismiss = { showDialog = false },
onPasswordEntered = { enteredPassword ->
password = enteredPassword
showDialog = false
}
)
}

Button(onClick = { showDialog = true }) {
Text("Show Password Dialog")
}

if (password.isNotEmpty()) {
Text("Entered Password: $password")
}
}

3. PasswordInputDialog 컴포저블


PasswordInputDialog 컴포저블은 Material Dialogs를 사용하여 비밀번호 입력 다이얼로그를 생성합니다. 비밀번호 입력이 완료되면 onPasswordEntered 콜백을 호출하고, 다이얼로그가 닫힙니다.


 

@Composable
fun PasswordInputDialog(
onDismiss: () -> Unit,
onPasswordEntered: (String) -> Unit
) {
val context = LocalContext.current
LaunchedEffect(Unit) {
MaterialDialog(context).show {
title(text = "Enter Password")
input(
hint = "Password",
inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
) { dialog, text ->
onPasswordEntered(text.toString())
}
positiveButton(text = "Submit") {
it.dismiss()
}
negativeButton(text = "Cancel") {
it.dismiss()
}
lifecycleOwner(LocalLifecycleOwner.current)
}.setOnDismissListener {
onDismiss()
}
}
}

4. Xml Layout의 구성


input 을 사용하는 경우에는  라이브러리 제공자의 github 에서 참조 하여 xml layout 을 복사해 주어야 합니다.  이유는 사용하는  라이브러리가 xml layout 을 기반으로 하고 있어서 그런 부분이 있습니다.  자세한 내용은 원작자의 github 을 참고 하세요.


 


material-dialogs/documentation/INPUT.md at main · afollestad/material-dialogs



 


material-dialogs/documentation/INPUT.md at main · afollestad/material-dialogs


😍 A beautiful, fluid, and extensible dialogs API for Kotlin & Android. - afollestad/material-dialogs


github.com




 


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/md_dialog_frame_margin_horizontal"
android:paddingRight="@dimen/md_dialog_frame_margin_horizontal"
android:paddingBottom="@dimen/md_dialog_frame_margin_vertical_less">

<com.google.android.material.textfield.TextInputLayout
android:id="@+id/md_input_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<com.google.android.material.textfield.TextInputEditText
android:id="@+id/md_input_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="Hello, World!" />
</com.google.android.material.textfield.TextInputLayout>

</FrameLayout>

 


5.  해당 Activity 의 theme 수정 


 위에서 말한 xml layout 을 활용 하기 위해서는 사용하는 activitify 의 테마 정보도 제약이 있습니다.  아래 내용으로 지정 하는 않으면 build 하는 과정에서 오류 메시지가 나타나게 됩니다.   아래의 예시에서 참고할 부분은 parent theme 로 지정된 Theme.AppCompat 으로 지정하는 않으면 build 과정에서 오류가 발생 됩니다. 그리고 manifest 파일에서 해당 activity 의  theme 도 아래 name 의 값으로 지정해 주어야 합니다.


 


<?xml version="1.0" encoding="utf-8"?>
<resources>

<style name="Theme.Multichat416" parent="Theme.AppCompat" >
<item name="fontFamily">@font/notosanskr_regular</item>
<item name="md_color_title">@color/white</item>
<item name="md_color_content">@color/white</item>
<item name="md_color_button_text">@color/white</item>
<item name="md_background_color">@color/softBlue</item>
<item name="md_ripple_color">@color/white</item>
<item name="md_divider_color">@color/softBlue</item>
<item name="md_font_button">@color/softRed</item>
<item name="md_item_selector">@color/softBlue</item>

</style>
</resources>

마무리


이렇게 해서 Jetpack Compose와 com.afollestad.material-dialogs 라이브러리를 사용하여 비밀번호 입력 다이얼로그를 구현하는 방법에 대해 알아보았습니다. 이 예제는 기본적인 다이얼로그 구현 방법을 보여주며, 필요에 따라 다이얼로그의 디자인과 동작을 커스터마이즈할 수 있습니다.


이 글이 도움이 되었기를 바랍니다! 질문이나 의견이 있으시면 댓글로 남겨주세요. 감사합니다!





오늘의 이야기

컬러링북 판매 일주일에 500달러 벌기

컬러링 북



• 저자 클라이라 타이드는 750+의 독특하고 맞춤형 디자인이 담긴 자원인 '수익형 컬러링 페이지 PLR 팩'을 이용해 만든 컬러링 북을 판매해 일주일 만에 500달러를 벌어들인 경험을 자세히 설명한다.

• 이 PLR 팩은 교육적인 테마를 가진 고품질의 만화 스타일의 일러스트를 제공했으며 칸바를 사용하여 쉽게 편집할 수 있어 독특한 색칠책을 빠르게 만들고 브랜딩할 수 있습니다.

• 타이드는 디자인을 맞춤화한 다음 Etsy와 Amazon KDP와 같은 플랫폼에서 결과적인 색칠책을 판매하여 붐을 일으키는 어린이 교육 시장의 참여 및 교육 자원에 대한 수요를 활용하여 자원을 활용했습니다.

• 타이드는 지속적인 노력으로 월 2,000달러의 잠재적 수익을 예상하고 성인용 컬러링 북을 포함하도록 제품 라인을 확장하고 추가 판매 플랫폼을 탐색할 계획이며, 이 창의적인 분야에서 상당한 소득 창출 가능성을 강조한다.

https://medium.com/@ClyraTide/how-i-made-500-in-one-week-selling-coloring-books-0a25767b8315

How I Made $500 in One Week Selling Coloring Books

Earning through creative outlets has never been easier.

medium.com





오늘의 이야기

Android Studio를 사용하여 Google Maps 연동 앱 만들기


구글맵



 


소개


이번 포스트에서는 Android Studio와 Jetpack Compose를 사용하여 Google Maps를 연동하는 방법을 알아보겠습니다. 이를 통해 앱에서 지도를 표시하고, 사용자가 지도를 길게 클릭했을 때 해당 위치의 좌표를 얻는 기능을 구현할 수 있습니다.


준비물



  • Android Studio 설치

  • Google Cloud Platform 계정 및 프로젝트 생성

  • Google Maps API Key 발급


단계별 구현


1. 프로젝트 생성 및 설정



  1. 새 프로젝트 생성:

    • Android Studio에서 새 프로젝트를 생성하고 "Empty Compose Activity" 템플릿을 선택합니다.



  2. Google Maps API Key 발급:

    • Google Cloud Platform에 로그인하고 프로젝트를 생성합니다.

    • "API 및 서비스" > "라이브러리"로 이동하여 "Maps SDK for Android"를 활성화합니다.

    • "API 및 서비스" > "인증 정보"로 이동하여 "API 키 만들기"를 클릭합니다.

    • 생성된 API 키를 복사해둡니다.



  3. 프로젝트 설정:

    • build.gradle (Project: <your_project_name>) 파일에 Google Maven 저장소를 추가합니다:

      allprojects {
      repositories {
      google()
      mavenCentral()
      }
      }



    • build.gradle (Module: app) 파일에 필요한 의존성을 추가합니다:


       



      dependencies {
      implementation 'com.google.accompanist:accompanist-permissions:0.30.0'
      implementation 'com.google.maps.android:maps-compose:2.1.0'
      implementation 'com.google.android.gms:play-services-maps:18.0.2'
      }




  4. AndroidManifest.xml 설정:


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.yourapp">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<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/Theme.MyApplication">

<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="YOUR_API_KEY_HERE" />

<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>

 


2. MainActivity 설정



  1. MainActivity.kt 파일을 열어 Jetpack Compose와 Google Maps를 사용하여 지도를 표시하고, 지도에서 길게 클릭한 위치의 좌표를 얻습니다:

    package com.example.yourapp

    import android.os.Bundle
    import android.widget.Toast
    import androidx.activity.ComponentActivity
    import androidx.activity.compose.setContent
    import androidx.compose.foundation.layout.fillMaxSize
    import androidx.compose.material3.MaterialTheme
    import androidx.compose.material3.Surface
    import androidx.compose.runtime.Composable
    import androidx.compose.runtime.mutableStateOf
    import androidx.compose.runtime.remember
    import androidx.compose.ui.Modifier
    import androidx.compose.ui.platform.LocalContext
    import com.google.android.gms.maps.model.LatLng
    import com.google.maps.android.compose.*

    class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent {
    MyApplicationTheme {
    Surface(
    modifier = Modifier.fillMaxSize(),
    color = MaterialTheme.colorScheme.background
    ) {
    MapScreen()
    }
    }
    }
    }
    }

    @Composable
    fun MapScreen() {
    val context = LocalContext.current
    val cameraPositionState = rememberCameraPositionState {
    position = com.google.android.gms.maps.CameraPosition.fromLatLngZoom(LatLng(0.0, 0.0), 10f)
    }

    val selectedPosition = remember { mutableStateOf<LatLng?>(null) }

    GoogleMap(
    modifier = Modifier.fillMaxSize(),
    cameraPositionState = cameraPositionState,
    onMapLongClick = { latLng ->
    selectedPosition.value = latLng
    Toast.makeText(context, "Long clicked at: ${latLng.latitude}, ${latLng.longitude}", Toast.LENGTH_SHORT).show()
    }
    )

    selectedPosition.value?.let { position ->
    Marker(
    state = MarkerState(position = position),
    title = "Selected Position"
    )
    }
    }




결과


이제 앱을 실행하면 지도가 표시되고, 사용자가 지도를 길게 클릭할 때마다 해당 위치의 좌표가 토스트 메시지로 표시되며, 선택된 위치에 마커가 추가됩니다.





오늘의 이야기

android studio 의 AVD 의 화면은 왜 블랙 스크린이 되는 걸까 ?

 


풍경이 있는 그림



 


Android Studio의 AVD(안드로이드 가상 디바이스)가 블랙 스크린이 되는 일반적인 이유는 다음과 같습니다:





  1. 그래픽 가속 문제:

    • AVD는 가상화된 환경에서 실행되므로 그래픽 가속이 제대로 설정되지 않으면 블랙 스크린 문제가 발생할 수 있습니다. AVD 설정에서 그래픽 옵션을 Automatic 또는 Software로 변경해보세요.



  2. 불충분한 시스템 리소스:

    • 가상 디바이스를 실행하는 데 필요한 시스템 리소스(CPU, 메모리 등)가 충분하지 않으면 블랙 스크린 문제가 발생할 수 있습니다. 다른 불필요한 프로그램을 종료하여 시스템 리소스를 확보하세요.



  3. HAXM 설치 문제:

    • Intel의 HAXM(Hardware Accelerated Execution Manager)이 제대로 설치되지 않았거나 활성화되지 않은 경우 문제가 발생할 수 있습니다. HAXM이 제대로 설치되어 있는지 확인하고, 설치되어 있지 않다면 설치해보세요.



  4. AVD 구성 문제:

    • AVD 설정이 올바르지 않을 경우 문제가 발생할 수 있습니다. AVD Manager에서 가상 장치를 삭제하고 새로 만들거나, 다른 장치 설정으로 테스트해보세요.



  5. 그래픽 드라이버 문제:

    • 그래픽 드라이버가 최신 상태가 아닐 경우 문제가 발생할 수 있습니다. 그래픽 드라이버를 최신 버전으로 업데이트해보세요.



  6. Android Studio 버그:

    • 간혹 Android Studio 자체의 버그로 인해 문제가 발생할 수 있습니다. 최신 버전의 Android Studio로 업데이트하거나, 문제가 지속될 경우 이전 버전으로 다운그레이드해보세요.




해결 방법



  1. 그래픽 가속 설정 변경:

    • AVD Manager에서 문제의 가상 장치를 선택하고, Edit 버튼을 클릭합니다.

    • Graphics 옵션을 Automatic에서 Software로 변경한 후 다시 시도해보세요.



  2. HAXM 설치 확인:

    • SDK Manager에서 SDK Tools 탭을 선택하고, Intel x86 Emulator Accelerator (HAXM installer)가 설치되어 있는지 확인하세요.

    • 설치되어 있지 않다면, 체크하고 Apply 버튼을 눌러 설치하세요.



  3. 시스템 리소스 확인:

    • 작업 관리자를 열어 시스템 리소스 사용량을 확인하고, 불필요한 프로그램을 종료하여 리소스를 확보하세요.



  4. 그래픽 드라이버 업데이트:

    • 그래픽 드라이버를 최신 버전으로 업데이트하세요. 제조사 웹사이트에서 최신 드라이버를 다운로드하고 설치할 수 있습니다.




위의 방법들을 시도해보시면 AVD 블랙 스크린 문제를 해결하는 데 도움이 될 것입니다.








 

avd manager 에서 graphics 을 수정할 수 없다면 ?

 







 


AVD Manager에서 그래픽 설정을 수정할 수 없는 경우, 다음과 같은 방법을 시도해볼 수 있습니다:


1. config.ini 파일 직접 수정


AVD 설정 파일을 직접 수정하여 그래픽 설정을 변경할 수 있습니다.



  1. AVD 폴더 찾기:

    • AVD 설정 파일(config.ini)은 사용자 홈 디렉토리 내 .android/avd/ 폴더에 저장됩니다.

    • 예를 들어, Windows에서는 다음 경로에 있습니다: C:\Users\<YourUsername>\.android\avd\

    • macOS와 Linux에서는 다음 경로에 있습니다: /Users/<YourUsername>/.android/avd/



  2. config.ini 파일 열기:

    • 원하는 AVD 폴더로 이동한 후, 해당 AVD의 .avd 폴더 내부에 있는 config.ini 파일을 텍스트 편집기로 엽니다.



  3. 그래픽 설정 수정:

    • config.ini 파일 내에서 hw.gpu.mode와 관련된 항목을 찾아 수정합니다.

    • 예를 들어, 그래픽 모드를 software로 변경하려면 다음과 같이 설정합니다:

      hw.gpu.mode=software





  4. 변경 사항 저장:

    • 파일을 저장하고 AVD를 다시 실행해보세요.




 


2. 새로운 AVD 생성


기존 AVD의 설정을 변경할 수 없는 경우, 새로운 AVD를 생성하면서 그래픽 설정을 올바르게 설정할 수 있습니다.



  1. AVD Manager 열기:

    • Android Studio 상단 메뉴에서 Tools -> AVD Manager를 선택합니다.



  2. 새 AVD 생성:

    • Create Virtual Device... 버튼을 클릭합니다.



  3. 디바이스 선택:

    • 사용할 가상 디바이스를 선택하고 Next 버튼을 클릭합니다.



  4. 시스템 이미지 선택:

    • 사용할 시스템 이미지를 선택하고 Next 버튼을 클릭합니다.



  5. AVD 설정:

    • AVD 설정 화면에서 Graphics 옵션을 Automatic, Hardware, 또는 Software로 설정할 수 있습니다.

    • 설정을 완료한 후 Finish 버튼을 클릭하여 AVD를 생성합니다.




3. 그래픽 드라이버 업데이트


그래픽 드라이버가 최신 상태가 아닐 경우, AVD가 제대로 실행되지 않을 수 있습니다. 그래픽 드라이버를 최신 버전으로 업데이트해보세요.



  1. 그래픽 드라이버 확인:

    • 사용 중인 그래픽 카드의 드라이버를 제조사 웹사이트에서 최신 버전으로 다운로드합니다.

    • 예: NVIDIA, AMD, Intel



  2. 드라이버 설치:

    • 다운로드한 드라이버를 설치하고 시스템을 재부팅합니다.




위의 방법들을 통해 AVD의 블랙 스크린 문제를 해결할 수 있습니다. 만약 문제가 지속된다면, Android Studio를 최신 버전으로 업데이트하거나, 문제를 재현할 수 있는 환경을 자세히 설명하여 추가적인 도움을 요청하는 것도 좋은 방법입니다.









오늘의 이야기

Jetpack Compose를 사용하여 AdMob 배너 광고 추가하기


안녕하세요! 이번 블로그 포스트에서는 Jetpack Compose를 사용하여 안드로이드 앱에 AdMob 배너 광고를 추가하는 방법을 단계별로 설명드리겠습니다. Jetpack Compose는 기존의 XML 레이아웃 파일 대신 Kotlin 코드로 UI를 구성하는 방식으로, 더욱 간결하고 효율적으로 UI를 만들 수 있습니다. 그럼 시작해 보겠습니다!


1. AdMob 계정 생성 및 광고 단위 ID 얻기


먼저, AdMob 계정을 생성하고 로그인합니다. 그런 다음 새 앱을 등록하고 광고 단위 ID를 생성합니다. 이 ID는 나중에 필요합니다.


2. Gradle 설정


AdMob SDK를 추가하기 위해 build.gradle 파일을 수정합니다.


프로젝트 수준의 build.gradle 파일:


 

allprojects {
repositories {
google()
mavenCentral()
}
}

 


앱 수준의 build.gradle 파일:


plugins {
id 'com.android.application'
id 'kotlin-android'
}

android {
compileSdk 35

defaultConfig {
applicationId "com.example.mycomposeapp"
minSdk 21
targetSdk 35
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
compose true
}
composeOptions {
kotlinCompilerExtensionVersion '1.4.0'
}
packagingOptions {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
}
}
}

dependencies {
implementation 'androidx.core:core-ktx:1.10.0'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.0'
implementation 'androidx.activity:activity-compose:1.7.0-beta01'
implementation 'androidx.compose.ui:ui:1.4.0-beta01'
implementation 'androidx.compose.ui:ui-tooling-preview:1.4.0-beta01'
implementation 'androidx.compose.material3:material3:1.1.0-alpha06'
implementation 'com.google.android.gms:play-services-ads:22.1.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'androidx.compose.ui:ui-test-junit4:1.4.0-beta01'
debugImplementation 'androidx.compose.ui:ui-tooling:1.4.0-beta01'
debugImplementation 'androidx.compose.ui:ui-test-manifest:1.4.0-beta01'
}

3. AndroidManifest.xml 수정


AndroidManifest.xml 파일에 AdMob 앱 ID를 추가합니다.


 

<manifest>
<application>
<!-- Replace with your actual AdMob app ID -->
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"/>
</application>
</manifest>

4. AdMob 초기화 및 배너 광고 추가


MainActivity.kt 파일을 수정하여 Jetpack Compose 내에서 AdMob 배너 광고를 로드합니다.


import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import com.google.accompanist.admob.AdMobBanner
import com.google.accompanist.admob.AdMobBannerSize
import com.google.android.gms.ads.MobileAds
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
MobileAds.initialize(this) {}

setContent {
MyApp {
AdMobBannerAd()
}
}
}
}

@Composable
fun MyApp(content: @Composable () -> Unit) {
Box(modifier = Modifier.fillMaxSize()) {
content()
}
}

@Composable
fun AdMobBannerAd() {
val context = LocalContext.current

AndroidView(
modifier = Modifier
.fillMaxWidth()
.padding(10.dp),
factory = { context ->
AdView(context).apply {
this.setAdSize(AdSize.BANNER)
adUnitId = context.getString(R.string.admob_banner_id)
loadAd(AdRequest.Builder().build())
}
}
)
}

 


이 예제에서는 Jetpack Compose를 사용하여 AdMob 배너 광고를 앱의 하단에 추가했습니다. 광고 단위 ID를 실제로 생성한 ID로 교체하는 것을 잊지 마세요. 이를 통해 Jetpack Compose 환경에서도 AdMob 광고를 성공적으로 통합할 수 있습니다.


 


배너광고 예시



 


추가적으로, 다른 유형의 광고(예: 전면 광고, 보상형 광고)를 추가하려면 AdMob 공식 문서를 참고하시기 바랍니다.


이상으로 Jetpack Compose를 사용하여 AdMob 배너 광고를 추가하는 방법에 대해 알아보았습니다. 도움이 되셨길 바랍니다! 질문이나 의견이 있으시면 댓글로 남겨주세요. 감사합니다.


 


 





오늘의 이야기


#스하리1000명프로젝트,
แพ้เกาหลีเหรอ? แม้ว่าคุณจะพูดภาษาเกาหลีไม่ได้ แต่แอปนี้จะช่วยให้คุณเดินทางได้อย่างง่ายดาย
เพียงพูดภาษาของคุณ ระบบจะแปล ค้นหา และแสดงผลลัพธ์เป็นภาษาของคุณ
เหมาะสำหรับนักเดินทาง! รองรับมากกว่า 10 ภาษา รวมถึงภาษาอังกฤษ ญี่ปุ่น จีน เวียดนาม และอื่นๆ
ลองตอนนี้!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/04/17

오늘의 이야기

Jetpack Compose에서 알림 권한 요청과 알림 표시하기


Android 13(Tiramisu, API 33) 이상에서는 사용자가 알림을 수신하기 전에 POST_NOTIFICATIONS 권한을 요청해야 합니다. Jetpack Compose를 사용하여 권한을 확인하고 요청하는 방법을 알아보겠습니다.


1. 프로젝트 설정


먼저, build.gradle 파일에 필요한 의존성을 추가합니다:



dependencies {
implementation "androidx.core:core-ktx:1.9.0"
implementation "androidx.compose.ui:ui:1.3.3"
implementation "androidx.compose.material:material:1.3.1"
implementation "androidx.compose.ui:ui-tooling-preview:1.3.3"
implementation "androidx.activity:activity-compose:1.6.1"
}


2. 권한 확인 및 요청


다음은 Jetpack Compose를 사용하여 POST_NOTIFICATIONS 권한을 확인하고 요청하는 예제입니다:


 

import android.Manifest
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.*
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat
import androidx.core.content.PermissionChecker

class MainActivity : ComponentActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

setContent {
RequestNotificationPermission()
}
}

@Composable
fun RequestNotificationPermission() {
val permissionState = remember { mutableStateOf(checkNotificationPermission()) }

val requestPermissionLauncher =
rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
permissionState.value = isGranted
}

if (permissionState.value) {
Text("Notification permission granted")
} else {
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Text("Notification permission is required")
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
}
}) {
Text("Request Permission")
}
}
}
}

private fun checkNotificationPermission(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
} else {
true
}
}
}

3. 알림 생성 및 표시


권한을 얻은 후, 알림을 생성하고 표시하는 방법을 살펴보겠습니다:



import android.app.NotificationChannel
import android.app.NotificationManager
import android.os.Build
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat

fun showNotification(context: Context) {
// 알림 채널 설정 (Android 8.0 이상)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channelId = "your_channel_id"
val channelName = "Your Channel Name"
val importance = NotificationManager.IMPORTANCE_DEFAULT
val channel = NotificationChannel(channelId, channelName, importance).apply {
description = "Your Channel Description"
}
val notificationManager: NotificationManager = context.getSystemService(NotificationManager::class.java)
notificationManager.createNotificationChannel(channel)
}

// 알림 생성
val builder = NotificationCompat.Builder(context, "your_channel_id")
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("Your Notification Title")
.setContentText("Your Notification Content")
.setPriority(NotificationCompat.PRIORITY_HIGH)

// 알림 표시
with(NotificationManagerCompat.from(context)) {
notify(1, builder.build())
}
}


결론


이 글에서는 Jetpack Compose를 사용하여 Android 13 이상에서 POST_NOTIFICATIONS 권한을 요청하고 알림을 표시하는 방법을 알아보았습니다. 권한 관리와 알림 생성은 사용자 경험을 향상시키는 중요한 요소입니다. 이를 통해 더 나은 사용자 경험을 제공할 수 있습니다.


 


알림 도착 예시



 





오늘의 이야기

개발자들을 위한 퍼플렉시티 AI 활용법: 효율적인 검색과 정보 요약 ai가 그린 이미지 • 퍼플렉시티 AI는 출처가 명확한 요약된 답변을 제공하는 AI 기반 검색 엔진으로, 기존 검색 엔진의 한계를 극복하고 개...