исключение нулевого указателя при onActivityResult - PullRequest
0 голосов
/ 06 января 2019

У меня есть действие, в котором есть комбинация Tablayout + Viewpager, вместе они содержат четыре фрагмента, из которых в одном фрагменте я открываю камеру, используя Intent и анализируя результаты там.

Иногда, когда я анализирую результаты на ActivityResults, я получаю NullPointerException

Вот код

public class CheckInFragment extends BaseFragment implements CheckInPresenterView {

    private CameraIntegrator cameraIntegrator;

    private ImageCallback cameraResultCallback = new ImageCallback() {
        @Override
        public void onResult(int requestedBy, Result result) {

            if (requestedBy == RequestSource.SOURCE_CAMERA) {
                ...
            }
        }
    };


    private void openCamera() {

        // Permission Check Shifted To Attendance Activity
        if (cameraIntegrator == null) {
            cameraIntegrator = new CameraIntegrator(this);
            cameraIntegrator.setImageDirectoryName(GlobalConstants.IMAGE_FOLDER_NAME);
            cameraIntegrator.setRequiredImageSize(ImagesSizes.OPTIMUM_MEDIUM);
        }

        try {
            cameraIntegrator.initiateCapture();
        } catch (NoCameraAppFoundException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onActivityResult(final int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == CameraIntegrator.REQUEST_IMAGE_CAPTURE)
                cameraIntegrator.parseResults(requestCode, resultCode, data, cameraResultCallback); //Null Pointer Exception here sometimes
        }
    }
}

Crashlytics Log:

Fatal Exception: java.lang.RuntimeException: Unable to resume activity {com.xxx.AttendanceActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65537, result=-1, data=null} to activity {com.xxx.AttendanceActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.xxx.CameraIntegrator.parseResults(int, int, android.content.Intent, com.xxx.camera.ImageCallback)' on a null object reference
       at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3513)

Может кто-нибудь объяснить, почему я получаю cameraIntegrator null иногда?

Это потому, что этот код в родительской активности?

    ViewPagerGeneralAdapter viewPagerAdapter = setupViewPager(viewPager);
    tabLayout.setupWithViewPager(viewPager);

    viewPager.setOffscreenPageLimit(viewPagerAdapter.getCount()); <---

А как мне воспроизвести эту ошибку?

1 Ответ

0 голосов
/ 06 января 2019

Вместо этого инициализируйте ваш cameraIntegrator в ваших фрагментах onResume(). Проблема в том, что если ваш фрагмент воссоздан (например, при возврате из другого действия), ваш метод openCamera() может не вызываться и, следовательно, cameraIntegrator никогда не будет инициализирован и будет иметь значение null.

Попробуйте это.

@override
public void onResume(){
    super.onResume();
    initializeCameraIntegrator();
}


private void initializeCameraIntegrator(){
    if (cameraIntegrator == null) {
        cameraIntegrator = new CameraIntegrator(this);
        cameraIntegrator.setImageDirectoryName(GlobalConstants.IMAGE_FOLDER_NAME);
        cameraIntegrator.setRequiredImageSize(ImagesSizes.OPTIMUM_MEDIUM);
    }
}

private void openCamera() {
    try {
        cameraIntegrator.initiateCapture();
    } catch (NoCameraAppFoundException e) {
        e.printStackTrace();
    }
}
...