سؤال

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