Hi,
I have basically 2 Activitys. The first Activity calls second Activity
by startActivityForResult() with an int > 0 as requestCode. Second
Activity handles my Camera picking preview pictures with
setOneShotPreviewCallback().
if I have the desired picture, I but data into an Bundle, put this
bundle as extras into an Intent and call
setResult(RESULT_FIRST_USER, extraIntent);
finish();
but onActivityResult never gets triggered.
I put interesting Code below:
public class MainActivity extends Activity {

Button mButtonScan;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mButtonScan = (Button)findViewById(R.id.main_btn_scan);
}

/**
 * OnClick Event called from main.xml
 * @param v View that called that onClickEvent
 */
public void btnCaptureClick(View v){
    Intent intent = new Intent(this, CaptureActivity.class);
    startActivityForResult(intent, Constants.REQUEST_CODE_CAPTURE);

}

/**
 * callback for this Activity. Called when an Activity which was
started by
 * this.startActivityForResult(intent, requestCode) sets its result
and calls finish()
 */
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
    String foo = "foo";
    switch (requestCode) {
    case Constants.REQUEST_CODE_CAPTURE:
        switch (resultCode) {
        case RESULT_FIRST_USER:
            Toast.makeText(this,
data.getStringExtra(Config.SCAN_RESULT_TEXT),
Toast.LENGTH_LONG).show();
            break;
        case RESULT_CANCELED:

            break;
        default:
            break;
        }
        break;

    default:
        super.onActivityResult(requestCode, resultCode, data);
        break;
    }

}
}


public class CaptureActivity extends Activity
implements ActivityCallback , SurfaceHolder.Callback, PreviewCallback{

private Preview mPreview;
private Camera mCam;
private SurfaceHolder mHolder;
private Size size;


protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.capture);

    mPreview = (Preview)findViewById(R.id.capture_preview);
}

@Override
public void onValidDecodeResult(Result rawResult, Bitmap barcode) {
    Intent intent = new Intent();
    if (rawResult != null && barcode != null){

        intent.putExtra(Config.SCAN_RESULT_TEXT, rawResult.getText());
        intent.putExtra(Config.SCAN_RESULT_FORMAT,
rawResult.getBarcodeFormat().getName());
        intent.putExtra(Config.SCAN_RESULT_BMP, barcode);
    } else {
        intent.putExtra(Config.SCAN_RESULT_TEXT, "foo");
        intent.putExtra(Config.SCAN_RESULT_FORMAT, "bar");
        intent.putExtra(Config.SCAN_RESULT_BMP, "barcode");
    }
    mPreview = null;
    setResult(Activity.RESULT_FIRST_USER, intent);
    finish();
}

@Override
public void onPreviewFrame(byte[] data, Camera camera) {
    MultiFormatReader reader = new MultiFormatReader();
    PlanarYUVLuminanceSource source = new
PlanarYUVLuminanceSource(data, size.width, size.height, 160, 60, 480,
360);
    GlobalHistogramBinarizer binarizer = new
GlobalHistogramBinarizer(source);
    BinaryBitmap bb = new BinaryBitmap(binarizer);
    Result result = null;
    try {
        result = reader.decode(bb);
    }catch (NotFoundException e) {
        //do NOTHING cause e == null
    }catch (Exception e){
        e.printStackTrace();
    } finally {
        reader.reset();
    }
    if (result != null){
        mCam.stopPreview();
        releaseCameraResources();
        onValidDecodeResult(result,
source.renderCroppedGreyscaleBitmap());
    } else {
        camera.setOneShotPreviewCallback(this);
    }
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    try {
        mCam = Camera.open();
        mCam.setPreviewDisplay(mPreview.getHolder());
    } catch (IOException e) {
        releaseCameraResources();
        e.printStackTrace();
    }

}

private void releaseCameraResources(){
    mCam.release();
    mCam = null;
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int
width,
        int height) {
    //begin Preview
    Camera.Parameters parameters = mCam.getParameters();

    List<Size> sizes = parameters.getSupportedPreviewSizes();

    size = getOptimalPreviewSize(sizes, width, height);
    parameters.setPreviewSize(size.width, size.height);

    mCam.setParameters(parameters);
    mCam.startPreview();
    mCam.setOneShotPreviewCallback(this);
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    if (mCam != null){
        mCam.stopPreview();
        releaseCameraResources();
    }
}
}

the class Preview extends SurfaceView...
If someone of You needs additional Information I'll try to give it.
so far I can say that I put breakpoints to setResult() and finish() to
ensure that they get called. They get called.
onActivityResult() is called if I setResult() in onCreate() of
CaptureActivity and call finish() that early. If I debug deep into
Android source I found out that onActivityResult is called by a
Message with msg.what == 108 (I think to remember) internally. This
Message is never send in the code above and I could't find out, who os
responsible for firing this message. They appear 'magically' in the
Handler in queue.next. Maybe I can 'hack' myself into Android system
and fire this Message myself.
Any other ideas, workarounds, opinions are welcome

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to