AndroidSocialNetworks - зручна робота з соціальними мережами


 AndroidSocialNetworks — це бібліотека для Android, яка робить роботу з соц. мережами простіше. Якщо ви коли-небудь пробували працювати з соц. мережами, то знаєте наскільки це важко. Треба прочитати документацію для кожної соц. мережі, завантажити і підключити SDK або сторонню бібліотеку, подбати про життєвий цикл http запитів. AndroidSocialNetwork повинна зробити ваше життя простіше, вона містить загальний інтерфейс для Facebook, Twitter, LinkedIn і Google Plus — просто сбілдіте SocialNetworkManager за допомогою SocialNetworkManager.Build -> додайте його в FragmentManager -> налаштуйте AndroidManifest.xml -> працюйте з налаштованими соц. мережами. Ви зможете робити login, постити оновлення статусу, постити фотки, додавати / видаляти друзів.
 
 

Як користуватися

Для початку нам потрібно ініціалізувати SocialNetworkManager, це робиться за допомогою SocialNetworkManager.Builder. SocialNetworkManager це Fragment з retainedInstance (true).
Це необхідно для того, щоб була можливість стежити за життєвим циклом.
Після того як ми ініціалізували SocialNetworkManager, його необхідно додати в FragmentManager. Врахуйте, що для сумісності необхідно використовувати SupportFragmentManager.
 
 
mSocialNetworkManager = (SocialNetworkManager) getFragmentManager().findFragmentByTag(SOCIAL_NETWORK_TAG);

if (mSocialNetworkManager == null) {
    mSocialNetworkManager = SocialNetworkManager.Builder.from(getActivity())
                .twitter(<api_token>, <api_secret>)
                .linkedIn(<api_token>, <api_secret>, "r_basicprofile+rw_nus+r_network+w_messages")
                .facebook()
                .googlePlus()
                .build();
    getFragmentManager().beginTransaction().add(mSocialNetworkManager, SOCIAL_NETWORK_TAG).commit();
}

Оскільки додавання фрагмента — це транзакція, ми не можемо відразу почати використовувати SocialNetworkManager, для цього передбачений callback — SocialNetworkManager.OnInitializationCompleteListener.
 
 
mSocialNetworkManager.setOnInitializationCompleteListener(this);

Якщо нам, наприклад, треба показувати, чи підключений Twitter, оновлювати UI потрібно саме в onSocialNetworkManagerInitialized.
 
Кожен метод запиту може отримувати listener, а може і не отримувати, у 2 випадку буде викликаний глобальний, якщо він встановлений:
Встановлюємо глобальний listener на Login
 
@Override
public void onSocialNetworkManagerInitialized() {
    super.onSocialNetworkManagerInitialized();

    for (SocialNetwork socialNetwork : mSocialNetworkManager.getInitializedSocialNetworks()) {
        socialNetwork.setOnLoginCompleteListener(this);
    }
}


Викликаємо логін для LinkedIn
 
mSocialNetworkManager.getLinkedInSocialNetwork().requestLogin();

Результат отримуємо в глобальному callback.
 
@Override
public void onLoginSuccess(int socialNetworkID) {

}

@Override
public void onError(int socialNetworkID, String requestID, String errorMessage, Object data) {

}

Якщо ми не хочемо користуватися глобальними callbacks, можемо використовувати локальні:
 
mSocialNetworkManager.getGooglePlusSocialNetwork().requestLogin(new DemoOnLoginCompleteListener());

private class DemoOnLoginCompleteListener implements OnLoginCompleteListener {
    @Override
    public void onLoginSuccess(int socialNetworkID) {

    }

    @Override
    public void onError(int socialNetworkID, String requestID, String errorMessage, Object data) {

    }
}

Такий механізм можна використовувати не тільки для requestLogin, всі основні методи підтримують 2 типу завдання callback.
 
 
Своя реалізація соц. мережі
Якщо вам не вистачає доступних соц. мереж, і ви хочете додати підтримаю інший, то можете зробити це за допомогою методу addSocialNetwork (SocialNetwork socialNetwork).
Врахуйте, що робити це потрібно в onSocialNetworkManagerInitialized. Також врахуйте, що ID вашої соц. мережі повинен бути унікальним. 1, 2, 3, 4 — вже зарезервовані.
 
 

Доступні методи

 
 
Повний список
 
 
 
Підтримка соц. мережами
 
 
 

Як це працює

Як можна зрозуміти, SocialNetworkManager — це фрагмент (з support v4 для сумісності). Це потрібно для того, щоб можна було зручно відстежувати життєвий цикл програми. Він також зроблений retainedInstance (true) для того, щоб мережеві запити нормально переживали зміни lifecycle…
 
SocialNetworkManager.Builder всього лише готує Bundle з параметрами.
 
public SocialNetworkManager build() {
    Bundle args = new Bundle();

    if (!TextUtils.isEmpty(twitterConsumerKey) && !TextUtils.isEmpty(twitterConsumerSecret)) {
        args.putString(PARAM_TWITTER_KEY, twitterConsumerKey);
        args.putString(PARAM_TWITTER_SECRET, twitterConsumerSecret);
    }

    if (!TextUtils.isEmpty(linkedInConsumerKey) && !TextUtils.isEmpty(linkedInConsumerSecret)
                    && !TextUtils.isEmpty(linkedInPermissions)) {
        args.putString(PARAM_LINKEDIN_KEY, linkedInConsumerKey);
        args.putString(PARAM_LINKEDIN_SECRET, linkedInConsumerSecret);
        args.putString(PARAM_LINKEDIN_PERMISSIONS, linkedInPermissions);
    }

    if (facebook) {
        args.putBoolean(PARAM_FACEBOOK, true);
    }

    if (googlePlus) {
        args.putBoolean(PARAM_GOOGLE_PLUS, true);
    }

    SocialNetworkManager socialNetworkManager = new SocialNetworkManager();
    socialNetworkManager.setArguments(args);
    return socialNetworkManager;
}

Усередині SocialNetworkManager все ініціалізовані соц. мережі зберігаються в HashMap
 
private Map<Integer, SocialNetwork> mSocialNetworksMap = new HashMap<Integer, SocialNetwork>();

У callbacks lifecycle ми проходимо по всіх соц. мережам і прокидаємо значення:
 
public void onStop() {
    …
    for (SocialNetwork socialNetwork : mSocialNetworksMap.values()) {
        socialNetwork.onStop();
    }
}

Кожна соц. мережа повинна успадковуватися від абстрактного класу SocialNetwork.
 
Потрібно перевизначити метод getID (), саме по поверненню значенню цього методу соц. мережі та будуть відрізнятися. У своїх реалізаціях, я для зручності робив ID public, щоб можна було використовувати socialNetwork.getID () в switch.
 
public class GooglePlusSocialNetwork extends SocialNetwork …
    public static final int ID = 3;

Методи lifecycle не обов'язкові для перевизначення, тільки з потреби.
 
Для реалізації методів requestLogin, requestPerson і т.д. необхідно перевизначати методи з callbackамі. Це необхідно через підтримки як глобальних, так і локальних listeners.
 
Callbackі зберігаються в Maps
 
protected Map<String, SocialNetworkListener> mGlobalListeners = new HashMap<String, SocialNetworkListener>();
protected Map<String, SocialNetworkListener> mLocalListeners = new HashMap<String, SocialNetworkListener>();

Коли ми додаємо глобальний callback, він додається в mGlobalListeners, далі при будь-якому виклику без callback ми викликаємо метод з callback, передаючи null.
 
 
public void requestSocialPerson(String userID) {
    requestSocialPerson(userID, null);
}

Метод з callback реєструє listener.
 
public void requestSocialPerson(String userID, OnRequestSocialPersonCompleteListener onRequestSocialPersonCompleteListener) {
    registerListener(REQUEST_GET_PERSON, onRequestSocialPersonCompleteListener);
}


Реалізація registerListener досить проста:
 
private void registerListener(String listenerID, SocialNetworkListener socialNetworkListener) {
    if (socialNetworkListener != null) {
        mLocalListeners.put(listenerID, socialNetworkListener);
    } else {
        mLocalListeners.put(listenerID, mGlobalListeners.get(listenerID));
    }
}

 
Мережеві запити
Для виконання мережевих запитів використовується або методи SDK:
 
Request request = Request.newMeRequest(currentSession, new Request.GraphUserCallback() {
    @Override
    public void onCompleted(GraphUser me, Response response) {
        …

request.executeAsync();

або AsyncTasks, не варто лякатися асінк ТАСК, якщо ви пам'ятаєте, то ми використовуємо їх у Fragmentе в retainedInstance (true). Хороша стаття на цю тему: http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
 
 

Важливо

 
     
  • Бібліотека не піклуватися про стан вашого додатки і жизненого циклу, ви повинні робити це самі!
  •  
  • Якщо Ви використовуєте Google Plus, додайте цей код у вашу активують:
     
     
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        /**
         * This is required only if you are using Google Plus, the issue is that there SDK
         * require Activity to launch Auth, so library can't receive onActivityResult in fragment
         */
        Fragment fragment = getSupportFragmentManager().findFragmentByTag(BaseDemoFragment.SOCIAL_NETWORK_TAG);
        if (fragment != null) {
                fragment.onActivityResult(requestCode, resultCode, data);
            }
        }
    

      
  •  
 
Посилання на бібліотеку: https://github.com/antonkrasov/AndroidSocialNetworks
Sample application: AndroidSocialNetworks APIDemos

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.