再次:Android MQTT无法创build客户端

我试图在Android中创build一个MqttClient,在ADT上使用一个Android模拟器(Nexus7)(在Linux Fedora17上是Eclipse 3.8.0,我发现这个问题的答案是(Android MQTT无法创build客户端) ,但是它没能解决我的问题问题。

我创build了一个活动,允许用户进入存储预存文件的目录,但是没有办法避免捕获exception。 我试过用“/ mnt / sdcard /”,“/ mnt /”,“/ mnt / sdcard / tmp /”和类似的。

在Eclipse项目中,我需要注意Android模拟器中的特定设置吗? 是否有任何使用权限被包含在应用程序中?

我查看了引用回答的问题中提到的各种mqtt资源,但无法find答案。

这是我的代码:

package com.storassa.android.mqttsample; import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttDefaultFilePersistence; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.TextView; public class MqttSample extends Activity { Button okButton = null; AutoCompleteTextView inputTextView = null; TextView errorTextView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mqtt_sample); okButton = (Button)findViewById(R.id.okButton); inputTextView = (AutoCompleteTextView)findViewById(R.id.InputText); errorTextView = (TextView)findViewById(R.id.errorText); okButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub try { String dir = inputTextView.getText().toString(); MqttDefaultFilePersistence mdfp = new MqttDefaultFilePersistence( dir); MqttClient client = new MqttClient("tcp://127.0.0.1:1833", "0001", mdfp); } catch (Exception e) { String errorText = ""; for (StackTraceElement error : e.getStackTrace()) errorText += error.toString() + "\n"; errorTextView.setText(errorText); } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_mqtt_sample, menu); return true; } } 

这是堆栈:

 MqttException(0) at org.eclipse.paho.client.mqttv3.MqttDefaultFilePersistence.open(MqttDefaultFilePersistence.java:74) org.eclipse.paho.client.mqttv3.MqttClient.<init>(MqttClient.java:183) com.storassa.android.mqttsample.MqttSample$1.onClick(MqttSample.java:38) android.view.View.performClick(View.java:4202) android.view.View$PerformClick.run(View.java:17340) android.os.Handler.handleCallback(Handler.java:725) android.os.Handler.dispatchMessage(Handler.java:92) android.os.Looper.loop(Looper.java:137) android.app.ActivityThread.main(ActivityThread.java:5039) java.lang.reflect.Method.invokeNative(Native Method) java.lang.reflect.Method.invoke(Method.java:511) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) dalvik.system.NativeStart.main(Native Method) 

Solutions Collecting From Web of "再次:Android MQTT无法创build客户端"

如果不依赖文件持久性,则可以使用类MemoryPersistence的实例。

所以打电话给客户将是:

 MemoryPersistence persistence = new MemoryPersistence(); MqttClient client = new MqttClient(host, clientId, persistence); 

经过了一整天的时间来了解这个问题,并在任何地方用Googlesearch,最终我得到了:非常简单的权限必须被添加到清单

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

我不知道是否可以使用内部目录而不是SD卡。

因为这是我第一次回答自己的问题,请告诉我是否是一个很好的礼仪,我自己的答案是正确答案(我对这个问题有不同的看法)

这解决了我的问题。

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

WAMP也有点嘲讽。

错误是因为MQTT客户端代码尝试打开本地存储上的文件以在以高(1/2)QOS级别发布时存储消息。 将有2个原因的错误:

1.您可能没有授予应用程序的存储访问权限

2.您不太可能有权写入MQTT客户端select的默认位置。

最简单的方法是为MQTT客户端使用内存存储(org.eclipse.paho.client.mqttv3.persist.MemoryPersistence)。

 ... MemoryPersistence persistence = new MemoryPersistence(); client = new MqttClient("tcp://test.mosquitto.org:1883", clientId); ... 

一旦你解决了这个问题,你很可能会遇到UI线程上的networking问题。 为了避免这一点,我build议你看一下Android提供的AsyncTask代码

  MqttClientPersistence persistence = new MqttDefaultFilePersistence(mContext.getApplicationInfo().dataDir); mqttclient = new MqttAsyncClient(url.toString(), clientId, persistence);