Android — Android. Как сохранить cookie в SharedPreferences


Andro >

в моем приложении для Android каждое действие заполняется данными из xml-файла, который находится где-то в интернете. Веб-сайт, предоставляющий эти файлы, имеет механизм входа в систему, который работает с файлами cookie.

Я знаю, как сделать HTTP-запрос на страницу входа в систему и получить cookie. Чего я не знаю, так это как я могу сохранить его для повторного использования в других действиях и когда приложение будет запущено в следующий раз. Файл cookie действителен в течение года, поэтому пользователь моего приложения должен войти в систему один раз, а затем никогда снова на целый год.

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

с наилучшими пожеланиями и заранее спасибо, Ян Оливер

5 ответов

похоже, что Android использует реализацию памяти по умолчанию, поэтому вам нужно будет создать свой собственный постоянный магазин cookie.

этот учебник Java описывает создание собственного постоянного хранилища, используя реализацию по умолчанию. http://download.oracle.com/javase/tutorial/networking/cookies/custom.html

образец имеет два todo для хранения (чтение / запись) для хранения я бы просто использовал SharedPreferences для хранения только сеанса cookie, которые вам нужны, и не сохраняются никакие другие.

образец использует крюк выключения, который не то, что вы хотите в Android. Вместо run () и hook у меня просто будет новый общедоступный метод persist (), который сохраняет то, что вы хотите, хотя это требует, чтобы вы сохраняли () магазин вручную.

учитывая, что у вас есть только один или два куки, которые имеют значение, вы можете сохранить их в add(. )

использовать CookieSyncManager чтобы сохранить значение cookie. Он может сохраняться при запуске приложения.

остерегайтесь использования CookieSyncManager внутри WebViewClient#shouldInterceptRequest на KitKat. это будет тупик.

редактировать

CookieSyncManager устарел в API 21:

этот класс устарел на уровне API 21. В WebView теперь автоматически синхронизирует файлы cookie необходимый. Вам больше не нужно создавать или используйте CookieSyncManager. Для принудительной синхронизации вручную можно использовать Способ cookiemanager, как flush () что одновременная замена для sync ().

LoopJ имеет встроенный постоянный магазин cookie, который можно использовать С или без loopj framework


после того, как вы сделаете свой http-вызов, вы можете захватить куки, как это

Я тянул свои волосы, пытаясь понять это: я делаю HttpsURLConnection и используя java.net.cookiemanager для управления моими файлами cookie (нет способа использовать android.webkit.cookiemanager для HttpUrlConnection/HttpsUrlConnection, как я понял? ). Мне нужно сохранить старый файл cookie для последующих подключений.

К сожалению, я не могу использовать http://loopj.com/android-async-http/ и это PersistentCookieStore, потому что мне нужно разрешить ненадежный сертификат (используя http://abhinavasblog.blogspot.se/2011/07/allow-untrusted-certificate-for-https.html ). Я пытался использовать свой PersistentCookieStore один, но они используют cookie apache, и я использую файлы cookie java.net .

Это то, что я пробовал:

Куки добавляются в cManager, но не распознаются сервером. Я считаю, что есть какая-то проблема синтаксического анализа. Кто-нибудь получил решение?

В каких методах правильнее сохранять/загружать? SharedPreferences

10.01.2020, 21:05

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

Как сохранять/загружать на VBA Excel?
помогите кто может. мне нужно сделать форму а на ней кнопки загрузить и сохранить, а к.

Как Сохранять и Загружать класс в файл?
c# Есть класс. Внутри класса вложенные классы. В классах переменные, списки, массивы и.т.п. В них.

Как сохранять и загружать cookie? [C++/Indy]
Ребята, помогите начинающему :) Я разобрался со всякими штучками, как там посылать get-post.

Как загружать картинки в папку и сохранять название в бд?
Подскажите кто делал такое или дайте ссылку на туториал пожалуйста. Как загрузить картинку через.

11.01.2020, 18:08 21

Добавлено через 50 секунд
и убрать сохранение/загрузку из onPause/onResume
оставить только onCreate / onStop

11.01.2020, 18:11 22

в onCreate. Посмотрите внимательней мой пример.
По методу загрузки можете не делать проверок, уже же выяснили, что эта проверка нужна для успокоения души.


Добавлено через 2 минуты
Паблито, дело говорит. в этом случае будет загрузка только одного объекта.

11.01.2020, 19:37 [ТС] 23 sp >
Java
11.01.2020, 19:43 24

глядя на код выше я бы так не сказал
поэтому советую (не люблю это слово) потратить пару час на изучение библиотеки про которую я писал, там изучать особо нечего, надо просто понять для чего и когда ее можно применить

это пригодится в будущем, инфа 100%
как бонус — кода станет раз в 10 меньше и он станет понятнее

11.01.2020, 19:43
11.01.2020, 19:55 25

Вы же в своем Load_it извлекать пытаетесь в другом месте и в другую переменную sharedPreferences, что и приводит к непредвиденным результатам. извлекайте из mySettings и будет вам счастье.

Добавлено через 6 минут
Указывая явное имя настройкам вы исключаете путаницу, точно зная что и откуда грузится. Код с сохранением и извлечением настроек с именем я вам привел выше. Просто примените его в ваших целях. +Паблито подкинул хорошую идею с загрузкой одного объекта, можно реализовать потом, когда разберетесь со стандартными настройками.

Android, как сохранить куки?

Я пытаюсь Логгина на удаленный сервер с логином и паролем, и это сделано. Но когда я удаление запрос с паролем и логином и перезапустить мое приложение, я не могу войти на том же сервере. Мне сказали, что я могу сделать это, потому что куки должны быть сохранены автоматически. Что я делаю неправильно?

Например, у нас есть DefauktHttpClient. Как хранить куки там? Каков цикл их хранения? Если я правильно понимаю, печенье помочь пользователю оставаться loginned на сервере. (Мы tolking о logining от мобильного устройства). Моя цель состоит в том, чтобы не отправить логин / пароль пользователя для выполнения каждой операции. Как правильно это сделать?

Куки значения в заголовке HTTP в виде ключа: значение. И информация о пользователе вошедшего обычно хранится здесь в виде какой — то сгенерированный ключ авторизации. Для примера печенье будет идентификатором пользователя: 1234

Вы также можете написать свой собственный простой менеджер печенья. После того, как вы послали использовать запрос Войти HttpURLConnection метод (или похожий) к getHeaderFields().get(«set-cookie») . Сохранить все кук или те , которые вам нужны , и до следующего использования запроса setRequestProperty(«Cookie», savedCookies) . Для экономии вы можете использовать SharedPreferences.

Полный список


— хранение данных с помощью Preferences

Хватит об Intent и Activity. Поговорим о хранении данных. В Android есть несколько способов хранения данных:

Preferences — в качестве аналогии можно привести виндовые INI-файлы

SQLite — база данных, таблицы

обычные файлы — внутренние и внешние (на SD карте)

Мы начнем с самого простого – Preferences. Значения сохраняются в виде пары: имя, значение. Так же, как и например extras в Intent.

Разработаем приложение. В нем будет поле для ввода текста и две кнопки – Save и Load. По нажатию на Save мы будем сохранять значение из поля, по нажатию на Loadзагружать.

Project name: P0331_SharedPreferences
Build Target: Android 2.3.3
Application name: SharedPreferences
Package name: ru.startandroid.develop.p0331sharedpreferences
Create Activity: MainActivity

Откроем main.xml и создадим такой экран:

Поле ввода и две кнопки.

Теперь пишем код в MainActivity.java:

Определение элементов экрана, присвоение обработчиков и реализация onClick – тут все понятно и как обычно. Нам интересны методы, которые мы вызываем в onClick

saveText – сохранение данных. Сначала с помощью метода getPreferences получаем объект sPref класса SharedPreferences, который позволяет работать с данными (читать и писать). Константа MODE_PRIVATE используется для настройки доступа и означает, что после сохранения, данные будут видны только этому приложению. Далее, чтобы редактировать данные, необходим объект Editor – получаем его из sPref. В метод putString указываем наименование переменной – это константа SAVED_TEXT, и значение – содержимое поля etText. Чтобы данные сохранились, необходимо выполнить commit. И для наглядности выводим сообщение, что данные сохранены.

loadText – загрузка данных. Так же, как и saveText, с помощью метода getPreferences получаем объект sPref класса SharedPreferences. MODE_PRIVATE снова указывается, хотя и используется только при записи данных. Здесь Editor мы не используем, т.к. нас интересует только чтение данных. Читаем с помощью метода getString – в параметрах указываем константу — это имя, и значение по умолчанию (пустая строка). Далее пишем значение в поле ввода etText и выводим сообщение, что данные считаны.

Все сохраняем, запускаем приложение.

Для начала, давайте убедимся, что сохранение в принципе нужно. Введите какой-нить текст в поле ввода

и не нажимая кнопку Save закройте приложение кнопкой Назад.


Теперь найдите приложение в общем списке приложений эмулятора

и запустите снова.

Поле ввода пустое. То, что мы вводили – пропало при закрытии программы. Нажатие на Load тоже ничего не даст – мы ничего не сохраняли.

Давайте попробуем сохранять. Снова введите значение и нажмите Save.

Значение сохранилось в системе.

Теперь закроем приложение (Назад), снова откроем и нажмем Load. Значение считалось и отобразилось.

Давайте сделаем так, чтобы сохранение и загрузка происходили автоматически при закрытии и открытии приложения и не надо было жать кнопки. Для этого метод loadText будем вызывать в onCreate.

(Добавляете только строку 8)

а метод saveText — в onDestroy

Все сохраним, запустим. Теперь можно вводить данные, закрывать приложение, снова открывать и данные не потеряются. Кнопки Save и Load также работают. В какой момент сохранять данные в ваших приложениях – решать только вам. По нажатию кнопки, при закрытии программы или еще по какому-либо событию. Главное – теперь вы это умеете.

Еще немного слов по этой теме.

Preferences-данные сохраняются в файлы и вы можете посмотреть их. Для этого в Eclipse откройте меню Window > Show View > Other и выберите Android > File Explorer. Отобразилась файловая система эмулятора.
Открываем папку data/data/ru.startandroid.develop.p0331sharedpreferences/shared_prefs и видим там файл MainActivity.xml. Если его выгрузить на комп и открыть — увидим следующее:

Все верно, имя — saved_text и значение — abcdefg.

Обратите внимание, что в пути к файлу используется наш package.

Теперь разберемся, откуда взялось наименование файла MainActivity.xml. Кроме метода getPreferences, который мы использовали, есть метод getSharedPreferences. Он выполняет абсолютно те же функции, но позволяет указать имя файла для хранения данных. Т.е., например, если бы мы в saveText использовали для получение SharedPreferences такой код:

То данные сохранились бы в файле MyPref.xml, а не в MainActivity.xml.

Теперь если мы посмотрим исходники метода getPreferences, то видим следующее:


Используется метод getSharedPreferences, а в качестве имени файла берется имя класса текущего Activity. Отсюда и появилось имя файла MainActivity.xml.

— используете getPreferences, если работаете с данными для текущего Activity и не хотите выдумывать имя файла.

— используете getSharedPreferences, если сохраняете, например, данные — общие для нескольких Activity и сами выбираете имя файла для сохранения.

Кстати, в File Explorer вы можете видеть юниксовые rwx-права доступа к файлу. Попробуйте при сохранении данных использовать не MODE_PRIVATE, а MODE_WORLD_READABLE или MODE_WORLD_WRITEABLE и посмотрите, как будут меняться права.

Полный код MainActivity.java:

На следующем уроке:

— хранение данных с помощью SQLite

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Suvitruf’s Blog :: Gamedev suffering

Блог о разработке игр и серверных технологиях

Andro > 7 комментариев

Для большинства приложений требуется сохранить настройки, управляющие поведением программы. Android предоставляет несколько альтернативных способов сохранения данных приложения, каждый из которых оптимизирован для определенных нужд.


Общие настройки — простой и легкий механизм, основанный на парах «ключ — значение» и предназначенный для сохранения примитивных данных приложения, чаще всего пользовательских настроек.

Введение

Класс SharedPreferences позволяет создавать в приложении именованные ассоциативные массивы типа «ключ — значение», которые могут быть использованы различными компонентами приложения (работая при этом в контексте одного и того же приложения).

Общие настройки поддерживают базовые типы boolean, string, float, long и integer, что делает их идеальным средством для быстрого сохранения значений по умолчанию, переменных экземпляра класса, текущего состояния UI и пользовательских настроек.

Создание и сохранение настроек

Чтобы создать или изменить Общие настройки, нужно вызвать метод getSharedPreferences в контексте приложения, передавая имя общих настроек, которые вы хотите изменить. Настройки недоступны для других приложений.

Получение общих настроек

Надо передать в getSharedPreferences имя тех общих настроек, доступ к которым хотите получить, и используйте типизированный метод get , чтобы извлечь сохраненные значения. Передаются ключ и значение по умолчанию (используется случае, если для данного ключа пока что не сохранено никакое значение).

Очистка/удаление значения

Для очистки значений используйте методы SharedPreferences.Editor.remove(String key) и SharedPreferences.Editor.clear() .

Файл настроек хранится в /data/data/package_name/shared_prefs/имя_файла_настроек.xml. Можно удалить:

Preferences Framework

В примерах выше происходило обычное сохранение и восстанавлениеи нужных параметров. То есть, создаётся свой xml-файл разметки и размещаются там нужные элементы управления. Но Android для этих целей предоставляет собственный Preferences Framework, с помощью которого можно создавать индивидуальный набор предпочтений и встраивать их в приложения.

То есть, теперь нет необходимости создавать файл разметки и get/set параметров писать самим. Необходимо лишь в отдельном файле перечислить параметры, а Android уже остальное сделает. Предпочтения — это отдельная активность в приложении, вызываемая из активности. Сам Activity расширяется от класса PreferenceActivity . Предпочтения определяются в отдельном XML-файле, где корневым элементом является элемент

Мы определили две настройки: размер шрифта, язык приложения. С всё в целом понятно, простое поле. А вот для выбора языка посложнее элемент. Нас тут интересует 2 поля: android:entries и android:entryValues . Из названия, думаю, понятно их назначение.

Определение параметров в string.xml и array.xml

Естественно, необходимо определить все переменные. В string.xml:


А так же в array.xml:

PreferenceActivity

Для PreferenceActivity автоматически создаётся SettingsActivity . Нам в нём слегка необходимо изменить метод onCreate .

Метод addPreferencesFromResource() считывает установленные настройки из XML-файла, где хранятся наши ресурсы, и делает их доступными для программы. В результате мы должны увидеть настройки на экране. Если автоматически наше Activity не было зарегестрировано, то добавим в манифесте AndroidManifest.xml:

Ну и напишем код, чтобы при клике на меню, открывалось наше окно с настройками. Для этого определим метод по созданию меню и onCreateOptionsMenu и метод, отслеживающий нажатия по меню onOptionsItemSelected :

Теперь при вызове меню опций, нажимайте на пункт «Настройки» и откроется наше окно настроек.

Для сохранения предпочтений на выбор есть 4 класса:

  • CheckBoxPreference
  • EditTextPreference
  • ListPreference
  • RingtonePreference

Конкретно в данном примере используется EditTextPreference и ListPreference.

Так выглядит окно изменения для настроек:

Отслеживание изменений в общих настройках

Класс onSharedPreferenceChangeListener позволяет вызвать callback-метод в момент добавления, удаления или изменения конкретной Общей настройки. Используя этот обработчик, компоненты вашего приложения могут следить за изменениями в настройках, установленных пользователем, и обновлять пользовательский интерфейс или корректировать поведение программы.

This function is not relevant for a modern fragment-based PreferenceActivity

This function is not relevant for a modern fragment-based PreferenceActivity. Inflates the given XML resource and adds the preference hierarchy to the current preference hierarchy.

Такое сообщение вы увидите в SDK по поводу многих методов PreferenceActivity , у того же addPreferencesFromResource . Это означает, что методы устарели. В сущности, ничего фатального в этом нет, просто в более поздних версиях появились более удобные методы.


С версии 3.0 появились так называемые Fragments, с помощью которых можно работать с настройками.

Ещё раз повторю, если у вас старый вариант для работы с настройками используется, то он будет работать на всех устройствах нормально. Но если вы пишите для устройств с версией Android 3+, то лучше используйте фрагменты.

Как сохранить состояние кнопки в SharedPreferences в Android

Я хочу создать приложение контента, я загружать данные из JSON и когда пользователи нажимают на button сохранения этого контента в SQLitedatabase .
Я хочу использовать эту библиотеку для кнопки.
А для триггерной кнопки, я использую этот код

Я пишу ниже коды, когда нажать на кнопку я сохранить это содержание SQLitedatabase , но я не могу сохранить кнопку насытить в SharedPreferences !

Когда нажмите на кнопку ( булево проверено ) кнопка включения , а когда снова нажмите на кнопку выключить эту кнопку.

Я хочу , когда нажмите на кнопку, включите эту кнопку и сохранить в SharedPreferences и когда идти в другую activity и снова назад это activity смотрите включить эту кнопку НЕ выключайте . когда нажмите эту кнопку еще раз в то время отключить кнопку!

Активность кода:

Как я могу исправить мою проблему?

Ну что вам нужно сохранить состояние при нажатии на кнопку. Например :

Тогда вы должны загрузить его в вашем onCreate() :

Может быть, этот пример поможет вам.

РЕДАКТИРОВАТЬ

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

// здесь ваше состояние будет сохранено для вашей кнопки, как только вы закончите работать с базой данных, после того, что в вашем onResume (), вы можете изменить это состояние ложных (выключено) в случае, если вы хотите just for that post

У меня возникла проблема с добавлением файла cookie в менеджер файлов cookie во время запуска.Добавление Cookie в Менеджер Cookie в приложении Android от SharedPreference


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

Текущий номер, с которым я столкнулся, — Во время входа я могу сохранить cookie для совместного использования. Когда приложение убито и перезагружено, я получаю строку cookie от общего предпочтения, но когда я добавляю это в свой файл cookiemanager, он все равно выводит меня на экран входа в систему. Кроме того, когда я печатаю Sharedprefrence после этого в своих журналах, я вижу URI как null, тогда как в приложении — когда я устанавливаю cookie — я вижу, что мой URI соответствует файлу cookie get domain value (Не уверен, что он работает именно так или не)

Поток Mainactivity отправляет команду чтения серверу, если сервер видит, что нет файла cookie, и пользователь не вошел в систему, он отправляет статус 0; в противном случае 1. Если статус равен 0, я перехожу к активности входа в систему, в противном случае — к действию на главном экране. Это работает нормально, но только тогда, когда приложение убито, поскольку файл cookie удален, он выводит меня на экран входа в систему.

Моя Основная деятельность/Войти деятельность и деятельность Главного экрана — Вызывает класс с асинхронной задачей для HttpConnection — который записывает в общую предпочтительность.

будет признателен, если кто-то может помочь мне с этим. Я действительно ломаю голову здесь.

У меня возникла проблема с добавлением файлов cookie в диспетчер файлов cookie во время запуска.

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

Текущая проблема, с которой я сталкиваюсь, — Во время входа в систему я могу сохранить cookie в общий доступ. Когда приложение убито и перезапущено, я получаю строку cookie из общего предпочтения, но когда я добавляю это в свой cookiemanager — он все равно выводит меня на экран входа в систему. Кроме того, когда я печатаю Sharedprefrence после этого в моих журналах, я вижу URI как ноль, а в приложении — когда я устанавливаю cookie — я вижу, что мой URI, соответствующий cookie, получает значение домена (не уверен, работает ли он именно так или не)

Поток Mainactivity отправляет команду чтения на сервер, если сервер видит, что нет файла cookie и пользователь не вошел в систему, он отправляет статус 0; в противном случае 1. Если статус равен 0, я перехожу к активности входа в систему, в противном случае к активности на главном экране. Это работает нормально, но только когда приложение убито, так как cookie удаляется, он выводит меня на экран входа в систему.

Моя основная активность/активность входа в систему и активность на главном экране — вызывает класс с асинхронной задачей для httpconnection — которая записывает в общие предпочтения.

Буду признателен, если кто-то может помочь мне с этим. Я действительно ломаю голову здесь.

Руководство Andro >

View more Tutorials:

1- Что такое SharedPreferences?

Для начала чтобы прояснить что такое SharedPreferences посмотрим на следующий случай:

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

Цукерберг рекомендует:  Аутентификация через Twitter
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих