Проблема с получением nodeID в Котлине (Android)Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Проблема с получением nodeID в Котлине (Android)

Сообщение Anonymous »

Я пытаюсь написать сопутствующее приложение, которое будет передавать ссылку Play Store с телефона на часы с операционной системой и устанавливать мой циферблат. У меня есть функция, которая вызывается при нажатии кнопки. Предполагается получить nodeID для устройства Wear OS и передать ссылку на устройство Wear OS. Когда я перевожу свой телефон в режим беспроводной отладки с помощью Android Studio и запускаю приложение на своем телефоне (который подключен к моим часам), кнопка начинает реагировать и отображаются всплывающие сообщения, но на моих часах ничего не происходит. Я добавил всплывающее сообщение для отображения идентификатора узла, и оно возвращает значение «null», что наводит меня на мысль, что часть кода, которая должна получить идентификатор узла, не работает. В Android Studio ошибок нет. Может ли кто-нибудь помочь мне понять, почему этот код не получает идентификатор узла?
РЕДАКТИРОВАТЬ: После еще нескольких исследований и отладки сообщений журнала я пришел к выводу, что код успешно получает Идентификатор узла. Проблема в том, что RemoteActivityHelper запускается до того, как телефон получит NodeID. Вывод Logcat для «getNode()1» успешно показывает мои подключенные часы, но он появляется после запуска RAH (а сообщение журнала для RAH содержит переменную watchID «null»). Поэтому мне нужно иметь возможность откладывать запуск RAH до тех пор, пока у него не появится файл Node. Я расширил свой код, чтобы теперь показать обе части. Будем признательны за любую помощь в отсрочке RAH!
@Composable
fun InstallButton() {
val context = LocalContext.current
OutlinedButton(onClick = {
Log.d("InstallButton", "InstallButton pressed")
context.getNode()
}) {
Text("Install on Watch")
}
}

fun Context.getNode() {
var watchNode: Node? = null
val uri: String = "https://play.google.com/store/apps/deta ... dio.sedona"
Log.d("GetNode()", "GetNode() function started")
// Creates a thread
Thread {
// Get all nodes (nodes are devices connected)
val nodeListTask: Task =
Wearable.getNodeClient(applicationContext).connectedNodes
Log.d("getNodeClient", "node list:$nodeListTask")
try {
// Try to get the first node and assign it to the WATCH_NODE variable | Usually the first node is the watch, but, if you want, you can iterate all nodes (check google docs to see how to identify the watch)
watchNode = Tasks.await(nodeListTask)[0]
} catch (ignore: Exception) {
}
Log.d("getNode()1", "watchNode ID = $watchNode")
}.start()
Log.d("getNode()2", "watchNode ID = $watchNode")

// Creates the intent that we will pass to the watch
val i = Intent(Intent.ACTION_VIEW)
i.addCategory(Intent.CATEGORY_BROWSABLE)

// Creates the uri to the watchface/app | the string part is a standard deeplink to google play | Important: the watchface/watch app and the phone app, must have the same package name!!
// Possible alternative to remove need to manually specifying package name:
// i.setData(Uri.parse("market://details?id=" + getPackageName()))
i.data = Uri.parse(uri)
Log.d("Creating intent","URI=$uri")

// Create a remoteActivityHelper instance
val remoteActivityHelper = RemoteActivityHelper(this, Executors.newSingleThreadExecutor())

// Send the intent to the watch (node)
remoteActivityHelper.startRemoteActivity(i, watchNode?.id ?: "")
Log.d("remoteActivityHelper","watchNode ID: $watchNode")

// Just shows a message on the user phone
Toast.makeText(this, "Check your watch", Toast.LENGTH_SHORT).show()
}


Подробнее здесь: https://stackoverflow.com/questions/784 ... in-android
Ответить

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

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

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

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

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