Я работаю над приложением, которое включает функцию чата с использованием MqttAndroidClient, и у меня возникла проблема с инициализацией клиента.android.os.BinderProxy не может быть передан в org.eclipse.paho.android.service.MqttServiceBinder
Я пытаюсь выполнить отдельный процесс (используя : remote), чтобы запустить клиент mqtt, чтобы подписаться на брокера, чтобы получать сообщения с моего чат-сервера. Удаленная служба создается в рамках основной операции, и я установил IPC с помощью AIDL. Я знаю, что код ошибки указывает, что с IPC есть ошибка; однако я не могу найти причину, потому что я уверен, что правильно установил AIDL.
Короче говоря, вот мои служебные коды:
private static final String MQTT_BROKER = "________(blank on purpose)";
private String userId;
private String publishTopic;
private String subscribeTopic;
MqttAndroidClient client;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new Chat_AIDL.Stub() {
@Override
public String passString(String message) throws RemoteException {
return message;
}
};
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
userId = intent.getStringExtra("userId");
publishTopic = "chat/+/" + userId + "/";
subscribeTopic = "chat/#/" + userId + "/";
Log.d("publishTopic", publishTopic);
Log.d("subscribeTopic", subscribeTopic);
establishMqttConnection();
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
}
@Override
public void messageArrived(String topic, MqttMessage receivedMessage) throws Exception {
Intent in = new Intent();
String msg = new String(receivedMessage.getPayload(), "UTF-8");
in.putExtra("resultCode", Activity.RESULT_OK);
in.putExtra("chatMsg", msg);
Log.d("MQTT_RECEIVED", msg);
LocalBroadcastManager.getInstance(getBaseContext()).sendBroadcast(in);
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
}
});
Log.d("SERVICE_CHAT", "STICKY");
super.onStartCommand(intent, flags, startId);
return Service.START_STICKY;
}
private void establishMqttConnection() {
MemoryPersistence memPer = new MemoryPersistence();
client = new MqttAndroidClient(this, MQTT_BROKER, userId, memPer);
try {
client.connect(null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
Log.d("MQTT", "SUCCESS");
subscribeMessage();
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.d("MQTT", "FAILURE");
exception.printStackTrace();
}
});
} catch (MqttException e) {
e.printStackTrace();
}
}
private void subscribeMessage() {
try {
client.subscribe(subscribeTopic, 0, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
}
});
} catch (MqttSecurityException e) {
e.printStackTrace();
} catch (MqttException e) {
e.printStackTrace();
}
}
Да, @ l-swifter, приклеивающий MqttService к существующему родительскому процессу, работал, поскольку у меня уже есть выделенный сервис, который запускается на собственном процессе для общения и других действий. – AlexSanchez