這是我第一次在這裏發佈的東西,所以我提前道歉,任何錯誤,所以永遠。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()的情況下退出。我的問題或多或少得到了解決,但包括了很多拼湊,我覺得可以用其他更有效的方式來完成。
謝謝! 我實際上從頭開始重新啓動並使用您的代碼作爲我的活動的基礎。 onDestroy問題可能以某種方式解決,但我覺得你的解決方案更簡單,更有效。 – Daemun
更新:雖然在先前的建議之後我有更好的代碼,但它仍未解決問題。看起來內存較少的設備可能會在DVM級別終止,導致它們在沒有onDestroy()的情況下退出。我的問題或多或少得到了解決,但包括了很多拼湊,我覺得可以用其他更有效的方式來完成。 – Daemun