startActivityForResults не работает, когда дочернее действие вызывает другое действие - PullRequest
0 голосов
/ 27 мая 2018

У меня есть 3 действия, скажем, A, B и C.

A вызывает B.

Когда B не вызывает C, он возвращается к A. Но когда B вызывает C, он не 'Если вернуться к A, приложение останавливается.

Теперь реальная проблема в том, что из активности AI нужно вызвать сборщик изображений и обрезать изображение.Это действие B, которое обрезает и вызывает C для выбора изображения.

Задание A:

    iv_profile_pic.setOnClickListener(new  View.OnClickListener() {//iv_profile_pic is an ImageView
        @Override
        public void onClick(View view) {
            Intent i=new Intent(MainActivity.this,profile_pic_chooser.class);
            i.setFlags(0);
            MainActivity.this.startActivityForResult(i, 999);

            Toast.makeText(getApplicationContext(),"Reached",Toast.LENGTH_SHORT).show();

        }
    });

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        if (requestCode == 999) {
            Bitmap image=data.getParcelableExtra("picture");

            iv_profile_pic.setImageBitmap(image);


        }
    }

Задание B:

Имеет 2 кнопки.Загрузить и обрезать.Загрузка по нажатию вызывает ImageChooserIntent и выбирает изображение, которое открывается в B с направляющими для обрезки.

Кадрирование при нажатии должно вернуться к A обрезанному изображению.

Если кадрирование вызывается без вызова load, оно, конечно, возвращается к A с нулевым значением.Но если сначала нажать Load, а затем вызывается Crop, приложение просто останавливается.

 public void onLoadImageClick(View view) {

        startActivityForResult(getPickImageChooserIntent(), 200);
 }

public void onCropImageClick(View view) {
        Bitmap cropped =  mCropImageView.getCroppedImage(500, 500);
        if (cropped != null) {
            mCropImageView.setImageBitmap(cropped);
            iv.setImageBitmap(cropped);

            Intent returnIntent = new Intent();
            returnIntent.putExtra("picture", cropped);
            setResult(Activity.RESULT_OK, returnIntent);
            finish();
        }
    }

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

            // For API >= 23 we need to check specifically that we have permissions to read external storage,
            // but we don't know if we need to for the URI so the simplest is to try open the stream and see if we get error.
            boolean requirePermissions = false;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
                    checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED &&
                    isUriRequiresPermissions(imageUri)) {

                // request permissions and handle the result in onRequestPermissionsResult()
                requirePermissions = true;
                mCropImageUri = imageUri;
                requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 0);
            }

            if (!requirePermissions) {
                mCropImageView.setImageUriAsync(imageUri);
            }
        }
    }

1 Ответ

0 голосов
/ 27 мая 2018

Я нашел обходной путь.Наиболее вероятная проблема, с которой я столкнулся, была:

Я использовал внешнюю библиотеку для обрезки изображения.Эта библиотека сделала 2 вещи.

Во-первых, выбрал изображение с помощью намерения imageChooser.

Во-вторых, обрезал это изображение.

После того, как библиотека обрезала изображение, оно не былосохранение обрезанного изображения в локальном / внешнем хранилище.Но я пытался передать его обратно в родительский каталог.

Есть проблема.Файл не существует, и я все еще пытаюсь его использовать.Приложение завершается.

Итак, мой обходной путь:

• Сохранение растрового изображения в хранилище

• Передача Uri родительскому элементу

• Извлечениеэтот Uri от ребенка

• Создайте растровое изображение из этого Uri

• Примените к ImageView

Таким образом, у действия B было:

public void onCropImageClick(View view) {
        Bitmap cropped =  mCropImageView.getCroppedImage(500, 500);
        if (cropped != null) {
            mCropImageView.setImageBitmap(cropped);
            iv.setImageBitmap(cropped);
            File externalStorageDirectory = Environment.getExternalStorageDirectory();
            externalStorageDirectory= new File(externalStorageDirectory , "FOLDERNAME");

            if(!createDirIfNotExists(externalStorageDirectory)){
                Toast.makeText(this,"Failed creating Directory!",Toast.LENGTH_SHORT).show();
            }else{

                File filename=new File(externalStorageDirectory, String.valueOf(Calendar.getInstance().getTimeInMillis())+".PNG");
                FileOutputStream out = null;
                try {
                    out = new FileOutputStream(filename);
                    cropped.compress(Bitmap.CompressFormat.PNG, 100, out); // cropped is your Bitmap instance
                    // PNG is a lossless format, the compression factor (100) is ignored
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (out != null) {
                            out.close();
                            Intent returnIntent = new Intent();
                            returnIntent.putExtra("picture", Uri.fromFile(filename));
                            setResult(RESULT_OK, returnIntent);
                            finish();

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

            }

        }
        //Toast.makeText(this,mCropImageUri.toString(),Toast.LENGTH_SHORT).show();


    }

И задание А имело:

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

        if (requestCode == 999 && resultCode==RESULT_OK) {

           Uri path=data.getParcelableExtra("picture");
            Bitmap bitmap=null;
            try {
                bitmap= MediaStore.Images.Media.getBitmap(this.getContentResolver(), path);
            } catch (IOException e) {
                e.printStackTrace();
            }
            Toast.makeText(this,path.toString(),Toast.LENGTH_SHORT).show();

            if (bitmap!=null){

                iv_profile_pic.setImageBitmap(bitmap);

            }
}

Может быть, мое постановление проблемы неверно, но обходной путь работает.Любые изменения / предложения

приветствуются на 100%.На всякий случай, если кто-то вроде меня застрянет, это может помочь!

...