![]() |
| 起動直後 |
上記画面で、dir1 を選択すると、以下のように、/sdcard/dir1 内が表示されます
![]() |
| 1つ下に移動し、ファイル選択 |
最下段にある OK ボタンが Enable になります。
/sdcard 直下では表示されませんが、
/sdcard/dir1 など、/sdcard のサブ・ディレクトリでは上位ディレクトリに戻るために、
"...(上へ)" を表示&選択できるようにしています。
ちなみに、SDカードへの書き込みを行う際は、AndroidManifest.xml に、
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
を記述する必要があります。
以下はソースです。
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/current_dir" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ListView android:id="@+id/select_file" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="2" /> <TextView android:text="ファイル名:" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:id="@+id/file_text" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/ok_button" android:text="OK" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" /> </LinearLayout>
SdCardDisplayActivity.java
package jp.kochi;
import java.io.File;
import java.io.FileFilter;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class SdCardDisplayActivity extends Activity implements OnItemClickListener {
private ListView mListView;
private EditText mEditText;
private TextView mCurDirTextView;
private File mFile;
private String mWarning;
private String mGoUp;
private File mSDdir;
private Button mButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mCurDirTextView = (TextView) findViewById(R.id.current_dir);
mButton = (Button) findViewById(R.id.ok_button);
mButton.setEnabled(false);
mWarning = "警告";
mGoUp = ".. (上へ)";
//final File SDdir
mSDdir = Environment.getExternalStorageDirectory();
Log.v("DEBUG", "getExternalStorageDirectory() = " + mSDdir.getPath());
String SDstatus = Environment.getExternalStorageState();
Log.v("DEBUG", "getExternalStorageState() = " + SDstatus);
// SDカードがセットされているか確認
if (SDstatus.equals(Environment.MEDIA_MOUNTED) == false &&
SDstatus.equals(Environment.MEDIA_MOUNTED_READ_ONLY) == false) {
AlertDialog.Builder builder = new AlertDialog.Builder(SdCardDisplayActivity.this);
builder.setTitle(mWarning);
builder.setMessage("SDカードがセットされていません。");
builder.setPositiveButton("OK", new DialogInterface.OnClickListener () {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.v("DEBUG", "alerDialog - OnClickListener()");
SdCardDisplayActivity.this.finish();
}
});
builder.show();
Log.v("DEBUG", "finish: " + this.getClass().getName());
}
mListView = (ListView) findViewById(R.id.select_file);
mListView.setOnItemClickListener(this);
//list.setAdapter(new ListAdapter)
updateList(mSDdir);
Button select = (Button) findViewById(R.id.ok_button);
select.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(SdCardDisplayActivity.this, mEditText.getText(), Toast.LENGTH_LONG).show();
// --------------------------
// ファイル読込み等の処理を行う
// --------------------------
}
});
mEditText = (EditText) findViewById(R.id.file_text);
}
final private FileFilter filter = new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.isDirectory() == true) {
return true;
} else if(pathname.getName().endsWith(".xml") == true){
return true;
}
return false;
}
};
private void updateList(File dir){
// EditText に選択されたファイル名/フォルダ名をセット
mCurDirTextView.setText(dir.getAbsolutePath());
SimpleAdapter adapter = new SimpleAdapter(this, getData(dir.listFiles(filter), dir.getParentFile()),
android.R.layout.simple_list_item_1, new String[] { "name" },
new int[] { android.R.id.text1 });
mListView.setAdapter(adapter);
}
private List getData(File[] files, File parent) {
Map<String, Object> temp;
List<Map> myData = new ArrayList<Map>();
if (parent != null && mSDdir.getParent().equals(parent.getAbsolutePath()) == false) {
temp = new HashMap<String, Object>();
temp.put("name", mGoUp);
temp.put("file", parent);
myData.add(temp);
}
if (files != null) {
for(File file : files){
temp = new HashMap<String, Object>();
if (file.isDirectory()) {
temp.put("name", file.getName() + "/");
} else {
temp.put("name", file.getName());
}
temp.put("file", file);
myData.add(temp);
}
}
Collections.sort(myData, sDisplayNameComparator);
return myData;
}
private final static Comparator<Map> sDisplayNameComparator = new Comparator<Map>() {
private final Collator collator = Collator.getInstance();
public int compare(Map map1, Map map2) {
return collator.compare(map1.get("name"), map2.get("name"));
}
};
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Map map = (Map) arg0.getItemAtPosition(arg2);
mFile = (File) map.get("file");
mEditText.setText(mFile.getAbsolutePath());
if (mFile.isDirectory()) {
mButton.setEnabled(false);
updateList(mFile);
} else {
// ファイルだったら、ボタンを押せるようにする
mButton.setEnabled(true);
}
}
} 
