2017-01-21 3 views
0

У меня возникла проблема, когда я пытаюсь обрезать изображение после того, как он выбрал из галереи или камеры.Не показывать галерею экрана после съемки с камеры Android

Когда я выбираю изображение из галереи, оно становится правильно обрезанным без каких-либо проблем. Когда я выбираю изображение с камеры, обрезка выполняется правильно, но она показывает мне «промежуточный» экран, как показано ниже, без прямого перехода на экран обрезки.

enter image description here

Примечание: Изображение выше только для целей представления, чтобы показать «промежуточный» Последний экран.

Я не хочу, чтобы этот «промежуточный» последний экран отображался. Вместо этого я хочу напрямую перейти к заданию урожая. В таких приложениях, как Whatsapp, это поведение не наблюдается, когда кто-то меняет свой профиль. Он непосредственно перемещается по узору, не показывая «промежуточный» экран.

Может кто-то помочь в решении этой проблемы?

Вот мой полный код

/** 
    * This activity is used to display profile picture and update the same 
    * 
    */ 
    public class ChangeProfilePhotoActivity extends BaseActivity implements  
    View.OnClickListener { 

private TextView mTvTitle; 
private ImageView mBtnChangePhoto; 
private ImageView mIvProfileImage; 
public static final int CROP_PIC_REQUEST_CODE = 3; 
public static final int TAKE_PICTURE = 1; 
public static final int GALLERY_IMAGE = 2; 
public static final int IMAGE_CHOOSER_INTENT = 4; 

int PERMISSION_ALL = 10; 
String[] PERMISSIONS = { Manifest.permission.CAMERA}; 

//private Uri mImageUri; 
//private Uri mCropImageUri; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_profile_photo); 
    initUI(); 
} 


@Override 
protected void onResume() { 
    super.onResume(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
} 


private void initUI() { 
    mBtnChangePhoto = (ImageView) findViewById(R.id.btnChangePhoto); 
    mIvProfileImage = (ImageView) findViewById(R.id.profile_image); 

    mBtnChangePhoto.setOnClickListener(this); 

} 

@Override 
public void onClick(View v) { 

    switch (v.getId()) { 

     case R.id.btnChangePhoto: 

      //launch intent chooser 
      getPickImageIntent(this); 


      break; 
     default: 
      break; 

    } 

} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    try { 
     if (resultCode == Activity.RESULT_OK) { 
      switch (requestCode) { 
       case IMAGE_CHOOSER_INTENT: 
        if(data!=null){ 
         String action = data.getAction(); 

         Uri selectedImageUri = data.getData(); 
         //send image for cropping 
         doCrop(selectedImageUri); 


        } 
        break; 
       case CROP_PIC_REQUEST_CODE: 
        if(data!=null){ 
         Bundle extras = data.getExtras(); 
         if(extras != null) { 
          Bitmap bmp = (Bitmap) extras.get("data"); 
          mIvProfileImage.setImageBitmap(bmp); 
         } 
        } 
        break; 

       default: 
        break; 
      } 
     } 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 


private void doCrop(Uri picUri) { 
    try { 

     Intent cropIntent = new Intent("com.android.camera.action.CROP"); 
     cropIntent.setDataAndType(picUri, "image/*"); 
     cropIntent.putExtra("crop", "true"); 
     cropIntent.putExtra("aspectX", 1); 
     cropIntent.putExtra("aspectY", 1); 
     cropIntent.putExtra("outputX", 128); 
     cropIntent.putExtra("outputY", 128); 
     cropIntent.putExtra("return-data", true); 
     startActivityForResult(cropIntent, CROP_PIC_REQUEST_CODE); 
    } 
    // respond to users whose devices do not support the crop action 
    catch (ActivityNotFoundException anfe) { 
     // display an error message 
     String errorMessage = "Your device doesn't support the crop action!"; 
     Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT); 
     toast.show(); 
    } 
} 

public void getPickImageIntent(Context context) { 
    Intent chooserIntent = null; 

    List<Intent> intentList = new ArrayList<>(); 

    Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    //startActivityForResult(pickIntent, GALLERY_IMAGE); 

    Intent takePhotoIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    /* String imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/crop_image.jpg"; 
    File imageFile = new File(imageFilePath); 
    Uri picUri = Uri.fromFile(imageFile); // convert path to Uri 
    takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, picUri);*/ 
    //takePhotoIntent.putExtra("return-data", false); 
    //startActivityForResult(takePhotoIntent, TAKE_PICTURE); 

    intentList = addIntentsToList(context, intentList, pickIntent); 
    intentList = addIntentsToList(context, intentList, takePhotoIntent); 

    if (intentList.size() > 0) { 
     chooserIntent = Intent.createChooser(intentList.remove(intentList.size() - 1), 
       context.getString(R.string.pick_image_intent_text)); 
     chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray(new Parcelable[intentList.size()])); 
    } 

    startActivityForResult(chooserIntent, IMAGE_CHOOSER_INTENT); 

} 

private static List<Intent> addIntentsToList(Context context, List<Intent> list, Intent intent) { 
    try { 
     List<ResolveInfo> resInfo = context.getPackageManager().queryIntentActivities(intent, 0); 
     for (ResolveInfo resolveInfo : resInfo) { 
      String packageName = resolveInfo.activityInfo.packageName; 
      Intent targetedIntent = new Intent(intent); 
      targetedIntent.setPackage(packageName); 
      list.add(targetedIntent); 
     } 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

    return list; 
    } 
} 
+0

[Android не имеет 'CROP'' Intent'] (https://commonsware.com/blog/2013/01/23/no-android-does-not-have-crop-intent.html). Существует много [библиотек обрезки изображений, доступных для Android] (https://android-arsenal.com/tag/45). Пожалуйста, используйте один. В качестве побочного эффекта вам больше не нужно беспокоиться о сбое вашего приложения из-за того, что устройство не имеет активности «CROP», или что активность делает то, чего вы не ожидаете. – CommonsWare

+0

Хорошо, я поеду за библиотекой, а не за намерение, если это так. –

ответ

3

Вы запускать намерение. Это означает, что вы передаете управление другому приложению. После этого у вас нет контроля над тем, что происходит. Конечно, на каждом устройстве будет происходить различие, так как некоторые OEM-производители будут использовать свое приложение Gallery или приложение для камеры, которое может вести себя совершенно по-другому.

Нет, нет способа предотвратить использование этого дополнительного экрана. Если вам нужен полный контроль, сделайте снимок самостоятельно с помощью камеры или камеры2 apis вместо вызова намерения. (Примечание: я на самом деле не предлагаю этого, но если вы хотите контролировать его единственный способ).

+0

Я испытал это даже в крупных приложениях. Я думал, что это ошибка в ОС. –

+0

привет @Gabe Sechan: спасибо за информацию. любая идея о том, как whatsapp тогда реализует то же самое? Когда вы меняете изображение профиля и выбираете опцию камеры, она берет рис, а затем непосредственно переходит к экрану обрезки. так что это экран камеры в основном намерения или его использование с помощью Camera2 –

+0

Я не использую приложение, поэтому не могу сказать вам точно. Но если вы видите, что он делает что-то отличное от других приложений на телефоне, предположите, что они настраивали собственную работу с камерой. Из того, что я знаю об этой команде, это то, что они будут делать. –

Смежные вопросы