2013-01-28 29 views
7

Vì vậy, tôi đang cố gắng để viết một tập tin từ thiết bị Android để các cửa sổ thư mục chia sẻ. Tôi đang sử dụng phiên bản mới nhất của JCIFS và code which displays available network shares hoạt động tốt. Vì vậy, tôi cho rằng tất cả mọi thứ là ok với JCIFS và với mạng LAN của tôi, WiFi vv Đây là mã cho tập tin tải lên (thực sự tôi chỉ muốn viết một Sring văn bản đến một tập tin):Viết/tải lên một tập tin sử dụng vấn đề Samba/JCIFS (SmbAuthException: Truy cập bị từ chối)

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

Kể từ khi url được đăng nhập Tôi chắc chắn nó là chính xác (cũng tôi đã kiểm tra các url bằng cách sử dụng mã tôi đã đề cập ở trên và nó duyệt thư mục chứa).
Nhưng vấn đề là Im luôn nhận được cùng:

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

Cổ phiếu không phải là mật khẩu bảo vệ, vì vậy tôi không cần bất kỳ tên người dùng/mật khẩu để có thể truy cập. Tôi có thể đọc/ghi/xóa các tập tin từ một WinPC khác và không cần sự cho phép. Ngoài ra tôi đã cố gắng để tạo một mật khẩu cho người dùng trên WinPC với cổ phiếu nhưng kết quả là như nhau. Vì vậy, tôi đã thử một số phiên bản của NtlmPasswordAuthentication không có may mắn:

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

Vì vậy, những gì tôi làm sai và làm thế nào để đạt được mục tiêu của tôi khi không có auth là cần thiết để có được quyền truy cập vào thư mục chia sẻ?
BTW TV Samsung của tôi dựa trên Linux và sử dụng ứng dụng khách samba đang truy cập cùng một thư mục được chia sẻ mà không gặp vấn đề gì và phát MP3 từ đó (vâng, vâng, nó chỉ đọc). Vì thiết bị AOS của tôi đang truy cập mạng LAN của tôi qua WiFi (thay vì TV được kết nối qua Ethernet), tôi cũng đã kiểm tra quyền truy cập vào thư mục dùng chung máy tính xách tay + WiFi và không gặp vấn đề gì.
Added:
Tôi đang cố gắng hiện nay để thực hiện dòng sau:

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

và nhận được truy cập cùng bị từ chối. Tôi thậm chí không cố gắng để ghi file ...

Trả lời

10

OMG !!! Giải pháp rất đơn giản !!! Để truy cập vào mạng mà không được đăng nhập/mật khẩu bảo vệ và do đó không cần bất kỳ ủy quyền là không NtlmPasswordAuthentication.ANONYMOUS NHƯNG nó là:

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

chết tiệt nó không phải là rõ ràng!

+2

Bạn sẽ cần phải kích hoạt tài khoản khách trên cửa sổ trước khi thao tác này hoạt động. –

+1

Trong trường hợp của tôi, đó là WinXP và bạn không cần tài khoản khách để hoạt động để làm việc này (đã kiểm tra nó hai lần ngay bây giờ). Đối với Win7 nó có lẽ là như vậy. Win7 đã trở nên rất khó khăn để điều chỉnh nếu nói về mạng và đó là lý do chính tôi không thích nó so với XP. – Stan

2

thử với mã này

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

Ngoài ra kiểm tra xem bạn có chia sẻ các đường dẫn thư mục mà bạn đang truy cập. Ngoài ra, hãy kiểm tra xem đã cấp quyền ghi vào thư mục

+0

??? đây có phải là dòng mã được sao chép không? Vấn đề ở đây là gì? Viết quyền được đưa ra và chia sẻ thư mục không tồn tại thats cho chắc chắn – Stan

+0

thực sự xin lỗi về sai lầm của tôi. bạn có thể thử với mã này và cho tôi biết xin vui lòng – rwe

+0

ok. vì vậy tôi cho rằng sử dụng tên người dùng và mật khẩu trong dòng mã đầu tiên là gì? Như tôi đã đề cập trước đó, không cần xác thực nên không có người dùng và mật khẩu nào được đặt. – Stan

Các vấn đề liên quan