3

メディア ギャラリーから画像をトリミングしようとしています。画像にアクセスし、デフォルトのトリミング ツールを起動し、トリミングした画像の結果を保存することさえできます。

ただし、トリミングが成功した場合、私が使用しているインテントは結果を返しません。

私の主な方法:

// 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」が「Failed Binder Transaction」と文句を言うことがわかりました。これは何らかの形でメモリに関連していることは理解していますが、トリミングされたファイルのサイズはわずか 24KB です。

4

2 に答える 2

15

この問題に問題が見つかりました。残念ながら、これは Android の制限です。

Androidクロッパーが256を超えることができないのを参照してください?

トリミングした画像の出力を 400x400 に設定しました。残念ながら、Android のデフォルトのクロッパーは 256x256 しか処理できません。特に制限に関するドキュメントがない場合、これは非常にイライラします。

于 2012-02-19T10:24:16.527 に答える
1

クロップ インテントで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() が使用されたと仮定します)。必要に応じて、いくつかのオーバーライドもあります。呼び出し側 (親) のアクティビティではonActivityResultint,int,Intent)、終了するアクティビティから結果を取得するために要素を実装する必要があります。

上記のリンクには、「アクティビティの開始と結果の取得」というタイトルのセクションがあり、終了したアクティビティから情報を取得する複数の方法について説明しています。

于 2012-02-19T01:59:47.300 に答える