2014-02-26 72 views
2

這是我第一次在這裏發佈的東西,所以我提前道歉,任何錯誤,所以永遠。Android - 第二次打開相機

情況是這樣的:

我目前正在開發我的第一個Android應用程序,有點像跟蹤:
1.登錄
2.選擇天氣,溫度等
3.按啓動按鈕激活後臺GPS服務,並展示了其他與會者
4.點擊與會者列表,它顯示了你的時間線,您可以添加圖片等

這裏是樂趣的開始。當我打開相機時,大多數情況下都是有效的,但偶爾會打開相機的活動被破壞,重新打開時(進一步進行)它會打開第二臺相機。

當我拍攝這樣的照片時,它完全忽略了第一張照片,重新啓動gps服務,弄亂了我的時間線,並在返回主要活動時顯示登錄對話框(編程爲僅顯示當啓動應用程序)。

我讀過類似的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

下面的代碼是我通常用來拍照/挑選照片的。我通常包括選擇以前的照片或拍攝新照片的能力,我不會遇到這個問題。

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將重新活動,將 savedInstanceState傳遞給onCreate。所以,補救措施是檢查GetImageActivity.onCreate中savedInstanceState的值 。如果它不是 null,則不要對startActivity進行任何調用,因爲正在重新創建活動 以調用onActivityResult。

(可選)如果您需要保留任何狀態,則覆蓋 onSaveInstanceState(Bundle outState)並將您需要的數據放入outState中。

+0

謝謝! 我實際上從頭開始重新啓動並使用您的代碼作爲我的活動的基礎。 onDestroy問題可能以某種方式解決,但我覺得你的解決方案更簡單,更有效。 – Daemun

+0

更新:雖然在先前的建議之後我有更好的代碼,但它仍未解決問題。看起來內存較少的設備可能會在DVM級別終止,導致它們在沒有onDestroy()的情況下退出。我的問題或多或少得到了解決,但包括了很多拼湊,我覺得可以用其他更有效的方式來完成。 – Daemun