Android - 第二次打开相机

时间:2014-02-26 16:34:14

标签: android camera

这是我第一次在这里发帖,所以我提前为任何错误提前道歉。

情况就是这样:

我正在开发我的第一个Android应用程序,有点像跟踪器:
登录
2.选择天气,温度等 3.按启动按钮激活后台GPS服务,并显示其他与会者列表 4.单击与会者,它会显示一个时间轴,您可以在其中添加图片等。

这是有趣的开始。当我打开相机时,它大部分时间都可以工作,但偶尔会打开相机的活动被破坏,重新打开时(为了进一步前进),它会打开第二个相机。

当我拍摄这样的图片时,它完全忽略了第一张图片,重新启动gps-service,弄乱了我的时间线,并在我回到主要活动时显示登录对话框(其编程仅显示在启动应用程序)。

我已经阅读了类似的topic,它可能是解决方案,但我无法让它发挥作用。

相机活动的代码:

public class AddPhotoActivity extends Activity {

private SharedPreferences savedValues;

private String mCurrentPhotoPath;
private String imageName;

private int id;

private String startRideDateTime;
private SimpleDateFormat dateInSQL = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
private Date date;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_photo);

    savedValues = this.getSharedPreferences("SavedValues",
            Context.MODE_PRIVATE);

    id = savedValues.getInt("RideId", 0);
    startRideDateTime = savedValues.getString("StartRideDateTime", "");

    try {
        date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse(startRideDateTime);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    SimpleDateFormat dateInDir
            = new SimpleDateFormat("yyyyMMdd_HHmmss");
    startRideDateTime = dateInDir.format(date);

    if (savedInstanceState == null) {
        dispatchTakePictureIntent();
    }
}

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

    savedValues = this.getSharedPreferences("SavedValues",
            Context.MODE_PRIVATE);
}

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        if (photoFile != null) {
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                    Uri.fromFile(photoFile));
            startActivityForResult(takePictureIntent, 1);
        }
    }
}

private File createImageFile() throws IOException {
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "IMG_" + timeStamp;
    File sdCard = Environment.getExternalStorageDirectory();
    File storageDir = new File(sdCard.getAbsolutePath() + „/app/„ + id + "/" + startRideDateTime + "/photos");
    storageDir.mkdirs();
    File image = File.createTempFile(imageFileName, ".jpg", storageDir);

    mCurrentPhotoPath = "file:" + image.getAbsolutePath();
    imageName =  image.getName();

    return image;
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (mCurrentPhotoPath != null) {
            addPhotoToDb();
            mCurrentPhotoPath = null;
        }
    } else if (resultCode == RESULT_CANCELED) {
        finish();
    } 
}

private void addPhotoToDb() {
    TimeLineDataSource timeLineDataSource = new TimeLineDataSource(this);
    timeLineDataSource.open();

    date = new Date();
    String dateString = dateInSQL.format(date);
    timeLineDataSource.createTimeLineItem(3, imageName, dateString);
    timeLineDataSource.close();

    finish();
}

public void onBackPressed() {
    finish();
}
}

如果有人知道解决方案,我会永远感激不尽!

更新

虽然在上一个建议之后我有更好的代码,但它仍然没有解决问题。似乎具有较少内存的设备可以在DVM级别终止,导致它们在没有onDestroy()的情况下退出。我的问题或多或少已得到解决,但包括许多我认为可以通过其他更有效的方式完成的拼凑。

1 个答案:

答案 0 :(得分:1)

下面的代码是我通常用于拍照/拍照的代码。我通常包括选择上一张照片或拍摄新照片的功能,我不会遇到这个问题。

Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePicture, 0);
//zero can be replced with any action code to pick photo from gallery

Intent pickPhoto = new Intent(Intent.ACTION_PICK,
    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(pickPhoto , 1);
//one can be replced with any action code

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 
    switch(requestCode) {
        case 0:
            if(resultCode == RESULT_OK){  
                Uri selectedImage = imageReturnedIntent.getData();
                imageview.setImageURI(selectedImage);
            }
        break; 
        case 1:
            if(resultCode == RESULT_OK){  
                Uri selectedImage = imageReturnedIntent.getData();
                imageview.setImageURI(selectedImage);
            }
        break;
    }
}

另外,我同意其他帖子的解决方案,特别是:

  

在活动被破坏的情况下,当活动结果需要时   处理后,Android会重新创建Activity,传递一个   savedInstanceState to onCreate。所以,补救措施是检查价值   在GetImageActivity.onCreate中保存了savedInstanceState。如果不是   null然后不要因为你的Activity而调用startActivity   正在重新创建以调用onActivityResult。

     

可选地,如果您需要保留任何状态,则覆盖   onSaveInstanceState(Bundle outState)并将您需要的数据放入其中   outState。