当子活动调用另一个活动时,startActivityForResults不起作用

时间:2018-05-27 06:35:08

标签: android android-activity lifecycle startactivityforresult

我有3个活动,比如A,B和C.

A来电B.

当B没有调用C时它会返回A.但是当B调用C时它不会返回A,应用就会停止。

现在真正的问题是,从活动A我想调用图像选择器并裁剪图像。该活动B裁剪并调用C来挑选图像。

活动A:

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

            iv_profile_pic.setImageBitmap(image);


        }
    }
 public void onLoadImageClick(View view) {

        startActivityForResult(getPickImageChooserIntent(), 200);
 }

活动B:

它有2个按钮。加载和裁剪。单击时加载调用ImageChooserIntent并选择在B中打开的带有guidlines的图像进行裁剪。

单击时裁剪应返回到A裁剪后的图像。

如果在不调用load的情况下调用crop,则返回A,当然为null。 但是如果首先单击Load然后调用Crop,则应用程序将停止。

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);
            }
        }
    }
src

1 个答案:

答案 0 :(得分:0)

我有一个解决方法。我面临的最可能的问题是:

我使用外部库来裁剪图像。这个图书馆做了两件事。

首先,使用imageChooser intent选择图像。

第二,裁剪该图像。

图书馆裁剪图像后,不会将裁剪后的图像保存在本地/外部存储中。但我试图将其传递回父目录。

存在问题。该文件不存在,我仍在尝试使用它。该应用程序终止。

所以我的解决方法是,

  

•将位图保存在存储

中      

•将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();


    }

活动A有:

@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%欢迎。如果像我这样的人被卡住了,这可能会有所帮助!