スマートフォンからSAMBAストレージに接続してファイル・フォルダの一覧を表示して、フォルダならその中を一覧表示、ファイルならチェックボックスで選択するサンプルコードです。

サンプル

app/libs

                    
                // libsに登録
jcifs-1.3.18.jar

activity_main.xml

    
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:tools="http://schemas.android.com/tools"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	tools:context=".MainActivity">

	<ListView android:id="@+id/listview"
			android:layout_width="fill_parent"
			android:layout_height="fill_parent"
			android:choiceMode="multipleChoice"/>
</LinearLayout>

MainActivity.java

					
public class MainActivity extends AppCompatActivity {
	ListView listView;
	SambaListCreate sambaListCreatetask;
	String folder;
	String aFolder;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// リストビュー設定
		listView = (ListView) this.findViewById(R.id.listview);
		listView.setItemsCanFocus(false);
		//選択モードを指定する
		listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

		folder = getString(R.string.samba_path);
		aFolder = folder;
		// SAMBA接続して、フォルダー・ファイルの一覧を作成する。
		sambaListCreatetask = new SambaListCreate(this, listView, getString(R.string.ip_address), getString(R.string.login_name), getString(R.string.login_pass), folder, "");
		sambaListCreatetask.execute("Param1");
		listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
				// 選択アイテムを取得
				ListView alistView = (ListView) parent;
				String item = (String) alistView.getItemAtPosition(pos);

				// フォルダの時
				if (item.indexOf("/") != -1) {
					// フォルダを下がる時
					if (item.indexOf("../") != -1) {
						// フルパスの/で分割する。
						String[] buff = aFolder.split("/", 0);
						// 1つ下がるので、/の数の1つ前までのパスを作成する。
						for (int i = 0; i < (buff.length - 1); i++) {
							if (i == 0) {
								aFolder = folder;
							} else {
								aFolder = aFolder + "/" + buff[i];
							}
						}
					} else {
						// フルパスに指定フォルダを設定する。
						aFolder = aFolder + "/" + item;
					}
					// SAMBA接続して、フォルダー・ファイルの一覧を作成する。
					sambaListCreatetask = new SambaListCreate(MainActivity.this, listView, getString(R.string.ip_address), getString(R.string.login_name), getString(R.string.login_pass), aFolder, "");
					sambaListCreatetask.execute("Param1");
				}
			}
		});


	}
}
					

SambaFileInfo.java

    
/**
* sambaファイル情報クラス
*/
public class SambaFileInfo {
	public String name;
	public String type;
	public File file;

	public SambaFileInfo(String s, String d, File f) {
		this.name = s;
		this.type = d;
		this.file = f;
	}
	public String getName() { return this.name; }
	public void setName(String nm) { this.name = nm; }
	public String getType() { return this.type; }
	public void setType(String tp) { this.type = tp; }
	public File getFile() { return this.file; }
	public void setFile(File fl) { this.file = fl; }
}

SambaFileInfo.java

    
/**
 * samba接続先のフォルダ・ファイルリスト生成
 */
public class SambaListCreate extends AsyncTask<String, Integer, ArrayList<SambaFileInfo>> implements DialogInterface.OnCancelListener {
    final String TAG = "SambaListCreateTask";
    private ListView listView;
    private Activity uiActivity;
    private String ipadd;
    private String name;
    private String pass;
    private String path;
    private String g_ext;
    AlertDialog.Builder alertDialog;
    ArrayList<SambaFileInfo> g_smbInfo;


    public SambaListCreate(Activity ac, ListView lv, String ip, String nm, String ps, String pt, String ext) {
        super();
        uiActivity = ac;    // アクティビティ
        listView = lv;  // ListView
        ipadd = ip;     // IPアドレス
        name = nm;      // ログインID
        pass = ps;      // ログインパスワード
        path = pt;      // パス
        g_ext = ext;    // 拡張子
        alertDialog = new AlertDialog.Builder(ac);  // ネットワーク接続エラーダイアログ定義

        alertDialog.setTitle("SAMBA接続エラー");      //タイトル設定
        alertDialog.setMessage("SAMBA 接続への設定を確認ください。");  //内容(メッセージ)設定

        // OK(肯定的な)ボタンの設定
        alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
            }
        });

        g_smbInfo = new ArrayList<SambaFileInfo>();
        g_smbInfo.clear();

    }

    @Override
    protected void onPreExecute() {
        Log.d(TAG, "onPreExecute");
    }


    @Override
    protected ArrayList<SambaFileInfo> doInBackground(String... params) {
        Log.d(TAG, "doInBackground - " + params[0]);

        g_smbInfo = new ArrayList<SambaFileInfo>();
        String[] barr = path.split("/", 0);
        if (barr.length != 1) {
            g_smbInfo.add(new SambaFileInfo("../", "d", null));
        }
        try {
            // SAMBA接続
            NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(name + ":" + pass);
            SmbFile dir = new SmbFile("smb://" + ipadd + "/" + path + "/", auth);
            // フォルダが存在しない時
            if (!dir.exists()) {
                g_smbInfo.add(new SambaFileInfo("SmbError", "SmbError", null));
            } else {
                //ファイル一覧セット
                SmbFile[] files = dir.listFiles();
                for (int i = 0; i < files.length; i++) {
                    String ext = "";
                    ext = g_ext.trim();
                    String extStr = "." + ext;
                    if (files[i].isDirectory() == false) {
                        if (ext.length() != 0) {
                            if (files[i].getName().endsWith(extStr) == true) {
                                // 拡張子特定ファイル設定
                                g_smbInfo.add(new SambaFileInfo(files[i].getName(), "f", null));
                            }
                        } else {
                            // ファイル設定
                            g_smbInfo.add(new SambaFileInfo(files[i].getName(), "f", null));
                        }
                    } else {
                        // フォルダ設定
                        g_smbInfo.add(new SambaFileInfo(files[i].getName(), "d", null));
                    }

                }
            }
        } catch (Exception e) {
            // エラー時
            g_smbInfo.add(new SambaFileInfo("SmbError", "SmbError", null));
            e.printStackTrace();
        }
        return g_smbInfo;
    }

    @Override
    protected void onPostExecute(ArrayList<SambaFileInfo> result) {
        Log.d(TAG, "onPostExecute - " + result);
        List<String> items = new ArrayList<String>();
        for (int i = 0; i < result.size(); i++) {
            // 接続エラー時
            if (result.get(i).getType() == "SmbError") {
                alertDialog.show();
                return;
            }
            // ファイル・フォルダ名設定
            items.add(result.get(i).getName());
        }
        new CollectionsSortSample().sortMyDto(result);
        items.clear();
        for (int i = 0; i < result.size(); i++) {
            items.add(result.get(i).getName());
        }
        // フォルダ・ファイル名のListViewへの設定
        ArrayAdapter<String> adapter;
        adapter = new ArrayAdapter<String>(uiActivity, android.R.layout.simple_list_item_multiple_choice, items);
        listView.setAdapter(adapter);
    }

    /**
     * Collections#Sort
     */
    public class CollectionsSortSample {
        /**
         * MyDtoリストをdata1-data2-data3の昇順にソートする
         *
         * @param dtoList
         */
        public void sortMyDto(List<SambaFileInfo> dtoList) {
            Collections.sort(dtoList, new Comparator<SambaFileInfo>() {
                public int compare(SambaFileInfo o1, SambaFileInfo o2) {
                    int comp = compareString(o1.getType(), o2.getType());
                    if (comp != 0) {
                        return comp;
                    }
                    comp = compareString(o1.getName(), o2.getName());
                    if (comp != 0) {
                        return comp;
                    }
                    return 0;
                }

                private int compareString(String s1, String s2) {
                    if (s1 == null && s2 == null) return 0;
                    else if (s1 == null) return -1;
                    else if (s2 == null) return 1;
                    else return s1.compareTo(s2);
                }
            });
        }
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        Log.d(TAG, "Dialog onCancell... calling cancel(true)");
        this.cancel(true);
    }

}

AndroidManifest.xml

    
<uses-permission android:name="android.permission.INTERNET" />