package dk.thoerup.rescansdcard; import java.io.File; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.media.MediaScannerConnection; import android.media.MediaScannerConnection.MediaScannerConnectionClient; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; import android.widget.Spinner; import android.widget.TextView; public class RescanMain extends Activity { final static String TAG = "RescanSdcard"; Button scanBtn; TextView totalTv; TextView processedTv; Spinner targetSpinner; ProgressBar progress; MediaScannerConnection scan; int total = 0; int processed = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "onCreate"); setContentView(R.layout.main); scanBtn = (Button) findViewById(R.id.scan); scanBtn.setOnClickListener( new ScanListener() ); totalTv = (TextView) findViewById(R.id.total); processedTv = (TextView) findViewById(R.id.processed); targetSpinner = (Spinner) findViewById(R.id.target); progress = (ProgressBar) findViewById(R.id.progress); checkSdCard(); } void populateSpinner() { } boolean checkSdCard() { //check whether sdcard is mounted if ( ! Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ) { AlertDialog.Builder b = new AlertDialog.Builder(this); b.setMessage("SD-card is not currently mounted"); b.setPositiveButton("ok", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { RescanMain.this.finish(); } }); b.show(); return false; } else { return true; } } Handler updateHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); totalTv.setText("" + total); processedTv.setText("" + processed); progress.setMax(total); progress.setProgress(processed); if (processed == total) { scanBtn.setEnabled(true); targetSpinner.setEnabled(true); } else { updateHandler.sendEmptyMessageDelayed(0, 500); } } }; void findFilesRecursive(String path, List files) { Log.i(TAG, "scanRecursive " + path); File dir = new File(path); String entries[] = dir.list(); File nomedia = new File(dir.getPath() + "/.nomedia" ); if (nomedia.exists()) { Log.e(TAG, nomedia.getPath() + " exists, ignoring folder"); return; } for (String entry : entries) { if (entry.charAt(0) == '.') { Log.e(TAG, "ignore " + entry); continue; } File current = new File(dir.getPath() + "/" + entry); //Log.v(TAG, current.getPath()); if (current.isDirectory()) { findFilesRecursive(current.getPath(), files); } else { files.add(current.getPath()); } } } class FileEnqueuer extends AsyncTask { @Override protected Void doInBackground(Void... arg0) { List files = new ArrayList(); findFilesRecursive(Environment.getExternalStorageDirectory().getPath(), files); total = files.size(); updateHandler.sendEmptyMessage(0); for (String f : files) { scan.scanFile(f, null); } scan.disconnect(); scan = null; files.clear(); return null; } } class ScanListener implements OnClickListener { @Override public void onClick(View arg0) { if (checkSdCard() == true) { total = 0; processed = 0; scan = new MediaScannerConnection(RescanMain.this, new ScannerClient() ); scan.connect(); scanBtn.setEnabled(false); targetSpinner.setEnabled(false); } } } class ScannerClient implements MediaScannerConnectionClient { @Override public void onMediaScannerConnected() { Log.i(TAG, "scannerConnected"); new FileEnqueuer().execute(); } @Override public void onScanCompleted(String path, Uri uri) { //Log.v(TAG, "scanCompleted " + path + " " + uri); processed++; } } }