スマートフォンから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" />