这是我第一次在这里发帖,所以我提前为任何错误提前道歉。
情况就是这样:
我正在开发我的第一个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()的情况下退出。我的问题或多或少已得到解决,但包括许多我认为可以通过其他更有效的方式完成的拼凑。
答案 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。