如何解决Android12不能使用MqttAndroidClient
How to solve Android 12 cannot use MqttAndroidClient
在我的 Android Studio 中,我想将 Mqtt Android 客户端连接到我的笔记本电脑主机(在同一台机器上)。我使它类似于本指南
https://www.hivemq.com/blog/mqtt-client-library-enyclopedia-paho-android-service/
然后,我发现 Android 12(在我的例子中是 API 32)可能不支持 org.eclipse.paho:org.eclipse.paho.android.service:1.1.1
依赖。因此,我按照下面的解决方案,从提供的 github 中导入了 serviceLibrary-release.aar
库。 (这个link中出现的问题和我的情况一样)
在那之后,我运行进入另一个错误。
error: constructor MqttAndroidClient in class MqttAndroidClient cannot be applied to given types;
MqttAndroidClient client = new MqttAndroidClient(MainActivity.this, "tcp://10.0.2.2:1883", clientId);
^
required: Context,String,String,Ack
found: MainActivity,String,String
reason: actual and formal argument lists differ in length
所以我不确定上述解决方案中的库是否可以应用于我的旧代码,或者我是否需要修改一些代码?
这是我的代码和 gradle 文件。
存储库
maven {
url "https://repo.eclipse.org/content/repositories/paho-releases/"
}
依赖关系
implementation files('libs/serviceLibrary-release.aar')
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
Android Manifest(下面添加权限)
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<service android:name="info.mqtt.android.service.MqttService"/>
主要Activity
import info.mqtt.android.service.MqttAndroidClient;
public class MainActivity extends AppCompatActivity {
private Button buttonConnect;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonConnect = findViewById(R.id.buttonConnect);
buttonConnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String clientId = MqttClient.generateClientId();
Toast.makeText(MainActivity.this, clientId, Toast.LENGTH_SHORT).show();
MqttAndroidClient client = new MqttAndroidClient(MainActivity.this, "tcp://10.0.2.2:1883", clientId);
try {
IMqttToken token = client.connect();
token.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
Log.d("Debug", "onSuccess");
Toast.makeText(MainActivity.this, "onSuccess", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.d("Debug", "onFailure");
Toast.makeText(MainActivity.this, "onFailure", Toast.LENGTH_SHORT).show();
exception.printStackTrace();
}
});
} catch (MqttException e) {
e.printStackTrace();
}
}
});
}
}
错误出现在这一行(点击按钮时)
MqttAndroidClient client = new MqttAndroidClient(MainActivity.this, "tcp://10.0.2.2:1883", clientId);
从上面提示的错误信息。我认为这是因为此 class 的构造函数参数也需要一个类型 Ack
,但我对此一无所知。
从您提供的输出来看,您似乎只需要将 Ack 指定为构造函数的最后一个参数。
这是确认您收到了一条消息。根据官方description,有两种模式可用
首先,MqttAndroidClient.Ack.AUTO_ACK
,它会在您收到消息后立即自动确认。
然后你有 MqttAndroidClient.Ack.MANUAL_ACK
,这需要你通过 MqttAndroidClient.acknowledgeMessage(String)
手动确认
你现在可以简单地通过添加自动来测试它,如果没问题那么你可以使用自定义规则手动确认自己。
在我的 Android Studio 中,我想将 Mqtt Android 客户端连接到我的笔记本电脑主机(在同一台机器上)。我使它类似于本指南
https://www.hivemq.com/blog/mqtt-client-library-enyclopedia-paho-android-service/
然后,我发现 Android 12(在我的例子中是 API 32)可能不支持 org.eclipse.paho:org.eclipse.paho.android.service:1.1.1
依赖。因此,我按照下面的解决方案,从提供的 github 中导入了 serviceLibrary-release.aar
库。 (这个link中出现的问题和我的情况一样)
在那之后,我运行进入另一个错误。
error: constructor MqttAndroidClient in class MqttAndroidClient cannot be applied to given types;
MqttAndroidClient client = new MqttAndroidClient(MainActivity.this, "tcp://10.0.2.2:1883", clientId);
^
required: Context,String,String,Ack
found: MainActivity,String,String
reason: actual and formal argument lists differ in length
所以我不确定上述解决方案中的库是否可以应用于我的旧代码,或者我是否需要修改一些代码?
这是我的代码和 gradle 文件。
存储库
maven {
url "https://repo.eclipse.org/content/repositories/paho-releases/"
}
依赖关系
implementation files('libs/serviceLibrary-release.aar')
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
Android Manifest(下面添加权限)
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<service android:name="info.mqtt.android.service.MqttService"/>
主要Activity
import info.mqtt.android.service.MqttAndroidClient;
public class MainActivity extends AppCompatActivity {
private Button buttonConnect;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonConnect = findViewById(R.id.buttonConnect);
buttonConnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String clientId = MqttClient.generateClientId();
Toast.makeText(MainActivity.this, clientId, Toast.LENGTH_SHORT).show();
MqttAndroidClient client = new MqttAndroidClient(MainActivity.this, "tcp://10.0.2.2:1883", clientId);
try {
IMqttToken token = client.connect();
token.setActionCallback(new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
Log.d("Debug", "onSuccess");
Toast.makeText(MainActivity.this, "onSuccess", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.d("Debug", "onFailure");
Toast.makeText(MainActivity.this, "onFailure", Toast.LENGTH_SHORT).show();
exception.printStackTrace();
}
});
} catch (MqttException e) {
e.printStackTrace();
}
}
});
}
}
错误出现在这一行(点击按钮时)
MqttAndroidClient client = new MqttAndroidClient(MainActivity.this, "tcp://10.0.2.2:1883", clientId);
从上面提示的错误信息。我认为这是因为此 class 的构造函数参数也需要一个类型 Ack
,但我对此一无所知。
从您提供的输出来看,您似乎只需要将 Ack 指定为构造函数的最后一个参数。 这是确认您收到了一条消息。根据官方description,有两种模式可用
首先,MqttAndroidClient.Ack.AUTO_ACK
,它会在您收到消息后立即自动确认。
然后你有 MqttAndroidClient.Ack.MANUAL_ACK
,这需要你通过 MqttAndroidClient.acknowledgeMessage(String)
你现在可以简单地通过添加自动来测试它,如果没问题那么你可以使用自定义规则手动确认自己。