Uygulama İşlemleri ile dinamik kısayolları Google Asistan'a genişletme

Uygulama İşlemleri ile dinamik kısayolları Google Asistan'a genişletme

Bu codelab hakkında

subjectSon güncelleme Eyl 12, 2024
account_circleYazan: Google Assistant Developer Relations

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.

Google Asistan'ın dinamik bir kısayolu kullanıma sunduğunu gösteren üç aşamalı ekran.

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

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:

  1. Android Studio'ya hoş geldiniz iletişim kutusunda Projeyi içe aktar'ı tıklayın.
  2. 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:

  1. Android Studio'da, Çalıştır > Uygulamayı çalıştırın veya araç çubuğunda ÇalıştırAndroid Studio'da uygulama simgesini çalıştırma tıklayın.
  2. 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.
  3. 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:

  1. ShortcutManagerCompat API'sini soyutlamak için bir ShortcutsRepository sınıfı oluşturun.
  2. Uygulamanın hizmet bulucu özelliğine ShortcutsRepository yöntemleri ekleyin.
  3. 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.

shortsRepository sınıfının konumunu gösteren Android Studio penceresi.

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

  1. ShortcutsRepository hizmetini, görev listesi nesnelerini yönetmekten sorumlu AddEditTaskViewModel sınıfına aktarma.
  2. 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:

  1. Dosya > Ayarlar'a (MacOS'te Android Studio > Tercihler) gidin.
  2. Eklentiler bölümünde Marketplace'e gidin ve "Google Assistant" araması yapın.
  3. 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:

  1. Araçlar > Google Asistan > "Uygulama İşlemleri Test Aracı"nı tıklayın.
  2. Uygulama adı kutusuna "Yapılacaklar Listesi" gibi bir ad tanımlayın.
  3. Önizleme Oluştur'u tıklayın. İstenirse Uygulama İşlemleri politikalarını ve hizmet şartlarını inceleyip kabul edin.

Uygulama İşlemleri Test Aracı önizleme oluşturma bölmesi.

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

  1. "Codelab'i başlat" başlıklı yeni bir görev oluşturun.
  2. Google Asistan uygulamasını açıp "Kısayollarım" deyin veya yazın.
  3. Keşfet sekmesine dokunun. Örnek kısayolu göreceksiniz.
  4. Ç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:

  1. Mevcut görev öğenizin başlığını "Codelab'i bitir" olarak yeniden adlandırın.
  2. "Ok Google, kısayollarım" diyerek Google Asistan'ı açın.
  3. 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:

  1. Test görevinizi silin.
  2. Mevcut görev öğenizin başlığını "Codelab'i tamamla" olarak değiştirin.
  3. "Ok Google, kısayollarım" diyerek Google Asistan'ı açın.
  4. 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:

Actions on Google yolculuğunuza devam etmek için aşağıdaki kaynakları inceleyin:

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.