切片内容未更新Android App Action 集成了来自 Google Assistant 的切片延迟内容

问题描述

我先创建一个 LoadingSlice,然后通过 Rest API 加载切片内容后,我使用“sliceUri”刷新切片。


    context.contentResolver.notifyChange(sliceUri,null)

我的代码在应用操作测试工具中运行良好,但无法通过 Google 助手运行。 Google Assistent 正确创建了加载 Slice,但在 API 调用后不会刷新已创建 Slice 的内容

actions.xml

    <?xml version ="1.0" encoding ="utf-8"?>
    <actions>
                  <action intentName="custom.actions.intent.CHECK_IN" queryPatterns="@array/ExampleInQueries">
             <fulfillment
                 fulfillmentMode="actions.fulfillment.SLICE"
                 urlTemplate="content://com.myapp.v3.slices.provider/checkin">
             </fulfillment>
    
         </action>
    
        </actions>

AndroidManifest.xml

<provider
    android:name=".slices.MySliceProvider"
    android:authorities="com.myapp.v3.slices.provider"
    android:grantUriPermissions="true"
    android:exported="true">

    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.app.slice.category.SLICE" />
    </intent-filter>

</provider>

MySliceProvider.kt


    class MySliceProvider: SliceProvider()  {
    
        private lateinit var contextNonNull: Context
    
        override fun onCreateSliceProvider(): Boolean {
            contextNonNull = context ?: return false
    
            return true
        }
    
        companion object {
    
            internal const val SLICE_AUTHORITY = "com.myapp.v3.slices.provider"
            var contentLoaded = false
    
        }
    
        private val lastSlices = mutableMapOf<Uri,HCMSlice>()
    
    
        override fun onBindSlice(sliceUri: Uri): Slice {
            return lastSlices.getorPut(sliceUri) { createNewSlice(sliceUri) }.getSlice()
          
        }
    
        private fun createNewSlice(sliceUri: Uri): HCMSlice {
            loadEnabled = false
    
            when (sliceUri.path) {
                
                DeepLink.CHECKINP -> {
                    return MyCheckSlice(
                        context = contextNonNull,sliceUri = sliceUri
                    )
                }
                        else -> MySlice.UnkNown(contextNonNull,sliceUri)
    
                
                
            }
    
        }
    
    }

MyCheckSlice.kt


    class MyCheckSlice(
        context: Context,sliceUri: Uri
    ) : MySlice(context,sliceUri),KodeinAware{
    override val kodein by kodein(context)
    private val authDataHandler: AuthDataHandler by instance()
    private val authSettings: AuthSettings by instance()
    private val dashboardRepository: DashboardRepository by instance()
    
    override fun getSlice(): Slice {
    
                fetchLeaveTypes()
    
        return if (contentLoaded) {
                createStatsSlice()
    
        } else {
            createLoadingSlice()
        }
    
    }
    
    private fun createStatsSlice(): Slice {
        return list(context,sliceUri,ListBuilder.INFINITY) {
            
            row {
                setTitle(context.getString(R.string.slice_success),false)
                setSubtitle("",false)
                primaryAction = createActivityAction()
            }
    
        }
    
    }
    
    private fun createLoadingSlice(): Slice = list(context,ListBuilder.INFINITY) {
        row {
              setTitle(context.getString(R.string.slice_processing),true)
              setSubtitle("",true)
    
            primaryAction = createActivityAction()
        }
    }
    
    private fun fetchShift() {
     
        authSettings.checkAuthorizationService(object :
            AuthStateResultListener {
            override fun onStateSuccess() {
    
                Coroutines.main {
                    try {
                        val getCalculateLeaveHoursResponse =  dashboardRepository.getShift(
                            getCurrentDate()!!
                        )
                        getCalculateLeaveHoursResponse.let {
    
                            val jObject = JSONObject(it.data.toString())
                     
                            val jObjShift = jObject.getJSONObject("shift")
                            shiftCode = jObjShift.getInt("shiftCode")
                            contentLoaded = true
                            refresh() 
    
                            return@main
                        }
    
                    } catch (e: ApiException) {
                        Log.e("TAG","fetchShiftApiException")
                        saveTimeInOut()
                    } catch (e: NoInternetException) {
                        Log.e("TAG","fetchShiftNoInternetException")
                    } catch (e: HTTPRequestException) {
                        Log.e("TAG","fetchShiftHTTPRequestException")
                    } catch (e: ApiNocontentException) {
                        Log.e("TAG","fetchShiftApiNocontentException")
                        saveTimeInOut()
                    }
                }
    
            }
    
            override fun onStateFailure() {
                Log.e("TAG","fetchShiftonStateFailure")
            }
    
            override fun onStateSignout() {
                Log.e("TAG","fetchShiftonStateSignout")
            }
    
        })
    
    }
    }

MySlice.kt


    abstract class MySlice(val context: Context,val sliceUri: Uri) {
        protected val handler = Handler(Looper.getMainLooper())
        abstract fun getSlice(): Slice
    
        
        protected fun refresh() {
            context.contentResolver.notifyChange(sliceUri,null)
        }
    
        protected fun createActivityAction(): SliceAction {
            val intent = Intent(context,MainActivity::class.java)
            return SliceAction.create(
                PendingIntent.getActivity(context,intent,0),IconCompat.createWithResource(context,R.drawable.ic_launcher),ListBuilder.SMALL_IMAGE,context.getString(R.string.slice_enter_app_hint)
            )
        }
    
        class UnkNown(context: Context,sliceUri: Uri) : MySlice(context,sliceUri) {
    
            override fun getSlice(): Slice = list(context,ListBuilder.INFINITY) {
                
    
                row {
                    
                    title = context.getString(R.string.slice_uri_not_found)
                    
                    primaryAction = createActivityAction()
                }
    
                
                setIsError(true)
            }
        }
    }

使用 App Action Test 工具时的示例 LOG


    2021-05-21 18:09:19.780 11102-11120/com.myapp.v3 E/TAG: onSlicePinned
    2021-05-21 18:09:19.786 11102-11125/com.myapp.v3 E/TAG: onBindSlice
    2021-05-21 18:09:19.786 11102-11125/com.myapp.v3 E/TAG: createNewSlice
    2021-05-21 18:09:19.786 11102-11125/com.myapp.v3 E/TAG: content://com.myapp.v3.slices.provider/checkin
    2021-05-21 18:09:20.029 11102-11125/com.myapp.v3 E/TAG: contentLoaded=false
    2021-05-21 18:09:20.034 11102-11125/com.myapp.v3 E/TAG: createLoadingSlice
    2021-05-21 18:09:29.743 11102-11102/com.myapp.v3 E/TAG: fetchShift
    2021-05-21 18:09:29.752 11102-11125/com.myapp.v3 E/TAG: onBindSlice
    2021-05-21 18:09:29.753 11102-11125/com.myapp.v3 E/TAG: contentLoaded=true
    2021-05-21 18:09:29.753 11102-11125/com.myapp.v3 E/TAG: createStatsSlice

使用 Google 助手时的示例 LOG

 

    2021-05-21 18:10:26.831 11102-11120/com.myapp.v3 E/TAG: onSlicePinned
    2021-05-21 18:10:26.833 11102-11125/com.myapp.v3 E/TAG: onBindSlice
    2021-05-21 18:10:26.833 11102-11125/com.myapp.v3 E/TAG: createNewSlice
    2021-05-21 18:10:26.833 11102-11125/com.myapp.v3 E/TAG: content://com.myapp.v3.slices.provider/check?name=idcheckin
    2021-05-21 18:10:26.864 11102-11125/com.myapp.v3 E/TAG: contentLoaded=false
    2021-05-21 18:10:26.864 11102-11125/com.myapp.v3 E/TAG: createLoadingSlice
    2021-05-21 18:10:26.929 11102-11125/com.myapp.v3 E/TAG: onSliceUnpinned
    2021-05-21 18:10:27.542 11102-11102/com.myapp.v3 E/TAG: fetchShift

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...