2012-02-19 7 views
3

メディアギャラリーから画像をトリミングしようとしています。私は画像にアクセスし、デフォルトのクロップツールを起動し、クロップされた画像の結果を保存することもできます。しかし、私が使用している意図は、トリミングが成功した場合には結果を返さないでしょう。Android Crop IntentがActivityResultを返さない

- mainメソッド -

// 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を見るUPDATE

、私はトリミングされた画像を保存することを毎回、「JavaBinderは」文句「に失敗しましたバインダートランザクション」を見つけることです。私はこれが何らかの形で記憶に関係していることを理解している。しかし、切り取られたファイルのサイズはわずか24KBです。うーん。

+0

重複するこの回答を確認してください:http://stackoverflow.com/questions/12758425/how-to-set-the-output-image-use-com-android-camera-action-crop/ – hcpl

答えて

15

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

は、私は400x400のに私のトリミングされた画像の出力を設定していた

Android cropper cannot go beyond 256?を参照してください。残念ながら、Androidのデフォルトの作物は256x256しかできません。これは非常にイライラしており、特に制限に関する文書がない場合は特にそうです。

+0

はい、これは正しいです、あなたはoutputXとoutputYを256以下に設定しなければならないようですが、... cropppingインテントでクロップサイズを調整することができ、ユーザーが切り取った実際のサイズが返されます。これはバグですが、トリミングツールはまだ動作します:) – Danuofr

1

setResult(int)link)を作物の意図で呼び出していますか?

UPDATE:RESULT_CANCELLEDを送信\

がデフォルトです。あなたが何かを実装しない限り、それは常に返されます。

作物の意図では、編集が完了したとき(つまり、ユーザーが完了ボタンをタップするなど)、そのプロセスの一部がsetResult(RESULT_OK)となります。

例:(RESULT_OK、プラスあなたが指定した別の整数)は呼び出し元の活動に渡される(startActivityForResultを想定したが()を使用した)結果

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

。あなたのニーズに応じていくつかのオーバーライドもあります。呼び出し側(親)アクティビティでは、終了アクティビティの結果を得るには、onActivityResultint,int,Intent)を実装する必要があります。

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

+0

私はフォローしていません。私はどこで "setResult(int)"を行うのですか? – colinwong

+0

マイク。私は混乱のために申し訳ありません。私は、アクティビティから子アクティビティの観点から、 "setResult()"を理解しています。私が使用しているクロッピングツールはAndroidのデフォルトのクロッピングツールです。私はAndroid 4.0でGalaxy Nexusを使用しています。だから私は制御することができません。 – colinwong

+0

@colinwongあなたのアップデートを見て、私はあなたのqeustionに答えることはできないと思います。私はまだAndroid 4.0用に開発を始めていないので、そこには経験はありません。ごめんなさい。 –