Facebook ログインを使用して Android アプリを作成していますが、セッションを内部メモリに永続化することに固執しています。これが私がそれをインスタンス化する方法です:
private static Session openActiveSession(Activity activity, boolean allowLoginUI, StatusCallback callback, List<String> permissions) {
OpenRequest openRequest = new OpenRequest(activity).setPermissions(permissions).setCallback(callback);
Session session = getSession(activity);
if (SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI) {
Session.setActiveSession(session);
session.openForRead(openRequest);
return session;
}
return null;
}
private static Session getSession(Activity activity) {
return new Builder(activity).setTokenCachingStrategy(new SharedPreferencesTokenCachingStrategy(activity)).build();
}
問題は、 isOpened() が常に false を返すため、セッションを復元できるかどうかをチェックするこのコードが起動しないことです。
if((facebookSession = getSession(this)) != null && facebookSession.isOpened()) {
waitDialog = ProgressDialog.show(this, getResources().getString(R.string.pleaseWait), getResources().getString(R.string.loadingData));
onPostLogin();
return;
}
私はこれらの2つの機能でこれを回避しようとしました:
private void saveFacebookSession() {
Bundle facebookCache = new Bundle();
Parcel parceledCache = Parcel.obtain();
Session.saveSession(facebookSession, facebookCache);
parceledCache.writeBundle(facebookCache);
try {
FileOutputStream output = openFileOutput(FACEBOOK_SESSION_FILE, MODE_PRIVATE);
byte[] marshalledParcel = parceledCache.marshall();
Editor prefsEditor = preferences.edit();
prefsEditor.putInt(RESTORE_BYTE_COUNT, marshalledParcel.length);
prefsEditor.commit();
output.write(marshalledParcel);
output.flush();
output.close();
} catch (Exception e) {
Log.e(getClass().getName(), "Could not save the facebook session to storage");
}
}
private boolean restoreFacebookSession() {
try {
FileInputStream input = openFileInput(FACEBOOK_SESSION_FILE);
int arraySize = preferences.getInt(RESTORE_BYTE_COUNT, -1);
if(arraySize == -1) {
Log.e(getClass().getName(), "Could not read the facebook restore size");
return false;
}
byte[] sessionData = new byte[arraySize];
input.read(sessionData);
Parcel readParcel = Parcel.obtain();
readParcel.unmarshall(sessionData, 0, arraySize);
Bundle sessionBundle = readParcel.readBundle();
facebookSession = Session.restoreSession(getApplicationContext(), null, (StatusCallback)this, sessionBundle);
return true;
} catch (Exception e) {
Log.e(getClass().getName(), "Could not restore the session");
return false;
}
}
この 2 番目の方法は、バンドルの読み取り時にマジック ナンバーに関する例外がスローされるため、機能しません。
何か案は?