1

我在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);
        }
}

活动结果:

@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"));
        }
    }

我观察到,除了whatsapp之外,大多数调用相机意图的应用程序在这些(Moto G 和 Nexus 7)设备中都存在相同的问题。我不确定他们如何处理这种情况。

谢谢你。

4

0 回答 0