これは、これまでに Android から直面した中で最も奇妙な動作です。
写真を撮ってからトリミングしたい。これは関連するコードです:
private void manageTakePhotoClicked() {
outputFileUri = prepareNewFileUri();
if(outputFileUri == null){
Toast.makeText(ProfilePicture.this, "Unable to prepare directory", Toast.LENGTH_SHORT);
}
try {
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(i, RESULT_FROM_PHOTO_TAKEN);
} catch (ActivityNotFoundException e) {
Toast.makeText(ProfilePicture.this, "No camera found", Toast.LENGTH_SHORT);
}
}
private Uri prepareNewFileUri(){
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File directory = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + FOLDER);
if (directory.isDirectory() || directory.mkdirs()) {
File file = new File(directory, "avatar.jpg");
return Uri.fromFile(file);
} else {
Log.d("foo", "Couldn't create directions");
}
} else {
Log.d("foo", "not mounted ");
}
return null;
}
OnActivityResult では、画像のトリミングをトリガーするだけです。
private void startCropActivity() {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(outputFileUri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", THUMBNAIL_SIZE_WIDTH);
intent.putExtra("aspectY", THUMBNAIL_SIZE_HEIGHT);
intent.putExtra("outputX", THUMBNAIL_SIZE_WIDTH);
intent.putExtra("outputY", THUMBNAIL_SIZE_HEIGHT);
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(intent, FROM_CROP);
}
これは初回のみ有効です。次に写真を撮ってトリミングしたいときは、最初の写真がトリミング用に撮影されます。ファイルマネージャーからこのフォルダーを見ると、最新の撮影写真から正しいサムネイルが表示されます。クリックすると、写真を開くのに約 5 ~ 8 秒かかります。最初に撮影した写真が表示され、ズームインまたはズームアウトすると、2 番目に撮影した写真に切り替わります (その場で)。要約: 5 枚の写真を撮り、トリミング プロセスをキャンセルすると、サムネイルに最新の写真が表示されます。デフォルトでは最初の写真が表示され、ピンチズームすると 2 番目の写真が表示されます。
もう1つ、フォルダー全体を削除しても同じ効果が得られます。
ところで:準備されたファイルに一意の名前を使用すると、すべて正常に機能します。しかし、それは私が望むものではありません。