Когда я нажимаю кнопку в приложении WearOS, оно должно отправить данные сообщения в приложение «Телефон». Когда сообщение получено из приложения телефона, данные должны отображаться на экране или в лог-коде.
Я пытаюсь связать телефонное приложение и приложение Wear OS, используя язык Kotlin в студии Android. Приложение, которое я хочу сделать, — это просто отправить данные, которые я установил, в приложение телефона при нажатии кнопки на WearOS. Я настроил MessageClient на обеих сторонах, и хотя я могу отправлять данные из ОС Wear в приложение для телефона, функция onMessageReceived в приложении для телефона, похоже, никогда не срабатывает. Устройства сопряжены.
Код Wear OS:
Код: Выделить всё
class MainActivity : ComponentActivity(),
DataClient.OnDataChangedListener,
MessageClient.OnMessageReceivedListener{
private var activityContext: Context? = null
private var dataClient: DataClient? = null
private var messageClient: MessageClient? = null
companion object {
const val MESSAGE_PATH_SEND = "/send_message"
const val MESSAGE_PATH_RECEIVE = "/receive_message"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
WearApp("Android")
}
activityContext = this
dataClient = Wearable.getDataClient(this)
messageClient = Wearable.getMessageClient(this)
}
@Composable
fun WearApp(greetingName: String) {
WearOSCommunicationTheme {
Column(
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colors.background),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
//Greeting(greetingName = greetingName)
Text(text = "Example text")
Button(
modifier = Modifier
.padding(10.dp)
.fillMaxWidth(),
onClick = { sendMessageToPhone("this is an example message") }) {
Text(text = "Send Msg")
}
}
}
}
private fun sendMessageToPhone(message: String) {
Wearable.getNodeClient(activityContext!!).connectedNodes.addOnSuccessListener { nodes ->
for (node in nodes) {
if (node.isNearby) { // Check if the node is reachable
Wearable.getMessageClient(activityContext!!).sendMessage(node.id, MESSAGE_PATH_SEND, message.toByteArray(Charsets.UTF_8))
.addOnSuccessListener {
// Handle success here with a toast
Log.d("WearOSLog", "Message sent successfully to ${node.id}")
}
.addOnFailureListener { exception ->
// Handle failure here with a toast
Log.e("WearOSLog", "Failed to send message to ${node.id}", exception)
}
} else {
Log.d("WearOSLog", "Node ${node.id} is not reachable")
}
}
}.addOnFailureListener { exception ->
// Handle failure to get connected nodes here
Log.e("WearOSLog", "Failed to get connected nodes", exception)
}
}
override fun onDataChanged(dataEvents: DataEventBuffer) {
for (event in dataEvents) {
if (event.type == DataEvent.TYPE_CHANGED){
// Handle data change
}
}
}
override fun onMessageReceived(messageEvent: MessageEvent) {
TODO("Not yet implemented")
}
override fun onResume() {
super.onResume()
try {
Wearable.getDataClient(activityContext!!).addListener(this)
Wearable.getMessageClient(activityContext!!).addListener(this)
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun onPause() {
super.onPause()
Wearable.getDataClient(activityContext!!).removeListener(this)
Wearable.getMessageClient(activityContext!!).removeListener(this)
}
}
Код: Выделить всё
class MainActivity : AppCompatActivity(),
MessageClient.OnMessageReceivedListener,
DataClient.OnDataChangedListener{
companion object {
const val MESSAGE_PATH_SEND = "/send_message"
const val MESSAGE_PATH_RECEIVE = "/receive_message"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onMessageReceived(messageEvent: MessageEvent) {
try {
if (messageEvent.path == MESSAGE_PATH_SEND) {
val message = String(messageEvent.data, Charsets.UTF_8)
Log.d("PhoneSide", "Message received: $message");
}
} catch (e: Exception) {
e.printStackTrace()
Log.d("PhoneSide", "error")
}
}
override fun onResume() {
super.onResume()
try {
Wearable.getDataClient(this).addListener(this)
Wearable.getMessageClient(this).addListener(this)
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun onPause() {
super.onPause()
try {
Wearable.getDataClient(this).removeListener(this)
Wearable.getMessageClient(this).removeListener(this)
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun onDataChanged(p0: DataEventBuffer) {
TODO("Not yet implemented")
}
}
Файл манифеста WearOS:
Код: Выделить всё
Код: Выделить всё
Подробнее здесь: https://stackoverflow.com/questions/768 ... ommunicate
Мобильная версия