Как исправить 'FATAL EXCEPTION' при передаче байтового массива между Activity с помощью Intent? - PullRequest
0 голосов
/ 01 января 2019

Я получаю следующую ошибку при передаче байтового массива от одного действия другому через намерение.Я не уверен, что это потому, что массив слишком большой, или что-то еще.Вот ошибка:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.roshan.android.picscheduler, PID: 19689
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.roshan.android.picscheduler/com.roshan.android.picscheduler.ImageDetectActivity}: java.lang.NullPointerException: Attempt to get length of null array
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2955)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6938)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
 Caused by: java.lang.NullPointerException: Attempt to get length of null array
    at com.roshan.android.picscheduler.ImageDetectActivity.onCreate(ImageDetectActivity.java:40)
    at android.app.Activity.performCreate(Activity.java:7183)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2908)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696) 
    at android.os.Handler.dispatchMessage(Handler.java:105) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6938) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) 

В основной активности у меня есть этот код:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);

    mCameraView.setCameraListener(new CameraKitView.CameraListener() {
        @Override
        public void onOpened() {

        }

        @Override
        public void onClosed() {

        }
    });

    mCameraButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {

            mCameraView.captureImage(new CameraKitView.ImageCallback() {
                @Override
                public void onImage(CameraKitView cameraKitView, byte[] bytes) {
                    imageBytes = bytes;

                }
            });



            Intent intent = new Intent(MainActivity.this.getApplicationContext(), ImageDetectActivity.class);
            intent.putExtra("CapturedImage", imageBytes);
            intent.putExtra("width", mCameraView.getWidth());
            intent.putExtra("height", mCameraView.getHeight());
            startActivity(intent);

            //TODO: Launch new activity, pass the bitmap
            // Maybe use Fragments instead of new activity?
        }
    });
}

В методе onCreate целевой деятельности у меня есть это:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_image_detect);

    intent = getIntent();
    imageBytes = intent.getByteArrayExtra("CapturedImage");
    cameraWidth = intent.getIntExtra("width", 0);
    cameraHeight = intent.getIntExtra("height", 0);

    bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
    bitmap = Bitmap.createScaledBitmap(bitmap, cameraWidth, cameraHeight, false);

    image = FirebaseVisionImage.fromBitmap(bitmap);
    detector = FirebaseVision.getInstance().getOnDeviceTextRecognizer();

    result = detector.processImage(image)
            .addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() {
                @Override
                public void onSuccess(FirebaseVisionText firebaseVisionText) {
                    String resultText = firebaseVisionText.getText();
                    Log.d("TEST", resultText);
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {

                }
            });
}

Ошибка выдается, как только я пытаюсь декодировать байтовый массив, что, как я предполагаю, означает, что он получает нулевой массив.

Ответы [ 2 ]

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

Этот обратный вызов

mCameraView.captureImage(new CameraKitView.ImageCallback() {
    @Override
    public void onImage(CameraKitView cameraKitView, byte[] bytes) {
        imageBytes = bytes;
    }
});

называется асинхронным.Это означает, что если вы хотите добавить байты в намерение, вам нужно переместить код намерения в этот обратный вызов.

Полный вызов onClick должен быть изменен на следующее:

mCameraButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {

        mCameraView.captureImage(new CameraKitView.ImageCallback() {
            @Override
            public void onImage(CameraKitView cameraKitView, byte[] bytes) {
                imageBytes = bytes;

                Intent intent = new Intent(MainActivity.this.getApplicationContext(), ImageDetectActivity.class);
                intent.putExtra("CapturedImage", imageBytes);
                intent.putExtra("width", mCameraView.getWidth());
                intent.putExtra("height", mCameraView.getHeight());
                startActivity(intent);
            }
        });
    }
});

Это может решить вашу проблему с передачей байта к следующему действию, но этот код также может вызвать задержку между пользовательским взаимодействием (щелчком) и «вещами», происходящими в пользовательском интерфейсе, так что пользователь будет чувствовать отставание.Вы должны подумать об улучшении этого (но это выходит за рамки этого вопроса)

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

Ошибка возникает из-за того, что байтовый массив, который вы получаете от намерения , равен нулю.

Возможные причины:

1. Выпередал нулевой байтовый массив из исходного Activity.

2. Вы не использовали точно такую ​​же строку при добавлении дополнительного значения к намерению, а затем получили его обратно из намерения.

Я бы предложил отладку вашего кода, большая часть NullPointerExceptions может быть решена с помощью простой отладки.

...