Запись / загрузка файла с помощью Samba / jcifs issue (SmbAuthException: Доступ запрещен)

поэтому я пытаюсь написать файл с устройства android в общую папку windows. Я использую последнюю версию JCIFS и код, который отображает доступные сетевые ресурсы работает нормально. Поэтому я предполагаю, что все в порядке с JCIFS и с моей LAN, WiFi и т. д. Вот код для загрузки файла (на самом деле я просто хочу написать текст, источник в файл):

    public boolean save2Samba(String text, String fileName) {
        try {

            // My Windows shares doesn't require any login/password
            // String name="login";//my windows username
            // String password="password1";//my windows password

            // sSambaFolder contains a path like MYPC/E/SharedFolderName/
            String url = "smb://" + sSambaFolder.toLowerCase()+fileName;

            SmbFile file = null;
            try {
                // assume ANONYMOUS is my case but there is no description of this in JCIFS API
                NtlmPasswordAuthentication auth = NtlmPasswordAuthentication.ANONYMOUS;
                file = new SmbFile(url, auth);
                android.util.Log.i("TestApp",url);
                // output is like smb://mypc/e/sharedfoldername/file.txt;
                SmbFileOutputStream out = new SmbFileOutputStream(file);
                out.write(text.getBytes());
                out.flush();
                out.close();

            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }

            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

поскольку url зарегистрирован, я уверен, что это правильно (также я проверил url, используя код, который я упомянул выше, и он просматривает содержимое папки).
Но проблема в том, что я всегда получаю то же самое:

W/System.err(3214): jcifs.smb.SmbAuthException: Access is denied.

акции не защищены паролем, поэтому мне не нужно имя пользователя / пароль для получения доступа. Я мог читать/писать / удалять файлы из другого WinPC, и авторизация не требуется. Также я попытался создать пароль для пользователя на WinPC с акциями, но результат был тот же. Поэтому я попробовал несколько версий NtlmPasswordAuthentication без успеха:

NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("");
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(":");
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("Administrator:"); //actual username on WinPC with shares
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("Administrator");
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null,"Administrator","");
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null,"","");

так что же я делаю неправильно и как достичь моей цели, когда нет auth требуется, чтобы получить доступ к общей папке?
BTW мой Samsung TV, который основан на linux и использует клиент samba, получает доступ к той же общей папке без проблем и воспроизводит MP3 оттуда (Ну, да, он только читает). Поскольку мое устройство AOS получает доступ к моей локальной сети через WiFi (вместо телевизора, который подключен через Ethernet), я также проверил доступ к общей папке с помощью ноутбука+WiFi и не нашел проблем.
добавлено:
Я теперь попробуйте выполнить следующие строки:

file = new SmbFile(url, auth);
android.util.Log.i("save2Samba", "file.exists(): " + file.exists());

и получение того же доступа отказано. Я даже не пытаюсь писать файл...

2 ответов


OMG!!! Решение было таким простым!!! Для доступа к сети, которая не защищена логином / паролем и, следовательно, не нуждается в авторизации, не является NtlmPasswordAuthentication.Анонимно, но это:

NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null, null, null);

попробуйте с этим кодом

 NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("",
                            username, password);
    sharepath = "smb://" + pathtosharefolder + test.txt;  


 sFile = new SmbFile(sharepath, auth);
    SmbFileOutputStream out = new SmbFileOutputStream(file, true);
    out.write(text.getBytes());

также проверьте, что у вас есть общий путь к папке, к которой вы обращаетесь. Также проверьте, что он дал разрешение на запись в папку