[Android]Sambaサーバからファイルを取得する

Windowsファイルサーバからファイルを読みたい

Android端末からWindowsで共有されているファイルを見たいんだ!

と、そんな案件が振り込んできました

WindowsということはSambaです
Androidでは標準でSambaには対応していないとのこと、、、

調べると、JCIFSというライブラリが利用できそう

JCIFSについて

Javaのライブラリです

下記URLからjarファイルをダウンロードしましょう
https://jcifs.samba.org/

今日時点の最新バージョンは「jcifs-1.3.18.jar」となっています
こいつをダウンロードして、プロジェクトに突っ込みましょう

AndroidStudio の場合、app/libsフォルダに突っ込みましょう

ちなみに、JCIFSはLGPLライセンスです
GNU Lesser General Public License – wikipedia

無料で使えるんですが、製品として販売するためにはソースコードの開示が必要です
っていうライセンス形態みたいです

なかなかつらめかも、、、

コーディング

兎にも角にも、実際に使ってみましょう

結構シンプルな感じです

public String getData(String _user, String _pass, String _server, String _path) {

        String user = _user;
        String pass = _pass;
        String server = _server;
        String path = _path;
        String smb = "smb://" + user + ":" + pass + "@" + server + "/" + path;

        String data = "";

        SmbFileInputStream sfis = null;
        try {
            sfis = new SmbFileInputStream(smb);
            BufferedReader br = new BufferedReader(new InputStreamReader(sfis));

            String str = br.readLine();
            while(str != null){
                System.out.println(str);
                data += str + System.getProperty("line.separator");
                str = br.readLine();
            }

        } catch (SmbException e) {
            e.printStackTrace();
            return e.getMessage();
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return e.getMessage();
        } catch (UnknownHostException e) {
            e.printStackTrace();
            return e.getMessage();
        } catch (IOException e) {
            e.printStackTrace();
            return e.getMessage();
        }

        return data;
    }

SmbFileInputStreamクラスのインスタンスを作ります
その際、SambaのURL(URI?)を与えてやります

smb:[ユーザ名]:[パスワード]@[サーバ]/[path]

という感じで指定します

うまくいくと、InputStreamとして読み込むことができます
実際に動かした結果こんな感じ

2016-07-25 08.34.14

text.txtの内容が綺麗に読めました

サンプルソース

サンプルのソースファイルを下記に置いてみました。

https://github.com/s-makinaga/AndroidSambaTest

SambaLoaderというClassを作っているので、簡単に使用できるようにしたつもりです
ひとまずReadOnlyなので、Write機能も実装したいなと考えています