Я разрабатываю приложение, которое отправляет намерение сделать снимок. Я использую Galaxy S5, но эта проблема подтверждена на трех разных устройствах.Сбой камеры после съемки и удара
Сначала камера начала делать петлю, где нажатие OK просто вернулось назад, чтобы сделать еще одну фотографию. Я реорганизовал код и исправил эту проблему, но имел другие. Теперь, после поднятия экрана фотосъемки, использование кнопки «Назад» успешно завершается, и попытка повторить попытку после фотографирования работает отлично. Однако попав КИ делает один из трех вещей:
- Works (~% 20)
- выдает ошибку вне моего собственного обработчика ошибок. «К сожалению, MyApp неожиданно остановился». Затем он возвращается к вызывающей активности, вызывая ошибку из моего обработчика, потому что теперь он пытается читать из чего-то, что теперь является нулевым (предположительно, потому что приложение разбилось). Точки останова теперь игнорируются, и я снова должен снова запускать отладки. Я могу вернуться на первую страницу приложения и снова пройти процесс, но отладка не отвечает. (~ 30%)
- Как и раньше, кроме моей ошибки, я нажимаю кнопку «Назад», чтобы избавиться от нее, а затем кнопку «Назад», чтобы вернуться на экран, а затем я получу «К сожалению, myApp остановился». (~ 50%)
меня не удалось найти ошибку, выбрасываемые из камеры, которая вызывает начальную странность, а затем приводит все к сбою. У меня есть точка останова onActivityResult, которая никогда не срабатывает, если возникает ошибка. Также мой блок catch на startActivityForResult
никогда не выдает эту ошибку. Ошибки всегда исходят от NPE в onCreate, когда действие пытается снова начать работу после того, как сделана фотография или приложение выбрасывает «К сожалению, myApp остановился».
У меня есть тонна больше деталей, но я не хочу перегружать информацией. В основном, когда я нажимаю OK, он либо работает ~ 20% времени, либо весь ад разрывается на другие 80% времени. Может ли кто-нибудь указать мне в правильном направлении, почему результаты кажутся случайными и непредсказуемыми? Благодаря!
Я следовал этот учебник: http://developer.android.com/training/camera/photobasics.html
callingActivity
private class SetCounterActivityMenu implements OnMenuItemClickListener {
private FieldAppActivity a;
private SetCounterActivityMenu(FieldAppActivity _a) {
this.a = _a;
}
@Override
public boolean onMenuItemClick(MenuItem view) {
switch (view.getItemId()) {
case 777771: {
try{
//nextActivity(CameraActivityNative.class);
cameraAN = new CameraActivityNative(handler,SetCounterActivity.this);
Intent intent = cameraAN.getPictureIntent();
startActivityForResult(intent, cameraAN.CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
catch (Exception ex){
handler.error("Error occured taking picture", ex);
}
break;
}
case 777772: {
a.showMap(MapShowsWhat.survey);
break;
}
}
return false;
}
}
CameraActivityNative.java
public Intent getPictureIntent() {
// create Intent to take a picture and return control to the calling application
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// create a file to save the image
try {
fileUri = createMultimediaFile(MEDIA_TYPE_IMAGE, handler);
}
catch (Exception e){
Utils.log("Camera Activity Native", "cannot create file", 'e');
}
// set the image file name
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
// start the image Intent
return intent;
}
private Uri createMultimediaFile(int type, FieldApplicationManager.FAMEventHandler handler) throws UnsupportedOperationException, IOException{
// To be safe, you should check that the SDCard is mounted
// using Environment.getExternalStorageState() before doing this.
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyDir");
// Create the storage directory if it does not exist
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
Utils.log("CameraActivityNative", "failed to create directory", 'd');
return null;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName;
String fileSuffix;
if (type == MEDIA_TYPE_IMAGE){
imageFileName = "IMG_"+ timeStamp + ".jpg";
}
else if (type == MEDIA_TYPE_VIDEO) {
imageFileName = "VID_"+ timeStamp + ".mp4";
}
else {
throw new UnsupportedOperationException("Media type not supported");
}
File mediaFile = new File(mediaStorageDir, imageFileName);
// Save a file: path for use with ACTION_VIEW intents
// galleryAddPic("file:" + mediaFile.getAbsolutePath());
return Uri.fromFile(mediaFile);
}
Logcat ошибка. Я не уверен, что это действительно актуально, поскольку это ошибка, которая возникает после того, как камера уже разбилась.
02-27 17:56:27.609 17153-17153/android.fieldteam E/ERROR﹕ Message: Attempt to read from field 'java.lang.String android.api.CountSurvey.stationid' on a null object reference
Last System Info: null
Parameter: onGCFCreate
Stack Trace: java.lang.NullPointerException: Attempt to read from field 'java.lang.String android.api.CountSurvey.stationid' on a null object reference
at android.gui.SetCounterActivity.onGCFCreate(SetCounterActivity.java:33)
at android.gui.FieldAppActivity.onCreate(FieldAppActivity.java:64)
at android.app.Activity.performCreate(Activity.java:6221)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2614)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2728)
at android.app.ActivityThread.access$900(ActivityThread.java:172)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5837)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
Было бы полезно, если бы вы могли вставить трассировку стека из логарифма. – Ben
Трудно получить представление о структуре вашего кода, поскольку большая часть кода, который вы опубликовали, существует вне методов. Можете ли вы разместить свой код как часть их правильных методов и обратных вызовов? – Dyrborg
Я добавил. К сожалению, я не смог найти стек, исходящий из самой камеры. – farnett