Выбор социальной сети
Я себе поставил задачу публиковать сообщения не во всех социальных сетях сразу, а хотя бы в одной. выбор встал между соц. сетями «ВКонтакте», «Facebook» и «Twitter». Так как хотелось распространять игру по всему миру, а не только на просторах СНГ, сеть «ВКонтакте» практически сразу была исключена из списка. Выбор между «Facebook» и «Twitter» был сделан просто, и может, не совсем объективно — «Facebook» мне не очень нравится, пользоваться я им не люблю из-за, на мой взгляд, крайне неудачного интерфейса, поэтому я решил использовать «Twitter», тем более, что в нем существует возможность интегрировать аккаунт с «Facebook» и дублировать туда сообщения.
Поиск способа реализации
Искать способ реализовать свою идею я начал с Twitter4j SDK. К сожалению, кроме сухой javadoc документации, представляющей собой простое справочное руководство, и отрывочных примеров, там ничего больше не обнаружилось. Также было просмотрено немало тем на stackoverflow.com, но и там ничего удовлетворительного не обнаружилось (если честно, не хотелось сильно углубляться в дебри TwitterAPI, да и к тому же мои знания Java и платформы Android оставляют желать лучше).
Есть идея, есть решение
Наконец блуждание в гугле навело меня на статью Интеграция Android-приложения с Twitter. Некоторые идеи были не совсем понятны, но код показался достаточно простым, и его автор утверждал, что его решение работает. Потратив немного времени, я адаптировал код автора для своего приложения, и стал проверять его работоспособность. Процедура авторизации проходила (хотя и показалась мне довольно непонятной для обычного, далекого от IT пользователя), но дальше дело не двигалось. Как отсылать сообщения (вернее, в какой момент), я так и не разобрался.
Также не понравилось, что остается висеть открытый браузер, который вылезает после закрытия моего приложения. Поковырявшись денек, я оставил идею использовать TwitterAPI и стал искать более простое решение.
Самое простое решение
Самое простое решение, которое меня вполне удовлетворило, было найдено, более того, оно было в некоторых аспектах даже лучше, чем предыдущее.
Суть идеи в том, чтобы просто отсылать данные, а куда они будут реально отправлены, решает система и пользователь. Из плюсов — то, что пользователю предоставляется возможность выбрать, куда он хочет отправить сообщение — SMS/MMS, твиттер, фейсбук, в вконтакте, или что-то еще. Я решил, что пользователь наиболее активно пользуется скорее всего только одной из социальных сетей, и ему не понадобится размещать пост в нескольких сетях, к тому же это решение в данном аспекте соответствовало первому варианту. Из минусов данного решения можно отметить то, что у пользователя должно быть установлено соответствующее клиентское приложение (для твиттера в маркете, помимо официального клиента есть много сторонних). Существование клиента для Фейсбук я не проверял, но полагаю, что оно либо есть, либо появится в довольно ближайшем будущем. Клиент для в ВКонтакте, насколько я в курсе, уже создан (где-то тут была новость о конкурсе на его разработку), и его официальное появление тоже вопрос ближайшего будущего. Также я решил, что пользователь, который достаточно активен в соц. сети для того, чтобы опубликовать там результаты игры, уже озаботился установкой клиента для нее.
Собственно, само решение — это пять строчек кода, и мне уже стыдно, что я томил читателя своими нудными рассуждениями, вместо того, чтобы сразу опубликовать его:
// в коде моей Activity void shareTextInSocialMedia(String msg) { //canShareText(); Intent share = new Intent(Intent.ACTION_SEND); share.putExtra(Intent.EXTRA_TEXT, msg); share.setType("text/plain"); //startActivity(Intent.createChooser(share, "Share this via")); startActivityForResult(Intent.createChooser(share, "Share this via"), 0); }
При выполнении приведенного кода возникает список приложений, способных произвести отправку (у меня это Send SMS/MMS и Post to Twitter при установленном твиттер-клиенте), пользователь выбирает нужное приложение, и продолжает работу уже в нем.
Большой минус — мое приложение закрывается после выполнения этого кода, причем не сразу — в случае твиттер-клиента там сначала можно отредактировать сообщение, и в это время моя программа висела в фоне и играла музыку, и пропала только после нажатия кнопки «Твитнуть». Я попробовал использовать startActivityForResult вместо startActivity, но ничего не изменилосьВ случае отправки SMS мое приложение тоже пропало, хотя момент я не засек так же точно. На stackoverflow.com мне сказали, что проблема в твиттер-клиенте («Ah, I see. This is a classic example of application does not respecting Android lifecycle (shame on Twitter)»). Я сначала удовлетворился тем, что от меня тут ничего не зависит, но потом проверил SMS способ, и несколько засомневался, так как он тоже не работал корректно.
Бонус для самых упорных
Меня несколько напрягало то, что в случае отсутствия приложений, способных обработать отправку сообщения, пользователю будет показано противное сообщение об этом, и я захотел проверить, нужно ли показывать кнопку «Share» в своем приложении, и StackOverflow подсказал мне решение:
boolean canShareText( boolean allowSmsMms) { PackageManager manager = getPackageManager(); List<ResolveInfo> list = manager.queryIntentActivities(createShareIntent(""), 0); if (list != null && list.size() > 0) { if (allowSmsMms) return true; int handlersCount = 0; for (ResolveInfo li : list) { if (li!=null && li.activityInfo!=null && li.activityInfo.packageName!=null && li.activityInfo.packageName=="com.android.mms") {} else ++handlersCount; } if (handlersCount>0) return true; } return false; }
Я решил не показывать кнопку «Share», если доступна отсылка только SMS/MMS, и добавил опциональную возможность проигнорировать это приложение. Имя пакета «com.android.mms» получил во время прогона на эмуляторе, так что возможно не везде будет срабатывать.
ссылка на оригинал статьи http://habrahabr.ru/post/164187/
Добавить комментарий