Android локальная переменная get теряется при использовании намерения камеры - PullRequest
1 голос
/ 24 августа 2011

Я имею дело со случайной проблемой, связанной с использованием камеры.Прежде чем я вызову камеру намерением - я генерирую UUID для хранения файла с этим именем.Я храню этот UUID в закрытой переменной следующим образом:

private String requestedFileName;

Когда камера готова - я обрабатываю этот файл, выглядит примерно так:

public void onPictureTaken(int index)
    {
        //First of all - remember picture in database for reference.
        FileData.InsertFile(mContext, UUID.fromString(requestedFileName));

        //Reduce taken picture if needed, otherwise let it be original.
        if (Preferences.getImageSize(mContext) > 0)
        {
            Imaging.scaleImageFile(mContext, requestedFileName, Preferences.getImageSize(mContext));
        }

Я вижу исключение из отчета о пользователяхэто сводится к requiredFileName == null , когда onPictureTaken называется

Caused by: java.lang.NullPointerException
 at java.util.UUID.fromString(UUID.java:210)
 at com.idatt.views.FourImagesView.onPictureTaken(FourImagesView.java:151)
 at com.idatt.views.TrailerUnitView.onPictureTaken(TrailerUnitView.java:233)

Все хорошо работает на моем телефоне (Nexus S) и в эмуляторе.Но пользователи сообщают об этом исключении, и я не уверен, почему это происходит ..

Ответы [ 2 ]

3 голосов
/ 24 августа 2011

Я видел это на телефонах Nexus и некоторых других.Если вы используете DDMS для наблюдения за происходящим, держу пари, вы увидите, что ваш процесс на самом деле завершается, а затем перезапускается.Таким образом, ваше местное государство теряется.Вам необходимо сохранить его, так как Android в основном может убить ваш процесс и перезапустить его, когда захочет, если вы переключитесь на новое задание (а для большинства целей захвата камеры установлен флаг NEWTASK).

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

Если вы не Activity, вы можете использовать хранилище SharedPreferences как временное место для сохранения имени файла:

private static void saveTempFileName(Context context, String filename) {
    SharedPreferences settings = context.getSharedPreferences("whatever", 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString("com.yourstuff.whatever", filename);
    editor.commit();
}
1 голос
/ 24 августа 2011

Как заметил @jeffamaphone, возможно, у вас проблемы с изменениями конфигурации приложения.Изменение конфигурации приложения происходит, когда происходит что-то, что влияет на среду выполнения вашего приложения.В первую очередь это: изменение ориентации или скрытие / показ клавиатуры.

Попробуйте: запустите свое приложение, вызовите приложение «Камера» (с помощью действия вашего приложения), измените ориентацию, вернитесь к своему приложению (с помощью соответствующего действия).Эта последовательность выдает ошибку?Тогда у вас возникают проблемы с изменением конфигурации - когда обычно меняется ориентация (в зависимости от настроек вашего приложения), система Android перезапускает (убивает и создает новый экземпляр) вашу активность, которая, вероятно, создает все новые представления (без установленного UUID).

См. Обработка изменений конфигурации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...