Java 连接到PC以从Android设备查看共享文件夹
我正在为Android开发samba客户端。给定一个IP地址,它应该连接到它并浏览共享文件夹 为此,我使用。我在Android项目中删除了jar,并添加了以下代码以连接到PC并获取文件列表:Java 连接到PC以从Android设备查看共享文件夹,java,android,jcifs,Java,Android,Jcifs,我正在为Android开发samba客户端。给定一个IP地址,它应该连接到它并浏览共享文件夹 为此,我使用。我在Android项目中删除了jar,并添加了以下代码以连接到PC并获取文件列表: private void connectToPC() throws IOException { String ip = "x.x.x.x"; String user = Constants.username + ":" + Constants.password; String url
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.smbauth异常:登录失败:未知用户名或错误密码。
但凭证是正确的。我还尝试了另一个来自android market的samba客户端,它使用JCIFS,并成功地连接到该ip,所以很明显我在这里做错了什么,但不知道具体是什么
非常感谢您的帮助 最后,我成功地连接到电脑。问题出在
NtlmPasswordAuthentication()中代码>构造函数
因此,与此相反:
String user = Constants.username + ":" + Constants.password;
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(user);
我改为:
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("",
Constants.username, Constants.password);
我不知道为什么,可能是因为“:”特殊字符,可能是因为Android,但分别将空域名、用户名和密码传递给构造函数,解决了这个问题。最后我成功地连接到PC。问题出现在NtlmPasswordAuthentication()中代码>构造函数
因此,与此相反:
String user = Constants.username + ":" + Constants.password;
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(user);
我改为:
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("",
Constants.username, Constants.password);
我不知道为什么,可能是因为“:”特殊字符,可能是因为Android,但分别向构造函数传递一个空域名、用户名和密码,解决了这个问题。因为有些人在Android和JCIFS上遇到类似问题时会谈到这个话题,
在尝试使其工作时,还有其他常见问题:
*将.jar专门放在android项目的/libs文件夹中(而不仅仅是通过“构建路径”)
*确保您的项目具有internet权限
*还要确保您的JCIFS代码在与UI不同的线程中运行(换句话说,使用AsyncTask类)
*代码:
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 "";
}
受保护的字符串doInBackground(字符串…参数){
SmbFile[]域;
字符串用户名=用户名;
字符串密码=密码;
NtlmPasswordAuthentication auth=新的NtlmPasswordAuthentication(“”,
用户名、密码);
试一试{
SmbFile sm=新的SmbFile(SMB_URL,auth);
domains=sm.listFiles();
对于(int i=0;i
这些都是我在尝试在android上使用JCIFS时遇到的问题,希望能帮助任何人,尊敬的。因为如果有些人在android和JCIFS上遇到类似的问题,他们会谈到这个话题,
在尝试使其工作时,还有其他常见问题:
*将.jar专门放在android项目的/libs文件夹中(而不仅仅是通过“构建路径”)
*确保您的项目具有internet权限
*还要确保您的JCIFS代码在与UI不同的线程中运行(换句话说,使用AsyncTask类)
*代码:
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 "";
}
受保护的字符串doInBackground(字符串…参数){
SmbFile[]域;
字符串用户名=用户名;
字符串密码=密码;
NtlmPasswordAuthentication auth=新的NtlmPasswordAuthentication(“”,
用户名、密码);
试一试{
SmbFile sm=新的SmbFile(SMB_URL,auth);
domains=sm.listFiles();
对于(int i=0;i
这些都是我在android上制作JCIFS时遇到的问题,希望能帮助任何人,尊敬的。也许我也能帮助其他人
我遇到的问题是,我使用thread.run()而不是thread.start()以可运行的方式执行Smb代码。我花了很多时间寻找答案,但没有解决我的问题
但后来一位朋友向我解释了thread.run()和thread.start()之间的区别:
run():像普通方法(同步)一样执行Methode(例如Runnable的run()Methode)
start():在自己的任务中使用Runnable启动线程(异步)
对于Smb,您需要一个异步线程。因此,您需要调用thread.start()
也许有人犯了和我一样的错误。也许我也能帮助别人
我遇到的问题是,我使用thread.run()而不是thread.start()以可运行的方式执行Smb代码。我花了很多时间寻找答案,但没有解决我的问题
但后来一位朋友向我解释了thread.run()和thread.start()之间的区别:
run():像普通方法(同步)一样执行Methode(例如Runnable的run()Methode)
start():在自己的任务中使用Runnable启动线程(异步)
对于Smb,您需要一个异步线程。因此,您需要调用thread.start()
可能有人犯了和我一样的错误。试着在PC端停止IP表。嗯。。。我真的不知道这意味着什么,但事实上,我成功地用另一个应用程序连接到电脑,马