startActivityForResult возвращает неправильную активность

Я работаю над приложением, которое использует пользовательскую камеру (с Surfaceview и т. д.), я использую startActivityForResult из моего ObjectActivity, чтобы перейти к действию с камерой с именем CameraActivity. Это происходит в этом методе.

public void addPicture(View v) {
    final CharSequence[] items = { "Take Photo", "Choose from Gallery", "Cancel" };
    AlertDialog.Builder builder = new AlertDialog.Builder(ObjectActivity.this);
    builder.setTitle("Add Photo!");
    builder.setItems(items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int item) {
            if (items[item].equals("Take Photo")) {
                executeOnResume = false;
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                    int hasWriteExternalStoragePermission = checkSelfPermission(Manifest.permission.CAMERA);
                    if (hasWriteExternalStoragePermission != PackageManager.PERMISSION_GRANTED) {
                        requestPermissions(new String[]{Manifest.permission.CAMERA},
                                REQUEST_CODE_ASK_PERMISSIONS);
                    }
                }
                Intent intent = new Intent(ObjectActivity.this,CameraActivity.class);
                startActivityForResult(intent, REQUEST_CAMERA);
            } else if (items[item].equals("Choose from Gallery")) {
                executeOnResume = false;
                Intent intent = new Intent(
                        Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                intent.setType("image/*");
                startActivityForResult(
                        Intent.createChooser(intent, "Select File"),
                        REQUEST_SELECT_FILE);
            } else if (items[item].equals("Cancel")) {
                dialog.dismiss();
            }
        }
    });
    builder.show();
}

Чтобы быть более конкретным, это происходит в этих строках:

Intent intent = new Intent(ObjectActivity.this,CameraActivity.class);
startActivityForResult(intent, REQUEST_CAMERA);

Это работает довольно хорошо, но когда я пытаюсь вернуться к ObjectActivity после того, как сделал снимок, что происходит здесь:

Camera.PictureCallback mPicture = new Camera.PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        //TODO Code to process picture taken
        //create a new intent...
        Intent intent = new Intent();
        intent.putExtra("data",data);
        //close this Activity...
        setResult(Activity.RESULT_OK, intent);
        finish();
    }
};

Он возвращается к активности, предшествующей ObjectActivity, с именем MainActivity, в то время как предполагается вернуться к ObjectActivity и вызвать onActivityResult() :

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    executeOnResume = false;
    loadStuff();
    if (resultCode == RESULT_OK) {
        if (requestCode == REQUEST_CAMERA || requestCode == REQUEST_SELECT_FILE) {
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
            alertDialog.setTitle("Description");
            alertDialog.setMessage("Enter Description");
            final EditText input = new EditText(this);
            alertDialog.setView(input);
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.MATCH_PARENT);
            input.setLayoutParams(lp);
            alertDialog.setView(input);
            alertDialog.setPositiveButton("Ok",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            description = input.getText().toString();
                            if (description == null || description.equals("")) {
                                description = "-";
                            }
                            try {
                                savePhoto(requestCode,data);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    });
            final AlertDialog.Builder tmpDialog = alertDialog;

            final AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this);
            dlgAlert.setTitle("Direction");
            dlgAlert.setMessage("Stand with your phone facing the same direction as the picture made and press Ok");
            dlgAlert.setPositiveButton("Ok",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            mBearingProvider.updateBearing();
                            bearing = mBearingProvider.getBearing();
                            cardinalDirection = bearingToString(bearing);
                            Log.e("Direction", cardinalDirection + "," + bearing);
                            tmpDialog.create().show();
                            dialog.dismiss();
                        }
                    });
            dlgAlert.setNegativeButton("Cancel",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            tmpDialog.create().show();
                        }
                    });
            dlgAlert.create().show();
        }
    }
}

Но до этого никогда не доходит. кто-нибудь знает, почему это произошло?


person Dennis van Opstal    schedule 11.03.2016    source источник
comment
Используете ли вы GroupActivity?   -  person Dinash    schedule 11.03.2016
comment
ObjectActivity и CameraActivity являются обычными действиями, а MainActivity — это AppCompatActivity, поэтому, насколько мне известно, я не использую GroupActivity.   -  person Dennis van Opstal    schedule 11.03.2016


Ответы (2)


Избавьтесь от этого getParent. Вы хотите установить результат для текущего действия, а не для вашего родителя. Итак, замените:

    //close this Activity...
    if (getParent() == null) {
        setResult(Activity.RESULT_OK, intent);
    } else {
        getParent().setResult(Activity.RESULT_OK, intent);
    }

с

setResult(Activity.RESULT_OK, intent);
person Gabe Sechan    schedule 11.03.2016
comment
Кажется, я уже пробовал это, но попробую еще раз. - person Dennis van Opstal; 11.03.2016
comment
Установка родительского результата абсолютно 100% неверна. - person Gabe Sechan; 11.03.2016
comment
Это может быть правдой, но это не решение, я получаю те же результаты - person Dennis van Opstal; 11.03.2016

Я нашел решение, если я не отправлю байт [] с намерением (но вместо этого, возможно, запишу файл и отправлю путь к этому файлу с намерением), код, кажется, работает, и ObjectActivity открывается .

Часть, которую я удалил/изменил:

intent.putExtra("data",data);

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

person Dennis van Opstal    schedule 11.03.2016