[Из песочницы] AndroidSocialNetworks — удобная работа с социальными сетями

52a4c9d58a30d36edaf2055aecbdfb3b.pngAndroidSocialNetworks — это библиотека для 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 (, ) .linkedIn (, , «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 — уже зарезервированы.Доступные методы Полный список 6fcf7aa46059be7556a8d4acada207b2.pngПоддержка соц. сетями 8a71607111625fe729e5f61bc1a0c31a.pngКак это работает Как можно понять, 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 mSocialNetworksMap = new HashMap(); В 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 mGlobalListeners = new HashMap(); protected Map mLocalListeners = new HashMap(); Когда мы добавляем глобальный 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/AndroidSocialNetworksSample application: AndroidSocialNetworks APIDemos

© Habrahabr.ru