Я пытаюсь запустить функцию камеры Android и функцию выбора фотографии (две кнопки, одну для фотосъемки, одну для выбора из галереи), и обе необходимо запустить функцию обрезки, после чего обрезанная фотография возвращается в активность моего приложения. Я просмотрел кучу примеров, опубликованных в другом месте, но с моей реализацией я получаю странные результаты.
Для события «Сфотографируй» все работает нормально, за исключением того, что после фотосъемки и перехода в режим кадрирования появляется неправильная фотография. Вместо того, чтобы обрезать фотографию, вы просто обрезаете старую фотографию, и я не могу понять, откуда она. Кроме того, иногда после завершения операции обрезки происходит сбой с нулевым значением после Parcel.readException (не всегда можно воспроизвести, но я думаю, что это произойдет больше, если вы сделаете снимок и обрежете его как можно быстрее).
Для выбора фотографии, ваша галерея всплывает, как и ожидалось, но после выбора фотографии все, что происходит, - это сообщение «Сохранено», а затем возвращается к активности моего приложения с изображением. Мне кажется, у меня неправильное понимание того, как работает функция выбора фотографии (я в значительной степени повторно использовал код для цели съемки фотографии).
В обоих случаях в режиме кадрирования вам по-прежнему разрешается изменять размер обрезанной области, несмотря на то, что указано «scale» = false.
Мой код выглядит следующим образом:
public class TestPhotoActivity extends Activity {
private ImageView imageView;
private Uri imageUri;
private int int_Height_crop = 600;
private int int_Width_crop = 600;
public final static int TAKE_PICTURE = 0;
public final static int CHOOSE_PICTURE = 1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.choose_photo);
imageView = (ImageView) findViewById(R.id.photo);
Button take_photo = (Button) findViewById(R.id.take_photo);
take_photo.setOnClickListener(new View.OnClickListener() {
public void onClick(final View view) {
takePhoto(view);
}
});
Button choose_photo = (Button) findViewById(R.id.choose_photo);
choose_photo.setOnClickListener(new View.OnClickListener() {
public void onClick(final View view) {
choosePhoto(view);
}
});
}
public void takePhoto(View view) {
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE", null);
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", int_Width_crop);
intent.putExtra("outputY", int_Height_crop);
intent.putExtra("scale", false);
intent.putExtra("return-data", true);
File photo = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
imageUri = Uri.fromFile(photo);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, TAKE_PICTURE);
}
public void choosePhoto(View view) {
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", int_Width_crop);
intent.putExtra("outputY", int_Height_crop);
intent.putExtra("scale", false);
intent.putExtra("return-data", true);
File photo = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + "Pic.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
imageUri = Uri.fromFile(photo);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
startActivityForResult(intent, CHOOSE_PICTURE);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case TAKE_PICTURE:
Log.d("photo", "requestCode: " + requestCode + "resultCode: " + resultCode + "wanted result: " + Activity.RESULT_OK);
if (resultCode == Activity.RESULT_OK) {
if (data == null) {
Log.w("photo", "Null data, but RESULT_OK, from image picker!");
Toast t = Toast.makeText(this, "No photo picked.", Toast.LENGTH_SHORT);
t.show();
return;
}
final Bundle extras = data.getExtras();
if (extras != null) {
Log.d("photo", "extras is not null");
Uri selectedImage = imageUri;
getContentResolver().notifyChange(selectedImage, null);
ContentResolver cr = getContentResolver();
Bitmap bitmap;
try {
bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, selectedImage);
Log.d("photo", "data.getAction() is not null. setting image.");
imageView.setImageBitmap(bitmap);
} catch (Exception e) {
Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT).show();
Log.e("photo", e.toString());
}
}
}
case CHOOSE_PICTURE:
Log.d("photo", "requestCode: " + requestCode + "resultCode: " + resultCode + "wanted result: " + Activity.RESULT_OK);
if(resultCode == RESULT_OK){
Log.d("photo", "resultCode is ok");
if (data == null) {
Log.w("photo", "Null data, but RESULT_OK, from image picker!");
Toast t = Toast.makeText(this, "No photo picked.", Toast.LENGTH_SHORT);
t.show();
return;
}
final Bundle extras = data.getExtras();
if (extras != null) {
Log.d("photo", "extras is not null");
Uri selectedImage = imageUri;
getContentResolver().notifyChange(selectedImage, null);
ContentResolver cr = getContentResolver();
Bitmap bitmap;
try {
bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, selectedImage);
Log.d("photo", "data.getAction() is not null. setting image.");
imageView.setImageBitmap(bitmap);
} catch (Exception e) {
Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT).show();
Log.e("photo", e.toString());
}
}
}
}
}
}
Любая помощь очень ценится!
РЕДАКТИРОВАТЬ: я должен также отметить, что я тестирую на LG Optimus LTE, Android 2.3