Android: открытие Crop Intent камеры (после фотосъемки) убивает вызывающую функцию Activity/App в Nexus 7 и Moto G

Я столкнулся с проблемой с собственным приложением камеры в Nexus 7 и Moto G. Из приложения я открываю намерение камеры и после того, как сделаю снимок, которому звоню com.android.camera.action.CROP намерение. Но когда я нажимаю кнопку "Сохранить", она не возвращается к моей активности / приложению.

Я читал, что из-за нехватки памяти Android убивает действия, которые не находятся на переднем плане. Поэтому я спасаю государство в onSaveInstanceState,

Ниже приведен фрагмент кода:

Метод вызывается, чтобы сделать снимок с камеры:

public void takePictureFromCamera() {       
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        String imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/picture.jpg";
        File imageFile = new File(imageFilePath);       
        profilePicUri = Uri.fromFile(imageFile); // convert path to Uri
        intent.putExtra(MediaStore.EXTRA_OUTPUT, profilePicUri);        
        startActivityForResult(intent, PICK_FROM_CAMERA);
}

Метод для обрезки:

private void doCrop(Intent intent2) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setType("image/*");

        List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 0);
        int size = list.size();

        if (size == 0) {
            Bundle extras = intent2.getExtras();
            if (extras != null) {
                Bitmap photo = extras.getParcelable("data");
                doneCapturingPhoto(photo);
                photo = null;
            }
            return;
        }
        Log.i(" doCrop ","profilePicUri : "+ profilePicUri);
        intent.setData(profilePicUri);
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 200);
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true);

        if (size > 0) {
            Intent i = new Intent(intent);
            ResolveInfo res = list.get(0);
            i.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));         
            startActivityForResult(i, CROP_IMAGE);
        }
}

onActivityResult:

@Override
    public void onActivityResult(int requestCode, int resultCode, final Intent intent) {                
        if (requestCode == PICK_FROM_CAMERA || requestCode == PICK_FROM_GALLERY || requestCode == CROP_IMAGE) {
            try {
                if (resultCode == RESULT_OK) {
                    switch (requestCode) {
                    case PICK_FROM_CAMERA:
                    case PICK_FROM_GALLERY:
                        if (requestCode == PICK_FROM_GALLERY) {
                            profilePicUri = intent.getData();                           
                        }
                        new Handler().postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                doCrop(intent);
                            }
                        }, 2000);
                        break;
                    case CROP_IMAGE:
                        try {
                            if (loadingDialog != null && loadingDialog.isShowing()) {
                                loadingDialog.dismiss();
                            }
                        } catch (Exception ignore) {
                        }
                        Bundle extras = intent.getExtras();
                        if (extras != null) {
                            Bitmap photo = extras.getParcelable("data");
                            doneCapturingPhoto(photo);
                            photo = null;
                        }
                        break;
                    }
                } 
            } catch (Exception e) {
                try {
                    if (loadingDialog != null && loadingDialog.isShowing()) {
                        loadingDialog.dismiss();
                    }
                } catch (Exception ignore) {
                }
                CommonUtilities.showToast(this, "Please try again.");               
            }
        } else {
            super.onActivityResult(requestCode, resultCode, intent);
        }       
}

onSaveInstanceState & restore значения при восстановлении:

@Override
    protected void onSaveInstanceState(Bundle outState) {       
        if(null != outState && null != profilePicUri){
            outState.putString("profilePicUri", profilePicUri.toString());
        }
        super.onSaveInstanceState(outState);        
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {      
        restoreValue(savedInstanceState);       
        super.onRestoreInstanceState(savedInstanceState);       
    }

    private void restoreValue(Bundle savedInstanceState) {
        if (savedInstanceState != null && savedInstanceState.containsKey("profilePicUri"))
        {
            profilePicUri = Uri.parse(savedInstanceState.getString("profilePicUri"));
        }
    }

Я заметил, что большинство приложений, которые вызывают намерения камеры, имеют такие же проблемы в этих (Moto G & Nexus 7) устройствах, кроме WhatsApp. Я не уверен, как они справились с этим сценарием.

Спасибо.

0 ответов

Другие вопросы по тегам