Усложнение WearOS: почему он не запрашивает данные каждые 60 секунд?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Усложнение WearOS: почему он не запрашивает данные каждые 60 секунд?

Сообщение Anonymous »

По какой-то причине мое приложение для WearOS обновляется только при первом запуске. После этого он никогда больше не запрашивает новые данные из API...

Код: Выделить всё

@AndroidEntryPoint
class CustomTextComplicationService : SuspendingComplicationDataSourceService() {

@Inject
lateinit var dataStore: DataStore
private val preferences by lazy { UserPreferencesRepository(dataStore).getPreferences() }

private fun openScreen(): PendingIntent? {
val intent = Intent(this, MainActivity::class.java)
intent.putExtra("$packageName.${Request.CUSTOM_TEXT.name}", true)

return PendingIntent.getActivity(
this, 1000 + Request.CUSTOM_TEXT.ordinal, intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
}

private suspend fun fetchApiData(): String? {
Log.d(TAG, "POLLING");
val client = OkHttpClient.Builder()
.sslSocketFactory(createTrustAllSslSocketFactory(), createTrustAllTrustManager())
.hostnameVerifier(createTrustAllHostnameVerifier())
.build()

val apiUrl = "https://hello.com/data/"
val userApiKey = "KEY"  // API key with special characters
val userApiSecret = "SECRET"  // Secret key
val userId = "1"

// URL encode the parameters
val encodedApiKey = URLEncoder.encode(userApiKey, StandardCharsets.UTF_8.toString())
val encodedApiSecret = URLEncoder.encode(userApiSecret, StandardCharsets.UTF_8.toString())
val encodedUserId = URLEncoder.encode(userId, StandardCharsets.UTF_8.toString())

// Construct the URL
val url = "$apiUrl?userapikey=$encodedApiKey&userapisecret=$encodedApiSecret&userid=$encodedUserId"

val request = OkHttpRequest.Builder()
.url(url)
.build()

return try {
val response = withContext(Dispatchers.IO) { client.newCall(request).execute() }
if (response.isSuccessful) {
val responseBody = response.body?.string() ?: ""
val json = JSONObject(responseBody)
json.getString("valueShortened");
} else {
Log.w(TAG, "API request failed: ${response.code}")
null
}
} catch (e: Exception) {
Log.e(TAG, "Error fetching data from API", e)
null
}
}

// Custom method to trust all certificates (bypass SSL verification)
private fun createTrustAllSslSocketFactory(): javax.net.ssl.SSLSocketFactory {
val sslContext = SSLContext.getInstance("TLS")
val trustAllCerts = arrayOf(createTrustAllTrustManager())
sslContext.init(null, trustAllCerts, java.security.SecureRandom())
return sslContext.socketFactory
}

private fun createTrustAllTrustManager(): X509TrustManager {
return object : X509TrustManager {
// Return an empty array instead of null
override fun getAcceptedIssuers(): Array = arrayOf()

override fun checkClientTrusted(chain: Array?, authType: String?) {
// Accept all client certificates
}

override fun checkServerTrusted(chain: Array?, authType: String?) {
// Accept all server certificates
}
}
}

// Create a HostnameVerifier that accepts all hostnames
private fun createTrustAllHostnameVerifier(): HostnameVerifier {
return HostnameVerifier { _, _ -> true }
}

override suspend fun onComplicationRequest(request: ComplicationRequest): ComplicationData? {
val text = fetchApiData() ?: return null
val title: String = preferences.first().customTitle

val complicationTitle = if (title.isBlank()) null else PlainComplicationText.Builder(text = title).build()

return when (request.complicationType) {
ComplicationType.SHORT_TEXT ->  {
ShortTextComplicationData.Builder(
text = PlainComplicationText.Builder(text = text).build(),
contentDescription = PlainComplicationText.Builder(text = "Test: $text, Title: $title").build())
.setTitle(complicationTitle)
.setTapAction(openScreen())
.build()
}
ComplicationType.LONG_TEXT -> {
LongTextComplicationData.Builder(
text = PlainComplicationText.Builder(text = text).build(),
contentDescription = PlainComplicationText.Builder(text = "Test: $text, Title: $title").build())
.setTitle(complicationTitle)
.setTapAction(openScreen())
.build()
}
else -> {
if (Log.isLoggable(TAG, Log.WARN)) {
Log.w(TAG, "Unexpected complication type ${request.complicationType}")
}
null
}
}
}

override fun getPreviewData(type: ComplicationType): ComplicationData? {
return when (type) {
ComplicationType.SHORT_TEXT -> {
ShortTextComplicationData.Builder(
text = PlainComplicationText.Builder(text = "Sample Text").build(),
contentDescription = ComplicationText.EMPTY)
.setTitle(PlainComplicationText.Builder(text = "Sample Title").build())
.build()
}
ComplicationType.LONG_TEXT -> {
LongTextComplicationData.Builder(
text = PlainComplicationText.Builder(text = "Sample Text").build(),
contentDescription = ComplicationText.EMPTY)
.setTitle(PlainComplicationText.Builder(text = "Sample Title").build())
.build()
}
else -> null
}
}
}
Вот моя служба манифеста Android: Что мешает опросу проводиться более одного раза? Это должно происходить каждую минуту/60 секунд. Я поместил его внутри тега службы манифеста Android и указал 60 для значения интервала UPDATE_PERIOD_SECONDS. Он должен производить опрос, но больше никогда не проводит опрос, только при запуске.
Нужно ли что-то изменить в реальном коде службы? Я не могу найти подходящую документацию, в которой показано, как обновить интервал или разрешить его обновление через интервал...

Подробнее здесь: https://stackoverflow.com/questions/793 ... 60-seconds
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»