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();
}
}
}