我正在为Android的samba客户端工作。给定一个IP地址,它应该连接到它并浏览共享文件夹。
为此,我使用JCIFS。我在我的Android项目中删除了jar并添加了以下代码以连接到PC并获取文件列表:
private void connectToPC() throws IOException {
String ip = "x.x.x.x";
String user = Constants.username + ":" + Constants.password;
String url = "smb://" + ip;
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(user);
SmbFile root= new SmbFile(url, auth);
String[] files = root.list();
for (String fileName : files) {
Log.d("GREC", "File: " + fileName);
}
}
我得到了回报: jcifs.smb.SmbAuthException:登录失败:未知用户名或密码错误。
但凭据是正确的。我还尝试使用来自Android市场的另一个samba客户端,它使用JCIFS并且它成功连接到那个ip,所以显然我在这里做错了但不知道特别是什么。
非常感谢任何帮助。
答案 0 :(得分:1)
最后我成功连接到PC。该问题最终出现在NtlmPasswordAuthentication();
构造函数中。
所以,而不是:
String user = Constants.username + ":" + Constants.password;
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(user);
我改为:
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("",
Constants.username, Constants.password);
我不知道为什么,也许是因为“:”特殊字符,也许是因为Android,但是将空域名,用户名和密码分别传递给构造函数,解决了这个问题。
答案 1 :(得分:1)
如果他们遇到与android和JCIFS类似的问题,有些人会谈到这个话题, 在尝试使其工作时,这些是其他常见问题:
*将.jar专门放在Android项目的/ libs文件夹中(不只是通过“构建路径”)
*确保您的项目具有互联网权限What permission do I need to access Internet from an android application?
*还要确保您的JCIFS代码在与UI的单独线程中运行(换句话说,使用AsyncTask类)how to use method in AsyncTask in android?
*代码:
protected String doInBackground(String... params) {
SmbFile[] domains;
String username = USERNAME;
String password = PASSWORD;
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("",
username, password);
try {
SmbFile sm = new SmbFile(SMB_URL, auth);
domains = sm.listFiles();
for (int i = 0; i < domains.length; i++) {
SmbFile[] servers = domains[i].listFiles();
for (int j = 0; j < servers.length; j++) {
Log.w(" Files ", "\t"+servers[j]);
}
}
} catch (SmbException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
return "";
}
这些是我在尝试在Android上工作JCIFS时遇到的问题,希望能帮助任何人,问候。
答案 2 :(得分:1)
我遇到的问题是我使用thread.run()而不是thread.start()来执行Runnable中的Smb-Code。我搜索了大量的时间来寻找答案,但没有解决我的问题。
然后一位朋友向我解释了thread.run()和thread.start()之间的不同之处:
run():执行Methode(例如runnable的run()Methode),就像普通方法一样(同步)
start():在自己的任务中启动带有Runnable的线程(异步)
对于Smb,你需要一个异步线程。因此,您需要调用thread.start()!
也许有人犯了和我一样的错误。