Простой способ интеграции Android-приложения с социальными сетями

в 16:36, , рубрики: android, android development, социальные сети, метки: ,

При разработке игрушки для Android'а у меня появилась идея добавить в нее немного социального взаимодействия для охвата большей аудитории. Сама игрушка не располагала к тому, чтобы распространятся «вирусным» способом, поэтому я решил ограничится публикацией результатов игры в социальных сетях в случае выигрыша и при условии попадания результата в локальную таблицу рекордов, и я стал искать решение этого вопроса.

Выбор социальной сети

Я себе поставил задачу публиковать сообщения не во всех социальных сетях сразу, а хотя бы в одной. Выбор встал между соц. сетями «ВКонтакте», «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» получил во время прогона на эмуляторе, так что возможно не везде будет срабатывать.

Автор: kruzhevnik

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js