[Из песочницы] 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 (
@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
public class GooglePlusSocialNetwork extends SocialNetwork… public static final int ID = 3; Методы lifecycle не обязательны для переопределения, только по необходимости.Для реализации методов requestLogin, requestPerson и т.д. необходимо переопределять методы с callbackами. Это необходимо из-за поддержки как глобальных, так и локальных listeners.
Callbackи хранятся в Maps
protected Map
Реализация 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