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

时间:2013-03-20 10:37:08

标签: java android jcifs

我正在为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,所以显然我在这里做错了但不知道特别是什么。

非常感谢任何帮助。

3 个答案:

答案 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()!

也许有人犯了和我一样的错误。