为啥Android裁剪意图不返回ActivityResult?

Posted

技术标签:

【中文标题】为啥Android裁剪意图不返回ActivityResult?【英文标题】:Why doesn't Android crop intent return ActivityResult?为什么Android裁剪意图不返回ActivityResult? 【发布时间】:2012-02-19 01:52:57 【问题描述】:

我正在尝试从媒体库中裁剪图像。我可以访问图像,启动默认裁剪工具,甚至可以保存裁剪后的图像结果。

但是,如果裁剪成功,我正在使用的意图将不会返回任何结果。

我的主要方法:

// Crop photo intent.
Intent intent = new Intent("com.android.camera.action.CROP", null);         
intent.setData(uri);   
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("aspectX", aspectX);
intent.putExtra("aspectY", aspectY);
intent.putExtra("scale", scale);
intent.putExtra("return-data", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, createTempCroppedImageFile());
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());

// Publish intent to crop picture.
activity.startActivityForResult(intent, activity.CROP_PHOTO_REQUEST_CODE);  

– OnActivityResult() 方法–

// Photo crop activity.
if (requestCode == CROP_PHOTO_REQUEST_CODE) 
    if (resultCode == RESULT_OK) 
        Log.d(TAG, "user cropped a photo");
        signupScreen.setImage(new PhotoTool(this).getTempCroppedImageFileLocation());
     else
        Log.d(TAG, "user cancelled photo crop");

如果我取消裁剪活动,我会成功收到“用户取消照片裁剪”消息。但是,如果我裁剪图像,新裁剪的图像将出现在目标目录中,但永远不会调用 OnActivityResult() 函数。什么给了?

查看 LogCat,我发现每次保存裁剪后的图像时,“JavaBinder”都会抱怨“Binder Transaction 失败”。我知道这在某种程度上与内存有关,但裁剪后的文件大小只有 24KB。

【问题讨论】:

重复检查这个答案:***.com/questions/12758425/… 【参考方案1】:

找到这个问题的问题。不幸的是,这是一个 Android 限制。

见Android cropper cannot go beyond 256?

我已将裁剪图像的输出设置为 400x400。不幸的是,Android 的默认裁剪器只能做 256x256。这非常令人沮丧,尤其是当没有关于限制的文档时。

【讨论】:

是的,这是正确的,看来您必须将 outputX 和 outputY 设置为 256 或更低,但是...您可以在裁剪意图中调整裁剪大小,它将返回实际大小用户裁剪到。所以这是一个错误,但裁剪工具仍然有效:)【参考方案2】:

您是否在裁剪意图中调用setResult(int) (link)?

更新:\

发送 RESULT_CANCELLED 是默认设置。除非您实施一些事情,否则它将始终被送回。

在您的裁剪意图中,当您完成编辑(即用户点击完成按钮或类似的东西)时,该过程的一部分将调用setResult(RESULT_OK)

示例:

public void doneBTNPressed( View view ) 
    if ( view.getId() == R.id.doneBTN ) 
        this.isCropped = true;
    


@Override    
protected void onPause() 
        if ( this.isCropped ) 
            setResult(RESUL_OK);
        
        super.onPause();
    

该结果(RESULT_OK,加上您指定的另一个整数)被传递回调用活动(假设使用了 startActivityForResult())。还有一些覆盖,取决于您的需要。在调用(父)活动中,您必须 implelement onActivityResultint,int,Intent) 才能从现有活动中获取结果。

在上面提供的链接中,有一个标题为“开始活动并获得结果”的部分,它解释了从现有活动中获取信息的多种方法。

【讨论】:

我没有关注。我在哪里做“setResult(int)”的意图? 迈克。我很抱歉造成混乱。我确实从活动到子活动的角度理解“setResult()”。我使用的裁剪工具是 Android 的默认裁剪工具。我在 Android 4.0 上使用 Galaxy Nexus。所以这不是我能控制的。 @colinwong 看了你的更新后,我想我不能回答你的问题。我还没有开始为 Android 4.0 开发,所以我没有那里的经验。对不起。

以上是关于为啥Android裁剪意图不返回ActivityResult?的主要内容,如果未能解决你的问题,请参考以下文章

Android - 相机和画廊意图后的裁剪给出了奇怪的结果

如何在 Android 相机上使用意图添加功能裁剪图像?

是否可以自定义 android 的相机裁剪意图视图?

如何使用默认裁剪意图裁剪 android marshmallow 中的图像?

Android 4.4.2 - 相机 uri 返回 null 并且裁剪功能也不起作用?

Android 图像选择器和裁剪器