tags:

views:

38

answers:

0

Hi all,

I have setUp an observer which gets called when a new image is captured by Camera.

I have two problems, 1) onChange is getting called three times, when i capture one image 2) Is it possible to get the Uri which caused this update. 3) How do i get the row number (media Id), if a row is deleted.

Please find my code below

public class PhotoCaptureExample extends Activity {
protected Button _button;
protected ImageView _image;
protected TextView _field;
protected String _path;
protected boolean _taken;

private Handler handler = new Handler();

protected static final String PHOTO_TAKEN = "photo_taken";
private static final String TAG = "MakeMachine";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    _image = (ImageView) findViewById(R.id.image);
    _field = (TextView) findViewById(R.id.field);
    _button = (Button) findViewById(R.id.button);
    _button.setOnClickListener(new ButtonClickHandler());

    _path = Environment.getExternalStorageDirectory()
            + "/images/make_machine_example.jpg";

    registerForUriChange();
}

public class ButtonClickHandler implements View.OnClickListener {
    public void onClick(View view) {
        Log.i("MakeMachine", "ButtonClickHandler.onClick()");
        startCameraActivity();
    }
}

protected void startCameraActivity() {
    Log.i("MakeMachine", "startCameraActivity()");
    File file = new File(_path);
    Uri outputFileUri = Uri.fromFile(file);

    // Intent intent = new
    // Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE );
    Intent intent = new Intent(
            android.provider.MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);

    // intent.putExtra( MediaStore.EXTRA_OUTPUT, outputFileUri );

    startActivityForResult(intent, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.i("MakeMachine", "resultCode: " + resultCode);
    switch (resultCode) {
    case 0:
        Log.i("MakeMachine", "User cancelled");
        break;

    case -1:
        Log.d("MakeMachine", "User took photo");
        onPhotoTaken();
        break;
    }
}

protected void onPhotoTaken() {
    Log.i("MakeMachine", "onPhotoTaken");

    _taken = true;

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 4;

    Bitmap bitmap = BitmapFactory.decodeFile(_path, options);

    _image.setImageBitmap(bitmap);

    _field.setVisibility(View.GONE);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    Log.i("MakeMachine", "onRestoreInstanceState()");
    if (savedInstanceState.getBoolean(PhotoCaptureExample.PHOTO_TAKEN)) {
        onPhotoTaken();
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putBoolean(PhotoCaptureExample.PHOTO_TAKEN, _taken);
}

void registerForUriChange() {

    ContentResolver imageContentRsr = getContentResolver();
    Uri mediaUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    Log.d(TAG, "The Encoded path of the media Uri is "
            + mediaUri.getEncodedPath());
    CustomContentObserver custObser = new CustomContentObserver(handler);
    imageContentRsr.registerContentObserver(mediaUri, false, custObser);
}

class CustomContentObserver extends ContentObserver {

    private final String LOG_TAG = CustomContentObserver.class
            .getSimpleName();

    public CustomContentObserver(Handler handler) {
        super(handler);

    }

    @Override public boolean deliverSelfNotifications() { 
        return false; 
        }

    public void onChange(boolean selfChange) {

        super.onChange(selfChange);

        Log.d(LOG_TAG, "StringsContentObserver.onChange( " + selfChange
                + ")");

          Message msg = new Message(); 
          msg.obj = "xxxxxxxxxx";

          handler.sendMessage(msg);

        getAllRows();

    }

    private void getAllRows() {
        String[] projection = new String[] {
                Media._ID,
                Media.BUCKET_DISPLAY_NAME,
                Media.BUCKET_ID,
                Media.DATA,
                Media.DISPLAY_NAME,
                Media.TITLE,
                Media.DISPLAY_NAME
      };

      Cursor managedCursor = getContentResolver().query( 
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    projection, 
                    null,
                    null,
                    null );
      int iDColumn = managedCursor.getColumnIndex( Media._ID );
      int dispNameColumn = managedCursor.getColumnIndex( Media.BUCKET_DISPLAY_NAME );
      int pathNameColumn = managedCursor.getColumnIndex( Media.DATA ); 
      int pathNameColumn2 = managedCursor.getColumnIndex( Media.DISPLAY_NAME );


      managedCursor.moveToLast();
      Log.d(LOG_TAG, "Id is " + iDColumn + dispNameColumn);
        String simpletext = managedCursor.getString( iDColumn );
        Log.d( LOG_TAG, "Id is : "+ managedCursor.getString( iDColumn ) + "display name" + managedCursor.getString( dispNameColumn )+ 
                "path is " + managedCursor.getString( pathNameColumn ) + 
                "display name " + managedCursor.getString( pathNameColumn2 ));

      managedCursor.close();

    }
}

}