Android Open Source - android-MediaRescan Media Scanner Activity






From Project

Back to project page android-MediaRescan.

License

The source code is released under:

GNU General Public License

If you think the Android project android-MediaRescan listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package org.elwin.mediascanner;
//  w w  w  .  j  ava  2 s  .c om
import java.io.File;
import java.util.Arrays;

import android.app.Activity;
import android.media.MediaScannerConnection;
import android.net.Uri;
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.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MediaScannerActivity extends Activity {

  private static final String TAG = "MediaScannerActivity";
  private TextView mStatus;
  private EditText mPathView;
  private TextView mFailedView;
  private Button mScanBtn;
  private int mTotalSize;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_PROGRESS);
//    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setContentView(R.layout.activity_main);
    
    mPathView = (EditText) findViewById(R.id.path_view);
    mPathView.setText(Environment.getExternalStorageDirectory() + "/DCIM/Camera");
    mStatus = (TextView) findViewById(R.id.status);
    mFailedView = (TextView) findViewById(R.id.failed);
    mFailedView.append("Below are failed items: \n");
    mScanBtn = (Button) findViewById(R.id.scan_btn);
    mScanBtn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        startWork();
      }
    });
  }

//  @Override
//  public boolean onCreateOptionsMenu(Menu menu) {
//    // Inflate the menu; this adds items to the action bar if it is present.
//    getMenuInflater().inflate(R.menu.main, menu);
//    return true;
//  }
  
  private void startWork() {
    String filePath = mPathView.getText().toString().trim();
        File file=new File(filePath);
        final File[] files = file.listFiles();
        mTotalSize = files.length;
        Log.d(TAG, "in startWork, total size: " + mTotalSize);
        setTitle("total: " + mTotalSize);
        
        String[] filePaths = new String[files.length];
    for (int i = 0; i < files.length; ++i) {
      Log.d(TAG, "in startWork, file" + (i+1) + ": " + files[i].getPath());
      filePaths[i] = files[i].getPath();
    }
    
    mScanBtn.setEnabled(false);
    setProgressBarIndeterminate(true);
        scanByService(filePaths);
  }

  private void scanByService(final String[] paths) {
    if (paths == null || paths.length == 0) {
      Log.e(TAG, "in scanByService, paths have nothing");
      return;
    }
    
    String[] mimeTypes = new String[paths.length];
    Arrays.fill(mimeTypes, "image/jpeg");
    
    MediaScannerConnection.scanFile(this, paths, /*mimeTypes*/null, new MediaScannerConnection.OnScanCompletedListener() {
      @Override
      public void onScanCompleted(String path, Uri uri) {
        ++scannedCount;
        Log.d(TAG, "in onScanCompleted: path=" + path + " uri=" + uri + " scannedCount=" + scannedCount);
        mHandler.obtainMessage(MSG_SCANNED_COMPLETED, path).sendToTarget();
        if (uri == null) {
          mHandler.obtainMessage(MSG_SCANNED_FAILED, path).sendToTarget();;
        }

        if (path.equals(paths[paths.length-1]) && scannedCount != mTotalSize) {  // finished: for the bug, some item won't call this method
          Log.w(TAG, "in onScanCompleted: some item have not been scanned");
          scannedCount = mTotalSize;
          mHandler.obtainMessage(MSG_SCANNED_COMPLETED, path).sendToTarget();
        }
      }
    });
  }
  
  
  private int scannedCount;
  private static final int MSG_SCANNED_COMPLETED = 1;
  private static final int MSG_SCANNED_FAILED = 2;
  private Handler mHandler = new Handler(new  Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg) {
      switch (msg.what) {
      case MSG_SCANNED_COMPLETED:
        mStatus.setText("scanning(" + scannedCount + "): " + msg.obj);
        setProgressBarIndeterminate(false);
        setProgress( (int) (scannedCount/((float)mTotalSize) * 10000) );
        
        if (scannedCount == mTotalSize) {  //finished
          mScanBtn.setEnabled(true);
          setProgressBarVisibility(false);
          setTitle("total: " + mTotalSize + ". [scan finished]");
        }
        break;
      case MSG_SCANNED_FAILED:
        mFailedView.append(msg.obj + "\n");
        break;
      }
      
      return false;
    }
  });
}




Java Source Code List

org.elwin.mediascanner.MediaScannerActivity.java