Записать / загрузить файл, используя проблему Samba/JCIFS (SmbAuthException: доступ запрещен)
Поэтому я пытаюсь записать файл с устройства Android в общую папку Windows. Я использую последнюю версию JCIFS, и код, который отображает доступные сетевые ресурсы, работает нормально. Поэтому я предполагаю, что с JCIFS и моей локальной сетью, WiFi и т. Д. Все в порядке. Вот код для загрузки файла (на самом деле я просто хочу написать текст Sring to a File):
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,"","");
Так что я делаю не так и как достичь своей цели, когда не требуется авторизация для получения доступа к общей папке?
Кстати, мой телевизор Samsung на базе Linux, использующий клиент samba, без проблем получает доступ к той же общей папке и воспроизводит оттуда MP3 (ну, да, он только для чтения). Так как мое устройство AOS получает доступ к моей локальной сети через WiFi (вместо телевизора, подключенного через Ethernet), я также проверил доступ к общей папке с помощью ноутбука +WiFi и не обнаружил проблем.
Добавлено:
Я пытаюсь сейчас выполнить следующие строки:
file = new SmbFile(url, auth);
android.util.Log.i("save2Samba", "file.exists(): " + file.exists());
и получить тот же доступ запрещен. Я даже не пытаюсь записать файл...
2 ответа
О, МОЙ БОГ!!! Решение было так просто!!! Чтобы получить доступ к сети, которая не защищена логином / паролем и, следовательно, не требует какой-либо авторизации, это не NtlmPasswordAuthentication.ANONYMOUS, НО это:
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());
Также проверьте, есть ли у вас общий путь к папке, к которой вы обращаетесь. Также проверьте это дало разрешение на запись в папку