Uygulama İşlemleri ile dinamik kısayolları Google Asistan'a genişletme
Bu codelab hakkında
1. Genel Bakış
Önceki kod laboratuvarında, örnek bir uygulamada yaygın olarak kullanılan yerleşik intent'leri (BII) uygulamak için statik kısayollar kullandınız. Android geliştiricileri, uygulama işlevini Google Asistan'a genişletmek için uygulama işlemlerini kullanır.
Statik kısayollar bir uygulamayla birlikte sunulur ve yalnızca uygulamanın yeni sürümleri yayınlandığında güncellenebilir. Uygulamalardaki dinamik öğeler (ör. kullanıcı tarafından oluşturulan içerikler) için ses işlevi, dinamik kısayollar kullanılarak etkinleştirilir. Uygulamalar, kullanıcılar ilgili işlemleri (ör. görev takibi uygulamasında yeni not oluşturma) gerçekleştirdikten sonra dinamik kısayollar gönderir. Uygulama İşlemleri ile bu kısayolları bir BII'ye bağlayarak ses için etkinleştirirsiniz. Böylece kullanıcılar "Ok Google, Örnek Uygulama'daki alışveriş listemi aç" gibi ifadeler söyleyerek içeriklerine Asistan'dan erişebilir.
Şekil 1. Kullanıcı tarafından oluşturulan bir görevi gösteren üç aşamalı ekran ve Google Asistan bu görev öğesi için dinamik bir kısayol başlatıyor.
Neler oluşturacaksınız?
Bu codelab'de, örnek bir Android yapılacaklar listesi uygulamasında ses için dinamik kısayolları etkinleştireceksiniz. Bu sayede kullanıcılar, Asistan'dan uygulamada oluşturdukları görev listesi öğelerini açmasını isteyebilir. Bu işlemi, Android mimari kalıpları, özellikle de depo, hizmet bulucu ve ViewModel kalıpları kullanarak gerçekleştirebilirsiniz.
Ön koşullar
Bu kod laboratuvarı, önceki kod laboratuvarında ele alınan uygulama işlemleriyle ilgili kavramları (özellikle de BII'ler ve statik kısayollar) temel alır. Uygulama İşlemleri'ni kullanmaya yeni başladıysanız devam etmeden önce bu codelab'i tamamlamanızı öneririz.
Ayrıca, devam etmeden önce geliştirme ortamınızda aşağıdaki yapılandırmanın bulunduğundan emin olun:
- Git yüklü kabuk komutlarının çalıştırılacağı bir terminal.
- Android Studio'nun en son kararlı sürümü.
- İnternet erişimi olan fiziksel veya sanal bir Android cihaz.
- Android Studio, Google uygulaması ve Google Asistan uygulamasında oturum açmış bir Google Hesabı
2. İşleyiş şeklini anlayın
Sesli erişim için dinamik bir kısayolu etkinleştirmek için şu adımları uygulayın:
- Dinamik bir kısayolu uygun bir BII'ye bağlama.
- Google Kısayol Entegrasyonu kitaplığını ekleyerek Asistan'ın kısayolları beslemesini etkinleştirme.
- Kullanıcı, ilgili uygulama içi görevi tamamladığında kısayol aktarma.
Bağlama kısayolları
Dinamik bir kısayolun Asistan'dan erişilebilir olması için ilgili bir BII'ye bağlı olması gerekir. Kısayolu olan bir BII tetiklendiğinde Asistan, kullanıcı isteklerindeki parametreleri bağlı kısayolda tanımlanan anahtar kelimelerle eşleştirir. Örneğin:
GET_THING
BII'ye bağlı bir kısayol, kullanıcıların doğrudan Asistan'dan belirli uygulama içi içerikler istemesine olanak tanıyabilir. * "Ok Google, ExampleApp'te market listemi aç."START_EXERCISE
BII'sine bağlı bir kısayol, kullanıcıların egzersiz oturumlarını görmesine olanak tanıyabilir. * "Ok Google, ExampleApp'ten her zamanki egzersizimi başlatmasını iste."
BII'lerin kategorize edilmiş tam listesi için Yerleşik intent'ler referansı başlıklı makaleyi inceleyin.
Asistan'a kısayollar sağlama
Kısayollarınızı bir BII'ye bağladıktan sonraki adım, projenize Google Kısayol Entegrasyonu kitaplığını ekleyerek Asistan'ın bu kısayolları beslemesini sağlamaktır. Bu kitaplık oluşturulduğunda Asistan, uygulamanız tarafından aktarılan her kısayolu fark eder. Böylece kullanıcılar, Asistan'daki kısayolun tetikleyici ifadesini kullanarak bu kısayolları başlatabilir.
3. Geliştirme ortamınızı hazırlama
Bu codelab'de, Android için geliştirilmiş örnek bir yapılacaklar listesi uygulaması kullanılır. Bu uygulamayla kullanıcılar listelere öğe ekleyebilir, kategoriye göre görev listesi öğelerini arayabilir ve görevleri tamamlanma durumuna göre filtreleyebilir. Bu bölümü tamamlayarak örnek uygulamayı indirin ve hazırlayın.
Temel dosyalarınızı indirme
Örnek uygulamanın GitHub deposunu klonlamak için aşağıdaki komutu çalıştırın:
git clone https://github.com/actions-on-google/app-actions-dynamic-shortcuts.git
Kod deposunu klonladıktan sonra, Android Studio'da açmak için şu adımları uygulayın:
- Android Studio'ya hoş geldiniz iletişim kutusunda Projeyi içe aktar'ı tıklayın.
- Depoyu klonladığınız klasörü seçin.
Alternatif olarak, GitHub deposunun codelab-complete
şubesini klonlayarak tamamlanmış kod laboratuvarını temsil eden örnek uygulamanın bir sürümünü görüntüleyebilirsiniz:
git clone https://github.com/actions-on-google/app-actions-dynamic-shortcuts.git --branch codelab-complete
Android uygulama kimliğini güncelleme
Uygulamanın uygulama kimliğini güncellemek, test cihazınızda uygulamayı benzersiz bir şekilde tanımlar ve "Yinelenen paket adı"nı önler hatası oluşur. Uygulama kimliğini güncellemek için app/build.gradle
uygulamasını açın:
android {
...
defaultConfig {
applicationId "com.MYUNIQUENAME.android.fitactions"
...
}
}
applicationId
alanındaki "MYUNIQUENAME" ifadesini size özgü bir adla değiştirin.
Shortcuts API bağımlılıkları ekleme
Aşağıdaki Jetpack kitaplıklarını app/build.gradle
kaynak dosyasına ekleyin:
uygulama/build.gradle
dependencies {
...
// Shortcuts library
implementation "androidx.core:core:1.6.0"
implementation 'androidx.core:core-google-shortcuts:1.0.1'
...
}
Uygulamayı cihazınızda test edin
Uygulamada daha fazla değişiklik yapmadan önce örnek uygulamanın neler yapabileceği hakkında fikir edinmeniz faydalı olacaktır. Uygulamayı emülatörünüzde çalıştırmak için aşağıdaki adımları uygulayın:
- Android Studio'da, Çalıştır > Uygulamayı çalıştırın veya araç çubuğunda Çalıştır'ı
tıklayın.
- Select Deployment Target (Dağıtım Hedefi Seçin) iletişim kutusunda bir cihaz seçip OK'i (Tamam) tıklayın. Önerilen OS sürümü Android 10 (API düzeyi 30) veya daha yeni sürümlerdir ancak Uygulama İşlemleri Android 5 (API düzeyi 21) ve sonraki sürümlerde çalışır.
- Asistan'ı ayarlamak ve çalıştığını doğrulamak için ana sayfa düğmesine uzun basın. Henüz açmadıysanız cihazınızda Asistan'da oturum açmanız gerekir.
Android sanal cihazlar hakkında daha fazla bilgi için Sanal cihazları oluşturma ve yönetme başlıklı makaleyi inceleyin.
Uygulamanın neler yapabileceğini görmek için uygulamayı kısaca keşfedin. Artı simgesine dokunduğunuzda yeni bir görev öğesi oluşturulur. Sağ üstteki menü öğeleri, görev öğelerini tamamlama durumuna göre aramanıza ve filtrelemenize olanak tanır.
4. Kısayol deposu sınıfı oluşturma
Örnek uygulamamızdaki çeşitli sınıflar, dinamik kısayolları yayınlamak ve yönetmek için ShortcutManagerCompat
API'yi çağırır. Kodda gereksizliği azaltmak için proje sınıflarınızın dinamik kısayolları kolayca yönetmesini sağlayacak bir depo uygularsınız.
Depo tasarım kalıbı, kısayolları yönetmek için temiz bir API sağlar. Deponun avantajı, temel API'nin ayrıntılarının minimal bir API'de eşit olarak soyutlanmasıdır. Şu adımları izleyerek depoyu uygulayın:
ShortcutManagerCompat
API'sini soyutlamak için birShortcutsRepository
sınıfı oluşturun.- Uygulamanın hizmet bulucu özelliğine
ShortcutsRepository
yöntemleri ekleyin. ShortcutRepository
hizmetini ana Uygulamaya kaydedin.
Depoyu oluşturma
com.example.android.architecture.blueprints.todoapp.data.source
paketinde ShortcutsRepository
adlı yeni bir Kotlin sınıfı oluşturun. Bu paketi app/src/main/java
klasöründe bulabilirsiniz. Bu sınıfı, codelab kullanım alanımızı kapsayan minimum sayıda yöntem sunan bir arayüz uygulamak için kullanacaksınız.
Şekil 2. shortsRepository sınıfının konumunu gösteren Android Studio Proje Dosyaları penceresi.
Aşağıdaki kodu yeni sınıfa yapıştırın:
package com.example.android.architecture.blueprints.todoapp.data.source
import android.content.Context
import android.content.Intent
import androidx.annotation.WorkerThread
import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat
import com.example.android.architecture.blueprints.todoapp.data.Task
import com.example.android.architecture.blueprints.todoapp.tasks.TasksActivity
private const val GET_THING_KEY = "q"
/**
* ShortcutsRepository provides an interface for managing dynamic shortcuts.
*/
class ShortcutsRepository(val context: Context) {
private val appContext = context.applicationContext
/**
* Pushes a dynamic shortcut. The task ID is used as the shortcut ID.
* The task's title and description are used as shortcut's short and long labels.
* The resulting shortcut corresponds to the GET_THING capability with task's
* title used as BII's "name" argument.
*
* @param task Task object for which to create a shortcut.
*/
@WorkerThread
fun pushShortcut(task: Task) {
// TODO
}
private fun createShortcutCompat(task: Task): ShortcutInfoCompat {
//...
}
/**
* Updates a dynamic shortcut for the provided task. If the shortcut
* associated with this task doesn't exist, this method throws an error.
* This operation may take a few seconds to complete.
*
* @param tasks list of tasks to update.
*/
@WorkerThread
fun updateShortcuts(tasks: List<Task>) {
//...
}
/**
* Removes shortcuts if IDs are known.
*
* @param ids list of shortcut IDs
*/
@WorkerThread
fun removeShortcutsById(ids: List<String>) {
//...
}
/**
* Removes shortcuts associated with the tasks.
*
* @param tasks list of tasks to remove.
*/
@WorkerThread
fun removeShortcuts(tasks: List<Task>) {
//...
}
}
Ardından, pushShortcut
API'sini çağıracak şekilde pushShortcut
yöntemini güncelleyin. ShortcutsRepository
sınıfını aşağıdaki kodla güncelleyin:
ShortcutsRepository.kt
/**
* Pushes a dynamic shortcut for the task. The task's ID is used as a shortcut
* ID. The task's title and description are used as shortcut's short and long
* labels. The created shortcut corresponds to GET_THING capability with task's
* title used as BII's "name" argument.
*
* @param task Task object for which to create a shortcut.
*/
@WorkerThread
fun pushShortcut(task: Task) {
ShortcutManagerCompat.pushDynamicShortcut(appContext, createShortcutCompat(task))
}
Önceki kod örneğinde appContext
değerini API'ye ilettik. Bu, Uygulama Bağlamı içeren bir sınıf özelliğidir. Bağlam, ana makine etkinliği yaşam döngüsünden daha uzun süre saklanabileceği için bellek sızıntılarını önlemek amacıyla Uygulama Bağlamı (Etkinlik Bağlamı yerine) kullanmanız önemlidir.
Ayrıca API, Görev nesnesi için bir ShortcutInfoCompat
nesnesi iletmemizi gerektirir. Önceki kod örneğinde bunu createShortcutCompat
özel yöntemini çağırarak yapıyoruz. Bu yöntemi, ShortcutInfoCompat
nesnesi oluşturup döndürecek şekilde güncelleyeceğiz. Bunu yapmak için createShortcutCompat
saplamayı aşağıdaki kodla güncelleyin:
ShortcutsRepository.kt
private fun createShortcutCompat(task: Task): ShortcutInfoCompat {
val intent = Intent(appContext, TasksActivity::class.java)
intent.action = Intent.ACTION_VIEW
// Filtering is set based on currentTitle.
intent.putExtra(GET_THING_KEY, task.title)
// A unique ID is required to avoid overwriting an existing shortcut.
return ShortcutInfoCompat.Builder(appContext, task.id)
.setShortLabel(task.title)
.setLongLabel(task.title)
// Call addCapabilityBinding() to link this shortcut to a BII. Enables user to invoke a shortcut using its title in Assistant.
.addCapabilityBinding(
"actions.intent.GET_THING", "thing.name", listOf(task.title))
.setIntent(intent)
.setLongLived(false)
.build()
}
Bu sınıftaki diğer işlev taslakları, dinamik kısayolları güncelleme ve silmeyle ilgilidir. Aşağıdaki kodla güncelleyerek bu işlevleri etkinleştirin:
ShortcutsRepository.kt
/**
* Updates a Dynamic Shortcut for the task. If the shortcut associated with this task
* doesn't exist, throws an error. This operation may take a few seconds to complete.
*
* @param tasks list of tasks to update.
*/
@WorkerThread
fun updateShortcuts(tasks: List<Task>) {
val scs = tasks.map { createShortcutCompat(it) }
ShortcutManagerCompat.updateShortcuts(appContext, scs)
}
/**
* Removes shortcuts if IDs are known.
* @param ids list of shortcut IDs
*/
@WorkerThread
fun removeShortcutsById(ids: List<String>) {
ShortcutManagerCompat.removeDynamicShortcuts(appContext, ids)
}
/**
* Removes shortcuts associated with the tasks.
*
* @param tasks list of tasks to remove.
*/
@WorkerThread
fun removeShortcuts(tasks: List<Task>) {
ShortcutManagerCompat.removeDynamicShortcuts (appContext,
tasks.map { it.id })
}
Hizmet bulucuya sınıf ekle
ShortcutsRepository
sınıfı oluşturulduktan sonra, bir sonraki adım bu sınıfın örneklenmiş nesnelerini uygulamanın geri kalanına sunmaktır. Bu uygulama, hizmet bulucu kalıbını uygulayarak sınıf bağımlılıkları yönetir. Android Studio'daki sınıf tarayıcısını kullanarak hizmet bulucu sınıfını açın. Bunun için Gezin > Sınıf'a gidip "ServiceLocator" yazın. Oluşturulan Kotlin dosyasını tıklayarak IDE'nizde açın.
ShortcutsRepository
ve SuppressLint
paketlerini içe aktarmak için ServiceLocator.kt
dosyasının en üstüne aşağıdaki kodu yapıştırın:
ServiceLocator.kt
package com.example.android.architecture.blueprints.todoapp
// ...Other import statements
import com.example.android.architecture.blueprints.todoapp.data.source.ShortcutsRepository
import android.annotation.SuppressLint
Aşağıdaki kodu ServiceLocator.kt
içeriğine yapıştırarak ShortcutRepository
hizmet üyelerini ve yöntemlerini ekleyin:
ServiceLocator.kt
object ServiceLocator {
// ...
// Only the code immediately below this comment needs to be copied and pasted
// into the body of ServiceLocator.kt:
@SuppressLint("StaticFieldLeak")
@Volatile
var shortcutsRepository: ShortcutsRepository? = null
private fun createShortcutsRepository(context: Context): ShortcutsRepository {
val newRepo = ShortcutsRepository(context.applicationContext)
shortcutsRepository = newRepo
return newRepo
}
fun provideShortcutsRepository(context: Context): ShortcutsRepository {
synchronized(this) {
return shortcutsRepository ?: shortcutsRepository ?: createShortcutsRepository(context)
}
}
}
Kısayol hizmetini kaydedin
Son adım, yeni ShortcutsRepository
hizmetinizi Uygulama'ya kaydetmektir. Android Studio'da TodoApplication.kt
dosyasını açın ve dosyanın üst kısmına yakın bir yerde bulunan şu kodu kopyalayın:
TodoApplication.kt
package com.example.android.architecture.blueprints.todoapp
/// ... Other import statements
import com.example.android.architecture.blueprints.todoapp.data.source.ShortcutsRepository
Ardından, sınıfın gövdesine aşağıdaki kodu ekleyerek hizmeti kaydedin:
TodoApplication.kt
//...
class TodoApplication : Application() {
//...
val shortcutsRepository: ShortcutsRepository
get() = ServiceLocator.provideShortcutsRepository(this)
//...
}
Uygulamayı derleyin ve çalışmaya devam ettiğinden emin olun.
5. Yeni bir kısayol gönderme
Kısayol hizmetiniz oluşturulduğuna göre kısayollar yayınlamaya başlayabilirsiniz. Kullanıcılar bu uygulamada içerik (görev öğeleri) oluşturduğundan ve bu içeriklere daha sonra geri dönmeyi beklediğinden, kullanıcı her yeni görev oluşturduğunda GET_THING
BII'ye bağlı dinamik bir kısayol göndererek bu içeriğe sesli erişimi etkinleştireceğiz. Bu sayede Asistan, kullanıcılar "Hey Google, SampleApp'teki alışveriş listemi aç." gibi sorular sorarak BII'yi tetiklediğinde kullanıcıları doğrudan istenen görev öğesine yönlendirebilir.
Örnek uygulamada bu işlevi etkinleştirmek için aşağıdaki adımları uygulayın:
ShortcutsRepository
hizmetini, görev listesi nesnelerini yönetmekten sorumluAddEditTaskViewModel
sınıfına aktarma.- Kullanıcı yeni bir görev oluşturduğunda dinamik bir kısayol gönderme.
shortsRepository'yi İçe Aktar
Öncelikle ShortcutsRepository
hizmetini AddEditTaskViewModel
tarafından kullanılabilir hale getirmemiz gerekiyor. Bunu yapmak için hizmeti, AddEditTaskViewModel
dahil olmak üzere ViewModel nesnelerini örneklendirmek için uygulamanın kullandığı fabrika sınıfı ViewModelFactory
ürününe aktarın.
Android Studio'da Git > Sınıf'a gidin ve "ViewModelFactory" yazın. Oluşturulan Kotlin dosyasını tıklayarak IDE'nizde açın.
ShortcutsRepository
ve SuppressLint
paketlerini içe aktarmak için ViewModelFactory.kt
dosyasının en üstüne aşağıdaki kodu yapıştırın:
ViewModelFactory.kt
package com.example.android.architecture.blueprints.todoapp
// ...Other import statements
import com.example.android.architecture.blueprints.todoapp.data.source.ShortcutsRepository
Ardından, ViewModelFactory
öğesinin body bölümünü aşağıdaki kodla değiştirin:
ViewModelFactory.kt
/**
* Factory for all ViewModels.
*/
@Suppress("UNCHECKED_CAST")
class ViewModelFactory constructor(
private val tasksRepository: TasksRepository,
private val shortcutsRepository: ShortcutsRepository,
owner: SavedStateRegistryOwner,
defaultArgs: Bundle? = null
) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
override fun <T : ViewModel> create(
key: String,
modelClass: Class<T>,
handle: SavedStateHandle
) = with(modelClass) {
when {
isAssignableFrom(StatisticsViewModel::class.java) ->
StatisticsViewModel(tasksRepository)
isAssignableFrom(TaskDetailViewModel::class.java) ->
TaskDetailViewModel(tasksRepository)
isAssignableFrom(AddEditTaskViewModel::class.java) ->
AddEditTaskViewModel(tasksRepository, shortcutsRepository)
isAssignableFrom(TasksViewModel::class.java) ->
TasksViewModel(tasksRepository, handle)
else ->
throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}")
}
} as T
}
Bir katman yukarı giderek ViewModelFactory
değişikliklerini tamamlayın ve ShortcutsRepository
değerini fabrikanın kurucusuna iletin. Git > Dosya'yı tıklayın ve "FragmentExt.kt" yazın. Oluşturulan Kotlin dosyasını util paketinde bulup IDE'nizde açın.
FragmentExt.kt
öğesinin body bölümünü aşağıdaki kodla değiştirin:
fun Fragment.getViewModelFactory(): ViewModelFactory {
val taskRepository = (requireContext().applicationContext as TodoApplication).taskRepository
val shortcutsRepository = (requireContext().applicationContext as TodoApplication).shortcutsRepository
return ViewModelFactory(taskRepository, shortcutsRepository, this)
}
Kısayol yayınlama
Örnek uygulamanın ViewModel
sınıfları tarafından kullanılabilen ShortcutsRepository
soyutlama sınıfıyla, kullanıcı her yeni not oluşturduğunda dinamik bir kısayol göndermek için not oluşturmaktan sorumlu ViewModel
sınıfı AddEditTaskViewModel
'yi güncelleyebilirsiniz.
Android Studio'da sınıf tarayıcısını açın ve "AddEditTaskViewModel" yazın. Oluşturulan Kotlin dosyasını tıklayarak IDE'nizde açın.
Öncelikle, aşağıdaki içe aktarma ifadesiyle ShortcutsRepository
paketini bu sınıfa ekleyin:
package com.example.android.architecture.blueprints.todoapp.addedittask
//Other import statements
import com.example.android.architecture.blueprints.todoapp.data.source.ShortcutsRepository
Ardından, sınıf yapıcısını aşağıdaki kodla güncelleyerek shortcutsRepository
sınıf özelliğini ekleyin:
AddEditTaskViewModel.kt
//...
/**
* ViewModel for the Add/Edit screen.
*/
class AddEditTaskViewModel(
private val tasksRepository: TasksRepository,
private val shortcutsRepository: ShortcutsRepository
) : ViewModel() {
//...
ShortcutsRepository
sınıfı eklendikten sonra, bu sınıfı çağırmak için pushShortcut()
adlı yeni bir işlev oluşturun. Aşağıdaki özel işlevi AddEditTaskViewModel
öğesinin gövdesine yapıştırın:
AddEditTaskViewModel.kt
//...
private fun pushShortcut(newTask: Task) = viewModelScope.launch {
shortcutsRepository.pushShortcut(newTask)
}
Son olarak, bir görev oluşturulduğunda yeni bir dinamik kısayol aktarın. saveTask()
işlevinin içeriğini aşağıdaki kodla değiştirin:
AddEditTaskViewModel.kt
fun saveTask() {
val currentTitle = title.value
val currentDescription = description.value
if (currentTitle == null || currentDescription == null) {
_snackbarText.value = Event(R.string.empty_task_message)
return
}
if (Task(currentTitle, currentDescription).isEmpty) {
_snackbarText.value = Event(R.string.empty_task_message)
return
}
val currentTaskId = taskId
if (isNewTask || currentTaskId == null) {
val task = Task(currentTitle, currentDescription)
createTask(task)
pushShortcut(task)
} else {
val task = Task(currentTitle, currentDescription, taskCompleted, currentTaskId)
updateTask(task)
}
}
Kodunuzu test etme
Artık kodumuzu test etmeye hazırız. Bu adımda ses özellikli bir dinamik kısayolu aktarıp Google Asistan uygulamasını kullanarak bu kısayolu incelersiniz.
Önizleme oluşturma
Google Asistan eklentisini kullanarak önizleme oluşturmak, dinamik kısayollarınızın test cihazınızdaki Asistan'da görünmesini sağlar.
Test eklentisini yükleyin
Cihazınızda Google Asistan eklentisi yoksa Android Studio'da aşağıdaki adımları uygulayarak eklentiyi yükleyin:
- Dosya > Ayarlar'a (MacOS'te Android Studio > Tercihler) gidin.
- Eklentiler bölümünde Marketplace'e gidin ve "Google Assistant" araması yapın.
- Eklentiyi Marketplace'te bulamazsanız eklentiyi manuel olarak indirin ve Eklentiyi diskten yükleme başlıklı makaledeki talimatları uygulayın.
- Aracı yükleyin ve Android Studio'yu yeniden başlatın.
Önizlemeyi oluşturma
Android Studio'da aşağıdaki adımları uygulayarak bir önizleme oluşturun:
- Araçlar > Google Asistan > "Uygulama İşlemleri Test Aracı"nı tıklayın.
- Uygulama adı kutusuna "Yapılacaklar Listesi" gibi bir ad tanımlayın.
- Önizleme Oluştur'u tıklayın. İstenirse Uygulama İşlemleri politikalarını ve hizmet şartlarını inceleyip kabul edin.
Şekil 3. Uygulama İşlemleri Test Aracı önizleme oluşturma bölmesi.
Test sırasında Asistan'a gönderdiğiniz dinamik kısayollar, Asistan'da önizleme için sağladığınız uygulama adına göre düzenlenir.
Kısayolu aktarma ve inceleme
Test cihazınızda örnek uygulamayı yeniden başlatın ve aşağıdaki adımları uygulayın :
- "Codelab'i başlat" başlıklı yeni bir görev oluşturun.
- Google Asistan uygulamasını açıp "Kısayollarım" deyin veya yazın.
- Keşfet sekmesine dokunun. Örnek kısayolu göreceksiniz.
- Çağrıyı başlatmak için kısayola dokunun. Uygulama, filtre kutusuna önceden doldurulmuş kısayolun adıyla başlatılır. Bu sayede, istenen görev öğesini kolayca bulabilirsiniz.
6. (İsteğe bağlı) Bir kısayolu güncelleme ve silme
Uygulamanız, çalışma zamanında yeni dinamik kısayollar aktarmanın yanı sıra bunları kullanıcı içeriğinizin ve tercihlerinizin mevcut durumunu yansıtacak şekilde güncelleyebilir. Kullanıcı hedef öğeyi değiştirdiğinde (ör. örnek uygulamamızda bir görevi yeniden adlandırdığında) mevcut kısayolları güncellemek iyi bir uygulamadır. Ayrıca, kullanıcıya bozuk kısayollar gösterilmesini önlemek için hedef kaynak kaldırıldığında ilgili kısayolu da silmeniz gerekir.
Kısayolu güncelleme
Kullanıcı bir görev öğesinin ayrıntılarını değiştirdiğinde dinamik kısayolu güncellemek için AddEditTaskViewModel
politikasını değiştirin. Öncelikle, depo sınıfımızdan yararlanan bir güncelleme işlevi eklemek için sınıfın gövdesini aşağıdaki kodla güncelleyin:
AddEditTaskViewModel.kt
private fun updateShortcut(newTask: Task) = viewModelScope.launch {
shortcutsRepository.updateShortcuts(listOf(newTask))
}
Ardından, mevcut bir görev güncellendiğinde yeni yöntemimizi çağıracak şekilde saveTask()
işlevini değiştirin.
AddEditTaskViewModel.kt
// Called when clicking on fab.
fun saveTask() {
// ...
// Note: the shortcuts are created/updated in a worker thread.
if (isNewTask || currentTaskId == null) {
//...
} else {
//...
updateShortcut(task)
}
}
Uygulamayı yeniden başlatıp aşağıdaki adımları uygulayarak kodunuzu test edin:
- Mevcut görev öğenizin başlığını "Codelab'i bitir" olarak yeniden adlandırın.
- "Ok Google, kısayollarım" diyerek Google Asistan'ı açın.
- Keşfet sekmesine dokunun. Test kısayolunuz için güncellenmiş kısa bir etiket göreceksiniz.
Kısayolu kaldırma
Örnek uygulama kısayollarımız, bir kullanıcı bir görevi sildiğinde kaldırılmalıdır. Örnek uygulamada, görev silme mantığı TaskDetailViewModel
sınıfındadır. Bu sınıfı güncellemeden önce, shortcutsRepository
öğesini TaskDetailViewModel
'ye aktarmak için ViewModelFactory
'ü tekrar güncellememiz gerekiyor.
ViewModelFactory
dosyasını açın ve kurucu yönteminin içeriğini aşağıdaki kodla değiştirin:
//...
class ViewModelFactory constructor(
private val tasksRepository: TasksRepository,
private val shortcutsRepository: ShortcutsRepository,
owner: SavedStateRegistryOwner,
defaultArgs: Bundle? = null
) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
override fun <T : ViewModel> create(
key: String,
modelClass: Class<T>,
handle: SavedStateHandle
) = with(modelClass) {
when {
isAssignableFrom(StatisticsViewModel::class.java) ->
StatisticsViewModel(tasksRepository)
isAssignableFrom(TaskDetailViewModel::class.java) ->
TaskDetailViewModel(tasksRepository, shortcutsRepository)
isAssignableFrom(AddEditTaskViewModel::class.java) ->
AddEditTaskViewModel(tasksRepository, shortcutsRepository)
isAssignableFrom(TasksViewModel::class.java) ->
TasksViewModel(tasksRepository, handle)
else ->
throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}")
}
} as T
}
Ardından TaskDetailViewModel
'ü açın. ShortcutsRepository
modülünü içe aktarın ve aşağıdaki kodu kullanarak bunun için bir örnek değişkeni tanımlayın:
TaskDetailViewModel.kt
package com.example.android.architecture.blueprints.todoapp.taskdetail
...
import com.example.android.architecture.blueprints.todoapp.data.source.ShortcutsRepository
/**
* ViewModel for the Details screen.
*/
class TaskDetailViewModel(
//...
private val shortcutsRepository: ShortcutsRepository
) : ViewModel() {
...
}
Son olarak, karşılık gelen taskId
içeren bir görev silindiğinde kimliğine göre kısayolu kaldırmak için deleteTask()
işlevini shortcutsRepository
çağrısı yapacak şekilde değiştirin:
TaskDetailViewModel.kt
fun deleteTask() = viewModelScope.launch {
_taskId.value?.let {
//...
shortcutsRepository.removeShortcutsById(listOf(it))
}
}
Kodunuzu test etmek için uygulamayı yeniden başlatın ve aşağıdaki adımları uygulayın:
- Test görevinizi silin.
- Mevcut görev öğenizin başlığını "Codelab'i tamamla" olarak değiştirin.
- "Ok Google, kısayollarım" diyerek Google Asistan'ı açın.
- Keşfet sekmesine dokunun. Test kısayolunuzun artık görünmediğini onaylayın.
7. Sonraki adımlar
Tebrikler! Sizin sayenizde örnek uygulamamızın kullanıcıları, "Ok Google, ÖrnekUygulama'daki alışveriş listemi aç" gibi şeyler söyleyerek oluşturdukları notlara kolayca geri dönebiliyor. Kısayollar, kullanıcıların uygulamanızda sık kullanılan işlemleri tekrar oynatmasını kolaylaştırarak daha derin kullanıcı etkileşimini teşvik eder.
İşlediklerimiz
Bu kod laboratuvarında şunları öğrendiniz:
- Bir uygulamada dinamik kısayolları aktarmaya ilişkin kullanım alanlarını tanımlayın.
- Depo, bağımlılık ekleme ve hizmet bulucu tasarım kalıplarını kullanarak kod karmaşıklığını azaltın.
- Kullanıcı tarafından oluşturulan uygulama içeriklerine sesli dinamik kısayollar gönderin.
- Mevcut kısayolları güncelleyin ve kaldırın.
Sırada ne var?
Buradan Görev Listesi uygulamanızda daha fazla iyileştirme yapmayı deneyebilirsiniz. Tamamlanmış projeye referans olarak GitHub'daki –codelab-complete branch kod deposuna bakabilirsiniz.
Bu uygulamayı Uygulama İşlemleri ile genişletme hakkında daha fazla bilgi edinmek için aşağıdaki önerilerden yararlanabilirsiniz:
- Uygulama işlemlerinizin performansını nasıl izleyeceğinizi öğrenmek için Firebase için Google Analytics ile yapılacaklar listesi örneğine göz atın.
- Uygulamalarınızı Asistan'a genişletmenin diğer yollarını keşfetmek için Uygulama İşlemleri yerleşik intent referansı sayfasını ziyaret edin.
Actions on Google yolculuğunuza devam etmek için aşağıdaki kaynakları inceleyin:
- actions.google.com: Actions on Google için resmi belge sitesi.
- App Actions örnek dizini: App Actions özelliklerini keşfetmek için örnek uygulamalar ve kodlar.
- Actions on Google GitHub deposu: Örnek kod ve kitaplıklar.
- r/GoogleAssistantDev: Google Asistan ile çalışan geliştiriciler için resmi Reddit topluluğu.
En son duyurularımızdan haberdar olmak için bizi Twitter'da @ActionsOnGoogle hesabından takip edin ve oluşturduğunuz uygulamaları #appActions etiketiyle tweet'leyerek paylaşın.
Geri bildirim anketi
Son olarak, bu kod laboratuvarıyla ilgili deneyiminiz hakkında geri bildirimde bulunmak için lütfen bu anketi doldurun.