Java 连接到PC以从Android设备查看共享文件夹

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

我正在为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 = "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表。嗯。。。我真的不知道这意味着什么,但事实上,我成功地用另一个应用程序连接到电脑,马