

# やりたいこと

Androidからウェブサーバーにpostリクエストをし、  
クッキーを保存するようなアプリを作ろうとしています。  
(postのパラメータは、未実装です)

アクティビティを破棄しなければ、下記のコードでクッキーを保存し、渡すことができました。  
ただ、一度アプリを落とすとクッキーが消えてしまっています。

色々と調べてみましたが、原因がよく分かりません。  
sharedPreferencesなどに保存して、毎回取り出す必要があるのでしょうか。

Androidは初心者ですが、ご教授いただけると幸いです。  
よろしくお願いいたします。

# コード

[code]

    package com.example.test;
    
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.os.AsyncTask;
    import android.text.TextUtils;
    import android.util.Log;
    import android.widget.TextView;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
    import java.net.HttpCookie;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.List;
    import java.util.Map;
    
    public class HttpResponsAsync extends AsyncTask < Void, Void, String > {
    
        private TextView textView;
        static final String COOKIES_HEADER = "Set-Cookie";
        static java.net.CookieManager msCookieManager = new java.net.CookieManager();
    
        private Context context = null;
        private ProgressDialog dialog = null;
        private String title;
        private String msg;
    
        /**
         * コンストラクタ
         */
        public HttpResponsAsync(Context context) {
            super();
            this.context = context;
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // doInBackground前処理
        }
    
        @Override
        protected String doInBackground(Void...params) {
            String readSt = null;
    
    
            HttpURLConnection con = null;
            URL url = null;
            String urlSt = "https://URL.com";
    
            try {
                // URLの作成
                url = new URL(urlSt);
                // 接続用HttpURLConnectionオブジェクト作成
                con = (HttpURLConnection) url.openConnection();
                if (msCookieManager.getCookieStore().getCookies().size() > 0) {
                    //While joining the Cookies, use ',' or ';' as needed. Most of the server are using ';'
                    con.setRequestProperty("Cookie",
                        TextUtils.join(";", msCookieManager.getCookieStore().getCookies()));
                }
    
                // リクエストメソッドの設定
                con.setRequestMethod("POST");
                // リダイレクトを自動で許可しない設定
                con.setInstanceFollowRedirects(false);
                // URL接続からデータを読み取る場合はtrue
                con.setDoInput(true);
                // URL接続にデータを書き込む場合はtrue
                con.setDoOutput(true);
    
                // 接続
                con.connect();
                Map < String, List < String >> headerFields = con.getHeaderFields();
                List < String > cookiesHeader = headerFields.get(COOKIES_HEADER);
    
                if (cookiesHeader != null) {
                    for (String cookie: cookiesHeader) {
                        msCookieManager.getCookieStore().add(null, HttpCookie.parse(cookie).get(0));
                    }
                }
    
                InputStream in = con.getInputStream();
                readSt = readInputStream( in );
    
    
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return readSt;
        }
    
        public String readInputStream(InputStream in ) throws IOException,
        UnsupportedEncodingException {
            StringBuffer sb = new StringBuffer();
            String st = "";
    
            BufferedReader br = new BufferedReader(new InputStreamReader( in , "UTF-8"));
            while ((st = br.readLine()) != null) {
                sb.append(st);
            }
            try { in .close();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return sb.toString();
        }
    
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            // doInBackground後処理
            JSONArray jsonArray = null;
            try {
                // 配列を取得する場合
                jsonArray = new JSONObject(result).getJSONArray("data");
                int count = jsonArray.length();
                JSONObject[] bookObject = new JSONObject[count];
                for (int i = 0; i < count; i++) {
                    bookObject[i] = jsonArray.getJSONObject(i);
                    // String型の場合
                    String st = bookObject[i].getString("type");
                }
            } catch (JSONException e) {
            }
        }
    
    }
    
[/code]


CC BY-SA 3.0
2016-06-26T08:37:31.257
27091
2016-10-08T08:16:29.840
16957
question
android java
androidでのcookieManagerを使ったクッキーの保存


Cookieの永続化には一手間必要です。  
OkHttpなど使用されているHttp Clientによって選択も変わりますので  
「android cookie persistent」で検索されるといろいろ見つかります。


CC BY-SA 3.0
2016-06-28T14:05:26.357
27150
2016-06-28T14:05:26.357
15039
27091
answer