gpt4 book ai didi

Android onActivityResult 未调用/触发

转载 作者:IT老高 更新时间:2023-10-28 22:00:00 25 4
gpt4 key购买 nike

我阅读了很多关于 onActivityResult 问题的信息,但似乎没有一个所描述的问题适合我,例如在 startActivityForResult 或其他内容中放置一个否定的 requestCode。

我正在使用我的 Activity 中的相机,它将其预览流式传输到 SurfaceView。拍照后,我关闭凸轮释放其资源,调用 setResult(RESULT_OK, DataIntent) 并希望 onActivityResult 在我的 parent 中触发。

但事实并非如此。如果我在子 Activity 的 onCreate 中设置结果并在 onCreate 中完成子,则结果不会传递给 onActivityResult。

onActivityResult 没有被触发的可能原因是什么?我会写下我的一些来源,以了解我在做什么......

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

private Size getOptimalPreviewSize(List<Size> sizes, int width, int height) {
final double ASPECT_TOLERANCE = 0.05;
double targetRatio = (double) width / height;

if (sizes == null) return null;
Size optimalSize = null;
double minDiff = Double.MAX_VALUE;

int targetHeight = height;

for (Size size: sizes) {
double ratio = (double) size.width / size.height;
if(Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) {
continue;
}

if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}

if (optimalSize == null) {
//cannot find matching aspect-ratio
minDiff = Double.MAX_VALUE;
for (Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
}

最佳答案

确保传递给 startActivityForResult(...) 的数字参数 (requestCode) 为 >=0

关于Android onActivityResult 未调用/触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5019711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com