2013-04-15 3 views
37

У меня две операции (A1, A2). A1 A2 требует и от А2 я звоню намерение камеры, как показано нижеAndroid: активность будет уничтожена после вызова намерения камеры

launchIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
launchIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoPath); 
startActivityForResult(launchIntent,CAMERA_REQUEST); 

Он открывает камеру, и я могу сделать снимок. Но проблема возникает, когда я нажимаю кнопку сохранения (кнопка тика в s3), мой onActivityResult не вызывается, а вызывается метод OnDestroy A2. У меня мало логики, которые нужно сделать в onActivityResult fn.

Я прочитал некоторые должности в Stackoverflow относительно этого, но я не смог получить полезный выход из that.I есть мой манифест, как это для моей второй деятельности (A2)

android:configChanges="keyboardHidden|orientation|locale" 
android:screenOrientation="portrait 

Примечание: В HTC One X мой onActivityResult fn получает вызов, но в моей S3 вторая активность (A2) уничтожается.

Plz делится ур мыслями по этому вопросу. Спасибо в Advance

+0

что этот экран необходим? – 2013-04-15 12:24:56

+0

Да, мне нужно, чтобы мое приложение было в potrait :( – Sudarshan

ответ

12

Приложение для камеры требует большой памяти и для освобождения памяти операционная система должна убивать фоновые приложения, в том числе ваши. Это нормально для всех приложений Android. Ваша деятельность будет воссоздана, когда приложение камеры вернется. Чтобы сохранить информацию о состоянии активности, переопределите onSaveInstanceState(), чтобы сохранить ваши данные и прочитать их обратно в onCreate().

+0

ya Я тоже ожидал такого же поведения, как он снова вызовет метод onCreate, но он не вызвал создание A2 – Sudarshan

+0

Можете ли вы опубликовать документ разработчика google в своем заявлении.for обращайтесь пожалуйста. –

72

У меня была такая же проблема.i будет сумасшедшим, но, наконец, я нашел решение here. проблема заключается в том, что когда вы нажимаете кнопку «Сохранить» на камере, метод ориентации на изменение активности и уничтожает и воссоздает. попытаться установить

android:configChanges="orientation|screenSize"

в андроида манифеста (не только android:configChanges="orientation", потому что, как предполагают here, она не работает на уровень API 13 или выше).

Это предотвращает разрушение деятельности, оно работает для меня.

+5

android: configChanges = "orientation | keyboardHidden | screenSize" http://stackoverflow.com/questions/16154279/galaxy-s3-taking-picture-in-portrait-mode-destroys-activity – Gdroid

+0

Спасибо, человек, ты спас меня андроид: configChanges = «ориентация | клавиатураHidden | screenSize» работает отлично – sandeepmaaram

+0

хороший ответ, спасибо –

17

Убедитесь, что у вас нет настройки разработчика «Не поддерживайте активность», так как он уничтожит действие, которое вы покидаете.

+3

Я просто потратил впустую ДЕНЬ РАБОТЫ, пытаясь выяснить, что не так с моим приложением. Огромное спасибо! –

+4

Но ваше приложение должно по-прежнему работать, а не сбой с «Не продолжать деятельность», не так ли? – tagy22

+0

Да, но это не нормальное поведение. Если вы запустили actionForResult и потеряли активность A, результат намерения камеры не сможет полностью восстановить активность A. – Omaraf

33

Запуск камеры требует большой памяти. Таким образом, на устройствах с низкой памятью система Android закрывает действия, выполняемые в фоновом режиме и, следовательно, вызывается onCreate(). Из-за этой фотопаты вы дали значение null, и вы не сможете получить сохраненное изображение.

Решение состоит в том, чтобы сохранить фотопату, в то время как система уничтожает вашу деятельность, а затем восстанавливает ее снова.

@Override 
    public void onSaveInstanceState(Bundle outState) { 
     // TODO Auto-generated method stub 

      outState.putString("photopath", photopath); 


     super.onSaveInstanceState(outState); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     if (savedInstanceState != null) { 
      if (savedInstanceState.containsKey("photopath")) { 
       photopath = savedInstanceState.getString("photopath"); 
      } 
     } 

     super.onRestoreInstanceState(savedInstanceState); 
    } 

и в случае, если вы делаете это на фрагменте.

@Override 
    public void onSaveInstanceState(Bundle outState) { 
     // TODO Auto-generated method stub 

      outState.putString("photopath", photopath)); 


     super.onSaveInstanceState(outState); 
    } 

    @Override 
    public void onViewStateRestored(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     if (savedInstanceState != null) { 
      if (savedInstanceState.containsKey("photopath")) { 
       photopath = savedInstanceState.getString("photopath"); 
      } 
     } 

     super.onViewStateRestored(savedInstanceState); 
    } 
+0

Это правильный ответ, и это решает проблему. Спасибо, чтобы дать решение для активности и фрагмента обоих. Действительно хороший ответ. – Smeet

+0

Действительно очень полезно! Спасибо! –

+0

этот подход намного лучше –

2

Моя активность имеет много задач, запущенных, когда я звоню Intent камеры .. У меня есть GPS слушателей местоположение, и многие другие задачи.

Когда он вернется из намерения камеры Мне нужно добавить маркер на карту в том месте, где было снято изображение. Итак, если пользователь взял несколько изображений, он должен показывать маркеры для каждого изображения.

Если он будет уничтожать мою деятельность каждый раз, когда я звоню в камеру, вся информация, которую я имел раньше о маркерах и их местоположении, будет потеряна .. А также мне придется снова инициализировать карту. Это большая проблема для моего приложения.

И да, это происходит только при съемке в ландшафтном режиме. Если я сделаю снимок на портрете, все будет в порядке.

Я постараюсь использовать android:configChanges="orientation|screenSize" Как здесь предложено .. Надеюсь, это поможет!

+0

Хорошо, после добавления этого манифеста я могу сказать, что проблема исчезла! Ура !. Кроме того, если это было связано с памятью, так это должно произойти и при съемке портретных изображений, и, как я уже сказал, это происходит только на фоне пейзажа, поэтому очень важно, что это связано с ориентацией, а не с памятью. –