10

AndroidデバイスからWindows共有フォルダーにファイルを書き込もうとしています。私は最新バージョンの JCIFS を使用しており、利用可能なネットワーク共有を表示するコードは正常に動作します。したがって、JCIFS と LAN、WiFi などはすべて問題ないと思います。ファイル アップロードのコードは次のとおりです (実際には、テキスト Sring をファイルに書き込みたいだけです)。

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

では、共有フォルダーへのアクセスに認証が必要ない場合に、何が間違っているのか、どのように目標を達成するのですか?
Linuxベースでsambaクライアントを使用している私のSamsung TVは問題なく同じ共有フォルダにアクセスしており、そこからMP3を再生しています(そうです、読み取り専用です)。私の AOS デバイスは (イーサネット経由で接続されているテレビの代わりに) WiFi 経由で LAN にアクセスしているため、ノートブック + WiFi を使用して共有フォルダーへのアクセスも確認しましたが、問題は見つかりませんでした。
追加:
次の行を実行しようとしています:

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

同じアクセスが拒否されます。私はファイルを書き込もうとしていません...

4

2 に答える 2

12

ああ、神様!!!解決策はとても簡単でした!!! ログイン/パスワードで保護されていないため、認証を必要としないネットワークにアクセスするには、NtlmPasswordAuthentication.ANONYMOUS ではありませんが、次のようになります。

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

いまいましい、それはそれほど明白ではありませんでした!

于 2013-02-27T18:08:43.823 に答える
2

このコードで試してください

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

また、アクセスしているフォルダー パスを共有していることも確認してください。また、フォルダに書き込み権限が付与されていることを確認してください

于 2013-02-13T11:33:14.047 に答える