문제

I am working on a samba client for Android. Given an IP address it should connect to it and browse the shared folders.

For this I use JCIFS. I dropped the jar in my Android project and added following code to connect to PC and get the list of files:

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);
    }
}

And I get in return: jcifs.smb.SmbAuthException: Logon failure: unknown user name or bad password.

But the credentials are correct. I also tried with another samba client from the android market that uses JCIFS and it successfully connected to that ip, so obviously I am doing something wrong here but don't know what especially.

Any help is highly appreciated.

도움이 되었습니까?

해결책

In the end I managed successfully to connect to PC. The issue turned out to be in the NtlmPasswordAuthentication(); constructor.

So, instead of this:

String user = Constants.username + ":" + Constants.password;
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(user);

I changed to this:

NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("",
                    Constants.username, Constants.password);

I don't know why, perhaps it's because of ":" special character, perhaps because of Android, but passing an empty domain name, the user name, and password separately to the constructor, solved the issue.

다른 팁

Since some people will get to this topic if they got a similar problem with android and JCIFS, these are other common problems when trying to make it work:

*Put the .jar specifically in /libs folder of your android project (not just via "build path")

*Be sure that your project has internet permission What permission do I need to access Internet from an android application?

*Also be sure that your JCIFS code is running in a separate thread from the UI (in other words, use AsyncTask class) how to use method in AsyncTask in android?

*Code:

 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 "";
    }

these were the problems i encounter while trying to make work JCIFS on android, hope to help anyone, regards.

maybe i can help other people too.

I had the problem that i used thread.run() instead of thread.start() to execute the Smb-Code in a Runnable. I searched a lot of time for an answer but nothing fixed my problem.

But then a friend explained me the different between thread.run() and thread.start():

run(): Execute the Methode (for example the run() Methode of a Runnable) like a normal Method (synchronous)

start(): Start the Thread with the Runnable in an own task (asynchronous)

And for Smb you need a asynchronous Thread. Because of this you need to call thread.start()!

Maybe someone make the same mistake as i did.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top