在纵向拍摄照片然后以横向模式拍摄时,应用程序崩溃

时间:2014-09-16 07:35:58

标签: android photo android-photos

我的Android应用程序中有一个功能,允许用户拍照,然后将它们保存在应用程序内的小图库中。
当我开始以肖像模式拍摄照片然后坚持纵向模式时,一切正常,但当我决定切换到横向模式时,我可以拍摄照片,但是当我点击确认按钮时(你决定继续拍照的那一刻)与实际照片或返回另一个)应用程序然后崩溃。不幸的是我现在无法发布日志,但这里是代码(完全基于您可以在Android网站上找到的代码):

这是我创建相机意图,文件并保存它的地方:

private File createImageFile() throws IOException {

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "UNICAR_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
        imageFileName,  //-/ prefix
        ".jpg",         //-/ suffix
        storageDir      //-/ directory
    );

    SaisieMission activity = (SaisieMission) getActivity();
    activity.setCurrentPhotoPath("file:" + image.getAbsolutePath());
    return image;
}

protected void dispatchTakePictureIntent() {

    Context context = getActivity();
    PackageManager packageManager = context.getPackageManager();
    if (((SaisieMission) getActivity()).getNoPath() < 10) {

        photoPaths = mission.getPaths();
        if(packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA) == false) {
            Toast.makeText(getActivity(), "xxx", Toast.LENGTH_SHORT)
                    .show();
            return ;
        }

        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        SaisieMission activity = (SaisieMission) getActivity();
        if (takePictureIntent.resolveActivity(context.getPackageManager()) != null) {


            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex) {

                Toast toast = Toast.makeText(context, "xxx", Toast.LENGTH_SHORT);
                toast.show();
            }

            if (photoFile != null) {

                Uri fileUri = Uri.fromFile(photoFile);
                activity.setCapturedImageURI(fileUri);
                activity.setCurrentPhotoPath(fileUri.getPath());
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                activity.getCapturedImageURI());
                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
            }
        }
    } else {
        Toast.makeText(getActivity(), getString(R.string.enough_photo), Toast.LENGTH_SHORT)
        .show();    
        return ;
    }
}

这就是onActivityResult()方法:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == REQUEST_TAKE_PHOTO && resultCode == Activity.RESULT_OK) {

        SaisieMission saisiemission = (SaisieMission) getActivity();
        galleryAddPic();
        photoPaths[saisiemission.getNoPath()] = saisiemission.getCurrentPhotoPath();
        saisiemission.incNoPath();
        mission.setPaths(photoPaths);

    } else {
        Toast.makeText(getActivity(), "xxx", Toast.LENGTH_SHORT)
        .show();
        return ;
    }
}  

以下是我将图片放入图库的位置:

private void galleryAddPic() {

    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    SaisieMission activity = (SaisieMission) getActivity();
    File f = new File(activity.getCurrentPhotoPath());
    Uri contentUri = Uri.fromFile(f);
    mediaScanIntent.setData(contentUri);
    this.getActivity().sendBroadcast(mediaScanIntent);
}  

我也确切地说,我将所有这些方法都称为片段

感谢您阅读!

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:将特定图像文件名作为参数传递给Intent,以捕获图像作为putExtra参数。在媒体商店中插入此图像Uri,现在您可以将此Uri用于其他内容。您可以通过File.exist()

检查是否捕获了图像

例如:

ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, "Image File name");
Uri mCapturedImageURI = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent intentPicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intentPicture.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
startActivityForResult(intentPicture,ACTION_TAKE_PICTURE);
onActivityResult()中的

添加:

selectedImagePath = getRealPathFromURI(mCapturedImageURI);

创建另一种方法 getRealPathFromURI()

//----------------------------------------
    /**
     * This method is used to get real path of file from from uri
     * 
     * @param contentUri
     * @return String
     */
    //----------------------------------------
    public String getRealPathFromURI(Uri contentUri)
    {
        try
        {
            String[] proj = {MediaStore.Images.Media.DATA};
            Cursor cursor = managedQuery(contentUri, proj, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }
        catch (Exception e)
        {
            return contentUri.getPath();
        }
    }