简体   繁体   中英

onActivityResult not calling in Fragment's

Hi I am new for android and in my app I am using Z-bar library for scanning barcode.

For this I am using ZbarScannerActivity class like below, so after scanning the barcode I am getting those barcode results where ever I want using onActivityResult method.

Here my problem is when I am scanning the barcode I want to get this result in my Fragment, but here onActivityResult not calling in my Fragment. But it's calling in my Activities please help me.

How can I solve this problem?

ZbarScanner Activity:-

public class ZBarScannerActivity extends ActionBarActivity {

    private Camera mCamera;
    private CameraPreview mPreview;
    private Handler autoFocusHandler;
    ImageScanner scanner;
    ImageView backButton;
    private boolean barcodeScanned = false;
    private boolean previewing = true;
    CustomTextview navigation_title;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scanner_view_layout);
        ActionBar actionBar = getSupportActionBar();
        String header = "<font color=\"#ffffff\">" + "BarCode Scanner"
                + " </font>";
        CommonUtils.actionbarHeader(this, actionBar, header);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        autoFocusHandler = new Handler();
        mCamera = getCameraInstance();

        /* Instance barcode scanner */
        scanner = new ImageScanner();
        scanner.setConfig(0, Config.X_DENSITY, 3);
        scanner.setConfig(0, Config.Y_DENSITY, 3);

        mPreview = new CameraPreview(this, mCamera, previewCb, autoFocusCB);
        FrameLayout preview = (FrameLayout) findViewById(R.id.cameraPreview);
        preview.addView(mPreview);

        navigation_title = (CustomTextview)findViewById(R.id.navigationTitle_id);
        navigation_title.setText("Barcode Scanner");

        backButton = (ImageView)findViewById(R.id.navigationbackbutton_id);
        backButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                finish();
            }
        });
    }

    static {

        System.loadLibrary("iconv");
    }

    public void onPause() {
        super.onPause();
        releaseCamera();
    }

    /** A safe way to get an instance of the Camera object. */
    public static Camera getCameraInstance() {
        Camera c = null;
        try {
            c = Camera.open();
        } catch (Exception e) {
        }
        return c;
    }

    private void releaseCamera() {
        if (mCamera != null) {
            previewing = false;
            mCamera.setPreviewCallback(null);
            mCamera.release();
            mCamera = null;
        }
    }

    private Runnable doAutoFocus = new Runnable() {
        public void run() {
            if (previewing)
                mCamera.autoFocus(autoFocusCB);
        }
    };

    PreviewCallback previewCb = new PreviewCallback() {

        public void onPreviewFrame(byte[] data, Camera camera) {
            Camera.Parameters parameters = camera.getParameters();
            Size size = parameters.getPreviewSize();

            Image barcode = new Image(size.width, size.height, "Y800");
            barcode.setData(data);

            int result = scanner.scanImage(barcode);

            if (result != 0) {
                previewing = false;
                mCamera.setPreviewCallback(null);
                mCamera.stopPreview();

                SymbolSet syms = scanner.getResults();
                for (Symbol sym : syms) {

                    System.out.println("------->"+sym.getData());
                    barcodeScanned = true;
                    finishActivivtyWithResult(sym.getData());
                }
            }
        }
    };

    // Mimic continuous auto-focusing
    AutoFocusCallback autoFocusCB = new AutoFocusCallback() {
        public void onAutoFocus(boolean success, Camera camera) {
            autoFocusHandler.postDelayed(doAutoFocus, 1000);
        }
    };

    /**
     *
     * @param barCodeResult
     */
    private void finishActivivtyWithResult(String barCodeResult){

        if (barCodeResult.contains("//b")) {

            String replacedString = barCodeResult.replace("//b", "");
            System.out.println("One========>" + replacedString);
            barCodeResult = replacedString;
        }
        if (barCodeResult.contains("/t")) {

            String replacedString = barCodeResult.replace("/t", "-");
            System.out.println("After========>" + replacedString);
            barCodeResult = replacedString;
        }

        Bundle conData = new Bundle();
        conData.putString("barCodeResult", barCodeResult);
        Intent intent = new Intent();
        intent.putExtras(conData);
        setResult(RESULT_OK, intent);
        finish();
    }

    @Override
    public boolean onSupportNavigateUp() {

        finish();
        return true;
    }
}

my fragment:-

 //Camera Button Action Event:-

    /**
     * @return
     */
    private View.OnClickListener cameraDetails() {

        return new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                BAR_CODE_SCANNER_CODE = 100;
                checkCameraPermission();

            }
        };
    }

    //BarCode Scanner Result:-

    private void checkCameraPermission() {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            checkManifestPermissionSets();
        } else {

            scanProductCode();
        }
    }

    @TargetApi(23)
    private void checkManifestPermissionSets() {

        int cameraPermission = ContextCompat.checkSelfPermission(getActivity(),
                Manifest.permission.CAMERA);

        List<String> permissions = new ArrayList<String>();

        if (cameraPermission != PackageManager.PERMISSION_GRANTED) {
            permissions.add(Manifest.permission.CAMERA);
        }

        if (!permissions.isEmpty()) {
            requestPermissions(
                    permissions.toArray(new String[permissions.size()]),
                    REQUEST_CODE_SOME_FEATURES_PERMISSIONS);

        } else {

            scanProductCode();
        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {

            case REQUEST_CODE_SOME_FEATURES_PERMISSIONS: {

                for (int i = 0; i < permissions.length; i++) {
                    if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                        //Log.d("Permissions", "Permission Granted: "+ permissions[i]);
                        scanProductCode();
                        break;
                    } else if (grantResults[i] == PackageManager.PERMISSION_DENIED) {

                        //Log.d("Permissions", "Permission Denied: " + permissions[i]);
                        //CommonUtils.showToastMessage(StockTransfer.this, "You've disabled the App required Permissions");
                        break;
                    }
                }
            }

            break;
            default: {
                super.onRequestPermissionsResult(requestCode, permissions,
                        grantResults);
            }
        }
    }


    private void scanProductCode() {

        if (isCameraAvailable()) {

            CommonUtils.showToastMessage(getActivity(),
                    "Please Scan Your Product BarCode");

            callThreadScannerActivity();

        } else {
            Toast.makeText(getActivity(), "Rear Facing Camera Unavailable",
                    Toast.LENGTH_SHORT).show();
        }
    }

    private void callThreadScannerActivity() {

        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                // dialog.dismiss();
                callScannerActivity();
            }
        }, 700);
    }


    // Call Scanner Activity:-

    private void callScannerActivity() {

        Intent intent = new Intent(getActivity(), ZBarScannerActivity.class);
        startActivityForResult(intent, BAR_CODE_SCANNER_CODE);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        System.out.println("result code------>" + requestCode);
    }

    private boolean isCameraAvailable() {

        PackageManager pm = getActivity().getPackageManager();
        return pm.hasSystemFeature(PackageManager.FEATURE_CAMERA);
    }
}

Simple logic connected to general life

activity : father(parent)

fragment : child

if child wanna money than he ask to him/ her father.

technical way if fragment(child) wanna data from onActivityResult it always VIA Activity(father) .

ohk .. lets look on code side

stuff at

yourActivity (Parent)

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    try {

        List<Fragment> fragments = getSupportFragmentManager().getFragments();
        if (fragments != null) {
            for (Fragment fragment : fragments) {
                fragment.onActivityResult(requestCode, resultCode, data);
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

this list of fragment(child) of activity said to him activity(father) for data

when activity received data it gives as fragments(childs) demands.

In fragment whenever we start activity for any result then that result in received in onActivityResult of activity then we have to pass this result to fragment's onActivityResult Write this to your activitys's onActivityResult

  @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Logg.e("RESULT ", " " + resultCode);
    if (resultCode != RESULT_OK)
        return;
    switch (requestCode) {
        case 100:
            Fragment YourRfargment= getFragmentManager().findFragmentByTag("Your Fragment TAG");
            updateproFragment.onActivityResult(requestCode, resultCode, data);
            break;
          }    
     }

by this you will get your result in fragment's onActivityresult.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM