2013-01-28 22 views
7

Quindi sto provando a scrivere un file dal dispositivo Android alla cartella condivisa di Windows. Sto usando l'ultima versione di JCIFS e code which displays available network shares funziona bene. Quindi presumo tutto è ok con JCIFS e con la mia LAN, WiFi ecc Ecco il codice per il caricamento di file (in realtà voglio solo scrivere uno Sring testo in un file):Scrivi/carica un file usando il problema Samba/JCIFS (SmbAuthException: Accesso negato)

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

Dal momento che l'url è connesso Sono sicuro che sia corretto (ho anche controllato l'url usando il codice che ho menzionato sopra e sfoglia il contenuto della cartella).
Ma il problema è Im ottenendo sempre lo stesso:

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

Azioni non sono protetti da password, quindi non hanno bisogno di alcun username/password per accedere. Potrei leggere/scrivere/cancellare file da un altro WinPC e non è richiesta alcuna autorizzazione. Inoltre ho provato a creare una password per l'utente su WinPC con le condivisioni ma il risultato era lo stesso. Così ho provato diverse versioni di NtlmPasswordAuthentication senza fortuna:

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,"",""); 

Così che cosa sto facendo di sbagliato e come achive il mio obiettivo quando non c'è autenticazione è necessario per ottenere l'accesso alla cartella condivisa?
BTW mio Samsung TV che è basato su Linux e usa client samba sta accedendo alla stessa cartella condivisa senza problemi e riproduce MP3 da lì (beh, sì, legge solo). Dal momento che il mio dispositivo AOS accede alla mia LAN tramite Wi-Fi (anziché la TV che è collegata via Ethernet) ho anche controllato l'accesso alla cartella condivisa usando notebook + WiFi e non ho riscontrato problemi.
Aggiunto:
sto cercando ora di eseguire le righe seguenti:

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

e ottenere lo stesso accesso negato. Non sto nemmeno cercando di scrivere il file ...

risposta

10

OMG !!! La soluzione è stata così semplice !!! Per l'accesso alla rete che non è login/password protetta e quindi non ha bisogno di alcuna autorizzazione non è NtlmPasswordAuthentication.ANONYMOUS ma è:

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

accidenti non era così ovvio!

+2

È necessario abilitare l'account guest su Windows prima che funzioni. –

+1

Nel mio caso era WinXP e non hai bisogno di un account guest per essere attivo perché funzioni (l'ho verificato due volte adesso). Per quanto riguarda Win7 è probabilmente così. Win7 è diventato molto difficile da sintonizzare se si parla di networking e questo è il motivo principale per cui non mi piace confrontarlo con XP. – Stan

2

provare con questo codice

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

Controllate anche di avere condividere il percorso della cartella che si sta accedendo. Controlla anche che ha dato il permesso di scrittura alla cartella

+0

??? si tratta di righe copiate del mio codice? Qual e il punto? I permessi di scrittura sono dati e la cartella condivisa esiste di sicuro – Stan

+0

davvero dispiaciuta per il mio errore. puoi provare con questo codice e fammi sapere per favore – rwe

+0

ok. quindi cosa dovrei usare come username e password nella prima riga di codice? Come ho detto prima non c'è bisogno di autenticazione, quindi non sono stati impostati utenti e password. – Stan