StartActivityForResult не возвращает данные в родительскую активность

есть три действия A, B, C, в действии A намерение открывает действие B. В действии B вызывается startActivityForResult и открывается C. но после вызова setResult в C он возвращается к действию A, а не к B, я копирую свой код действия, где iam вызывает начало действия, создает событие

     @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == SELECT_FILE) {
        if (resultCode == Activity.RESULT_OK) {

            alertDialogBox.dismiss();
            Intent image = new Intent(CreateEventActivity.this, CropImageActivity.class);
            image.putExtra("data", data.getData().toString());
            startActivityForResult(image, 2);

        }

    }
    if (requestCode == 2) {
        if (resultCode == Activity.RESULT_OK) {
            String bt = data.getStringExtra("result");
            file_path = data.getStringExtra("filepath");
            testPath = new File(file_path);
            Log.e("desti", testPath.toString());
            Log.e("destpat", testPath.getAbsolutePath());
            try {
                testPath.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                byte[] encodeByte = Base64.decode(bt, Base64.DEFAULT);
                bitmap2 = BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);

                //  imageforUpload = getStringImage(bitmap2);
                BitmapFactory.Options options = new BitmapFactory.Options();

                // down sizing image as it throws OutOfMemory Exception for larger
                // images
                options.inSampleSize = 8;

                final Bitmap bitmaptest = BitmapFactory.decodeFile(file_path, options);

                imgCropped.setVisibility(View.VISIBLE);
                imgCropped.setImageBitmap(bitmaptest);


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

            }
        }
    }
}

вторая активность урожая Активити, где я возвращаю данные родителю

     private final CropCallback mCropCallback = new CropCallback() {
    @Override
    public void onSuccess(Bitmap cropped) {
        int height = cropped.getHeight();
        int width = cropped.getWidth();
        if (height<400||width<400){
            Toast.makeText(getApplicationContext(),"this image cat be cropped",Toast.LENGTH_SHORT).show();
        }else {

            Bitmap bitmap = Bitmap.createBitmap(cropped, 0, 0, 400, 400);


            imgtest.setImageBitmap(bitmap);
            SaveImage(bitmap);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
            byte[] b = baos.toByteArray();
            String temp = Base64.encodeToString(b, Base64.DEFAULT);


            Intent returnIntent = new Intent();
            returnIntent.putExtra("result", temp);
            returnIntent.putExtra("filepath", filePath);
            setResult(Activity.RESULT_OK, returnIntent);
            finish();
        }
    }

пожалуйста, помогите мне решить эту проблему, возвращаемая страница - это другое действие


person Jose Antony    schedule 23.12.2016    source источник
comment
вы заканчиваете действие B до вызова действия C?   -  person sohan shetty    schedule 23.12.2016
comment
@sohanshetty нет   -  person Jose Antony    schedule 23.12.2016
comment
пожалуйста, укажите имя класса, чтобы было ясно, из какого класса вы вызываете какой класс   -  person Ranjan    schedule 23.12.2016
comment
@JoseAntony Когда вы запускаете действие с помощью StartActivityForResult, из какого действия оно пришло? потому что я вижу, что вы внедрили код в OnActivityResult   -  person Hasif Seyd    schedule 23.12.2016
comment
Убедитесь, что вы не вызываете finish() до или после выполнения startActivityForResult(yourIntent, SELECT_FILE);   -  person A.R.    schedule 23.12.2016
comment
@ А.Р. я только вызываю финиш на setResult во втором действии   -  person Jose Antony    schedule 23.12.2016
comment
Вы хотите сказать, что завершение вызова на ThirdActivity   -  person A.R.    schedule 23.12.2016


Ответы (2)


Надеюсь, вам нужно исправить свой requestCode

Intent returnIntent = new Intent();
returnIntent.putExtra("result", temp);
returnIntent.putExtra("filepath", filePath);
setResult(2, returnIntent);
finish();

Потому что вы упомянули то же самое здесь

Intent image = new Intent(CreateEventActivity.this, CropImageActivity.class);
image.putExtra("data", data.getData().toString());
startActivityForResult(image, 2);
person Sridhar    schedule 23.12.2016
comment
я изменил код запроса, но он еще не работает - person Jose Antony; 23.12.2016
comment
@JoseAntony Попробуйте отладить и убедиться, что он входит внутрь onActivityResult или нет? - person Sridhar; 23.12.2016

First a fall you need to check the flow of control of your code, whether its going in correct blocks or not.

В качестве альтернативы вы можете следовать приведенному ниже решению (если хотите), вместо использования startActivityForResult() вы можете использовать onNewIntent() в качестве метода обратного вызова.

You need to follow few steps.

Шаг 1. Объявите launchMode вашего 'CreateEventActivity' как "singleTask" в файле AndroidManifest.xml.

Пример:

 <activity android:name=".CreateEventActivity" android:launchMode="singleTask"/>

Шаг 2. Переопределите onNewIntent() в 'CreateEventActivity'

Пример:

 @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if(intent!=null)
        {
            // YOU CAN CHECK FLAGS OVER HERE, BY PASSING THE VALUES THROUGH INTENTS from different other activities
             if(intent.getBooleanExtra("IS_COMING_FROM_CROP_ACTIVITY",false)
             {
                // HANDLE YOUR STUFF
             }
        }
    }

Шаг 3. Как запустить этот обратный вызов. Просто используйте startActivity(), то есть startActivity(B,C), и как только "Activity C" сработает, startActivity(C,B) и вызовите finish() для Activity С

Пример

Из CreateEventActivity

startActivity(new Intent(CreateEventActivity.this, CropImageActivity.class));

Из 'CropImageActivity'

startActivity(new Intent(CropImageActivity.this, CreateEventActivity.class));
finish();

Примечание. Не беспокойтесь, экземпляр Activity B не будет создаваться снова и снова. Попробуйте это решение, если вам не удалось найти проблему с startActivityForResult().

person A.R.    schedule 23.12.2016