Android onActivityResult不被调用/触发

我读了很多关于onActivityResult的问题,但似乎没有任何描述的问题适合我的,比如在startActivityForResult或其他东西中放入一个否定的requestCode。

我正在使用我的“活动”中的相机进行操作,该function一直在捕捉来自networking摄像机的照片 如果我有我的SurfaceView中的内容,我closures凸轮释放其资源,setResult(RESULT_OK,DataIntent),并希望onActivityResult触发在我的父母。 但事实并非如此。 如果我在childActivity的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; } } 

Solutions Collecting From Web of "Android onActivityResult不被调用/触发"

确保传递给startActivityForResult(...)的number参数是> = 0

有同样的问题。 检查你的清单,并确保你没有使用单个实例:

 android:launchMode="singleInstance" 

我现在自己解决了我的问题。 放弃获取onActivityResult触发后,我决定通过将MainActivity的静态引用传递给CaptureActivity来“破解”Android封装,即使我知道这不是一个好主意。 完成()调用后,MAGICALLY onActivityResult被取消触发结果…正如所料,因为我不再调用setResult。 越来越onActivityResult触发我调查了为什么现在正在工作。 我发现,它与位图有关,传递给一个意图。 如果我把可包装的BitMap放到我的resultIntent中,onActivityResult永远不会被触发。 所以删除上面的代码中的以下行将工作:

 intent.putExtra(Config.SCAN_RESULT_BMP, barcode); 

这对我来说没问题,因为我不需要在这个Activity中真正使用BitMap。 这是一个“特征”而不是一个需要。 如果你们中的一些人想将大数据传递到像位图这样的Intent中,可以考虑将它存储在SD的某个地方,在Intent中传递path,同时在ParentActivity中从SD读取这个位图。

从活动中删除android:noHistory="true"我遇到了问题,为我解决了这个问题。

这一个的另一个变种。 从DialogFragment,你可以“startActivityForResult”。 但是,如果您的Intent是从关联的Activity启动的,则必须在startActivityForResult之前包含“getActivity()” 。 见下面(最后一行)。

 Activity activeOne=FileDialogWindow.this.getActivity(); Intent intent = new Intent(activeOne,FolderSelectionActivity.class); String message = "foobar"; intent.putExtra(EXTRA_MESSAGE, message); getActivity().startActivityForResult(intent,1); 

在我的情况下,它没有被触发,因为我已经添加标志Intent.FLAG_ACTIVITY_NEW_TASK同时创buildstartActivityForResult意图。 删除它解决了我的问题。

你以前的活动可能不完成? 尝试使用Log.d进行debugging,并查看logcat以查看调用堆栈是否实际到达CaptureActivity类中的finish()语句。

在我的情况下,扫描请求代码必须是IntentIntegrator.REQUEST_CODE

那是

startActivityForResult(intent, IntentIntegrator.REQUEST_CODE)

希望可以帮助你。