매니페스트 파일의 application 태그 위에 입력해준다.

<queries>
	<intent>
		<action android:name="android.intent.action.TTS_SERVICE"/>
	</intent>
</queries>

 

코틀린을 기준으로 작성하였다.

Context 객체와 InitListener를 요구하는데 람다 블럭 안에서

스테이터스가 성공인지 확인해서 성공이면 TTS를 사용하면 된다.

    lateinit var tts: TextToSpeech
    tts = TextToSpeech(context) { status ->
        if (status == TextToSpeech.SUCCESS) {
            tts.language = Locale.KOREAN;
            tts.setPitch(1.0f)
            tts.setSpeechRate(1.0f)
            tts.speak(context.getString(R.string.contacts), TextToSpeech.QUEUE_FLUSH, null, null)
        }
    }

 

블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

젯팩 컴포즈를 배운 뒤에 appwidget도 관련된 api가 있는지 찾아보았는데 있었다.

젯팩 컴포즈에선 glance라는 api를 사용한다.

glance를 사용하기 위해선 어떻게 해야하는지 알아보겠다.

 

먼저 모듈의 build.gradle.kts에 아래 의존성을 추가해준다.

    implementation("androidx.glance:glance:1.0.0")
    // For AppWidgets support
    implementation("androidx.glance:glance-appwidget:1.0.0")

이외에도 wear tiles를 사용하려면(웨어 디바이스에 사용되는거 같다.) 다른 부분도 추가해야 한다.

 

아래 적당한 패키지에 아래 클래스들을 추가한다.

 

class ContactReceiver : GlanceAppWidgetReceiver() {
    override val glanceAppWidget: GlanceAppWidget = ContactWidget()
}

GlanceAppWidgetReceiver 는 사실 AppWidgetProvider를 상속받아서 만들어졌다.

AppWidgetProvider 에서 했던 작업을 여기서 해도 될 것이다.

class ContactWidget : GlanceAppWidget() {

    override suspend fun provideGlance(context: Context, id: GlanceId) {
        // Load data needed to render the AppWidget.
        // Use `withContext` to switch to another thread for long running
        // operations.

        provideContent {
            // create your AppWidget here
            Contact()
        }
    }

    @Composable
    private fun Contact() {
        val context = LocalContext.current
        Button(
            text = context.getString(R.string.contacts),
            style = TextStyle(
                fontWeight = FontWeight.Bold,
                fontSize = 70.sp,
                textAlign = TextAlign.Center
            ),
            modifier = GlanceModifier.fillMaxSize().padding(0),
            onClick = actionStartActivity<MainActivity>()
        )
    }
}

Contact 컴포저블이 위젯으로 보여지는 부분이다.

이 부분을 수정해서 레이아웃을 설정할 수 있다.

 

stringResource는 젯팩 컴포즈의 컴포저블에서만 동작하는데 glance는 고유의 컴포저블을 사용한다.

때문에 stringResource를 사용하자 오류가 발생했다.

임포트할때도 glance와 관련된 항목인지 확인하고 해야한다.

stringResource대신 context.getString을 사용하면 된다.

 

매니페스트에 아래 항목을 추가해준다.

<receiver android:name=".glance.ContactReceiver" android:exported="true">
    <intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider" android:resource="@xml/contact_app_widget_info" />
</receiver>

 

res의 xml 폴더의 contact_app_widget_info.xml에 아래 항목을 작성해준다.

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="250dp"
    android:minHeight="40dp"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/glance_default_loading_layout">
</appwidget-provider>

어차피 glance로 레이아웃을 출력할 것이라 initialLayout은 glance기본 레이아웃을 이용했다.

minHeight minWidth가 위젯의 크기가 되는데 이건 1X4칸이다

N칸의 크기는 70*N-30 dp이다.

1->40dp

2->110dp

3->180dp

4->250dp

블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,