Nano Hash - криптовалюты, майнинг, программирование

Планшет Android Сфотографировать Камера Намерение Активность Перезагружается

В моем приложении есть возможность делать снимки с камеры. Мой FragmentActivity работает только в портретном режиме. В моем Fragment, когда пользователь нажимает кнопку, я запускаю приложение камеры, используя:

private void pickFromCamera() {

    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    try {
        File file = new File(createImageFile());
        if(!file.exists()) {
            file.createNewFile();
        }
        intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
    } catch (Exception e) {
        e.printStackTrace();
    }
    startActivityForResult( intent , ACTION_REQUEST_CAMERA );

}

и в onActivityResult фрагмента я делаю это:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    try {
        super.onActivityResult(requestCode, resultCode, data);
        if ( resultCode == Activity.RESULT_OK ) {
            switch ( requestCode ) {
            case ACTION_REQUEST_GALLERY:
                .....
            case ACTION_REQUEST_CAMERA:

                if(cameraImageFilePath == null) {
                // show error message and return
                }
                addImage(cameraImageFilePath);
                break;

            }
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

но я столкнулся со странной проблемой здесь. На телефонах работает нормально. На планшете это работает, когда снимок сделан в ландшафтном режиме, а кнопка сохранения нажата в приложении камеры. Но если я сфотографирую в портретном режиме и нажму кнопку «Сохранить», мое приложение вылетит. Вот вывод logcat:

    09-18 17:00:09.960: E/AndroidRuntime(13701): FATAL EXCEPTION: main
09-18 17:00:09.960: E/AndroidRuntime(13701): java.lang.RuntimeException: Unable to resume activity {com.dstudios.napa/com.dstudios.napa.HomeActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=196708, result=-1, data=null} to activity {com.dstudios.napa/com.dstudios.napa.HomeActivity}: java.lang.NullPointerException
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2291)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2319)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1839)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3191)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.access$600(ActivityThread.java:122)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1031)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.os.Looper.loop(Looper.java:132)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.main(ActivityThread.java:4126)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at java.lang.reflect.Method.invokeNative(Native Method)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at java.lang.reflect.Method.invoke(Method.java:491)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at dalvik.system.NativeStart.main(Native Method)
09-18 17:00:09.960: E/AndroidRuntime(13701): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=196708, result=-1, data=null} to activity {com.dstudios.napa/com.dstudios.napa.HomeActivity}: java.lang.NullPointerException
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.deliverResults(ActivityThread.java:2821)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2278)
09-18 17:00:09.960: E/AndroidRuntime(13701):    ... 13 more
09-18 17:00:09.960: E/AndroidRuntime(13701): Caused by: java.lang.NullPointerException
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:152)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.Activity.dispatchActivityResult(Activity.java:4581)
09-18 17:00:09.960: E/AndroidRuntime(13701):    at android.app.ActivityThread.deliverResults(ActivityThread.java:2817)

Затем я добавил метод onActivityResult в FragmentActivity и окружил супервызов блоком try catch следующим образом:

@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
    // TODO Auto-generated method stub
    try {
        super.onActivityResult(arg0, arg1, arg2);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Теперь происходит то, что исключение перехватывается, и сбой не происходит, но моя деятельность перезапускается. Я знаю, что есть способ сохранить состояние активности, используя onSavedInstanceState, а затем... но моя активность очень сложная, ее нельзя восстановить до прежнего состояния, потому что это основная активность, и загружается много фрагментов и т. д. .. Есть ли обходной путь для этого? Я использую 10-дюймовый планшет Samsung с Android HoneyComb 3.2. Редактировать: Кроме того, я добавил android:configChanges="orientation" в манифест.


Ответы:


1

Нет, вы не можете гарантировать, что ваша активность не будет уничтожена, как только она потеряет экран. Это происходит чаще, когда ориентация переключается из-за того, что приложение «Камера» запрашивает альбомную ориентацию, но вы не контролируете ситуацию. Пользователь может выбрать запуск еще одной фоновой службы или использовать собственный провайдер IMAGE_CAPTURE, который сожжет все ваши карты. См. также https://stackoverflow.com/a/20783313/192373.

Если вы не можете использовать onSaveInstanceState(Bundle) (или даже если можете), для ваших пользователей может быть гораздо лучше, если вы предоставите камеру в приложении, особенно на планшете с фрагментами.

18.09.2014
  • Ты прав Алекс. Я решил это, создав собственную реализацию камеры и сделав снимок. 05.10.2014

  • 2

    Он не уничтожает переменные. Но после стольких дней исследований, LOL, я нашел решение своей ошибки. Когда я ставлю отладчик, метод вызывает его, как после того, как сделал снимок.

    onCreate() onActivityResult() onCeate() onResume() Это исправлено, просто поместив следующие строки в манифест. Это происходит из-за изменений конфигурации камеры и режима программного ввода окна.

             <activity
                android:name="packageName.Activity"
                android:configChanges="orientation|keyboardHidden|screenSize"
                android:label="@string/app_name"
                android:screenOrientation="portrait"
                android:windowSoftInputMode="adjustResize" >
    
    02.06.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..