Error invalid request error description sdk options is undefined

Если установлено приложение VK, при авторизации через VKShareDialogController в открывшемся VK появляется пустая белая страница с текстом: { "error" : "invalid_request", "e...

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.

Already on GitHub?
Sign in
to your account


Closed

Friend-LGA opened this issue

Mar 18, 2015

· 7 comments

Comments

@Friend-LGA

Если установлено приложение VK, при авторизации через VKShareDialogController в открывшемся VK появляется пустая белая страница с текстом:

{
    "error" : "invalid_request",
    "error_description" : "sdk options is undefined"
}

Если VK не установлено, то авторизация успешно проходит внутри VKShareDialogController’a.
В чем проблема я так осознать и не смог, все схемы указаны верно, инициализация VKShareDialogController выглядит так:

VKShareDialogController *shareDialog = [VKShareDialogController new];
shareDialog.text         = text;
shareDialog.shareLink    = [[VKShareLink alloc] initWithTitle:text link:link];

Версия SDK 1.1.0, версия приложения VK самая свежая 2.2, версия iOS 8.2

@RomanTruba

А при обычной авторизации всё норм? Разработчики серверной части говорят, что это означает, что bundle_id оказался nil при авторизации

@Friend-LGA

Ну что значит при обычной? Я в VKSdk поменял метод авторизации таким образом:

+ (void)authorize:(NSArray *)permissions
     revokeAccess:(BOOL)revokeAccess
       forceOAuth:(BOOL)forceOAuth
{
    [self authorize:permissions
       revokeAccess:revokeAccess
         forceOAuth:forceOAuth
              inApp:YES];
}

VKShareDialogController стал вызывать авторизацию внутри самого себя, и все отлично работает.

@RomanTruba

У вас 8.2 релизная версия, не бета?
Можете проверить на тестовых приложениях, приходит ли в метод
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
sourceApplication вашего приложения, не равен ли он nil?

@Friend-LGA

Проверю, немного позже, на неделе постараюсь найти время

@petropavel13

@Dreddik у меня подобная проблема.

Вот так пытаюсь авторизоваться:

[VKSdk authorize:@[VK_PER_OFFLINE]];

Вот тут:

+ (void)authorize:(NSArray *)permissions
     revokeAccess:(BOOL)revokeAccess
       forceOAuth:(BOOL)forceOAuth
            inApp:(BOOL)inApp
          display:(VKDisplayType)displayType

Формируется вот такой урл (id изменен):
Printing description of urlToOpen:
vkauthorize://authorize?client_id=1234567&scope=offline&sdk_version=1.1.7&revoke=0

Вот тут:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

Получаю следующий ответ:
Printing description of url:
vk1234567://authorize#error=access_denied&error_reason=sdk_error&error_description=sdk%2520options%2520is%2520undefined
Printing description of sourceApplication:
com.vk.vkhd

Пробовал на sdk 1.1.7 и 1.1.6

ЧЯДНТ?

@DmIvanov

@Dreddik 2 дня уже бьюсь с такой же проблемой при интеграции СДК в новое приложение.
Инициализирую СДК, запрашиваю авторизацию, СДК формирует урл (при наличии приложения: vkauthorize://authorize?scope=notify%2Cfriends%2Cphotos%2Coffline&revoke=1&sdk_version=1.2.2&client_id=ххххх — айдишник приложения убрал). Переходим в вк-приложение и возвращаемся оттуда с вышеописанной ошибкой access_denied.

Старые приложения работают хорошо на той же версии СДК (1.2.2). Ссылка авторизации вк-приложения идентична (за исключением другого айдишника моего приложения). Интерсно, что проблема только при авторизации через vk-приложение, через браузер всё проходит корректно — авторизация проходит, в приложение возвращается вк-токен. Проверил на разных девайсах, под разными вк-аккаунтами.

Возможно имеет значение то, что проблема появилась при использовании СДК из свифта

UPD: Проверил на другом свифтовом приложении — там всё работает, так что дело не в свифте

Буду рад любой помощи

@DmIvanov

Разобрался — в админке приложения не привязан был bundle id. Банально.. не подумал об этом всерьёз, потому что работала авторизация через сафари, почему-то при авторизации через браузер это не учитывается.

Содержание

  1. Как исправить ошибку <«error»:»invalid_request»,»error_description»:»Security Error»>?
  2. Error invalid request error description sdk fingerprint is incorrect на Андроид: что это?
  3. Причины
  4. Что делать?
  5. Как сделать перезагрузку операционной системы Андроид?
  6. Что дает перезагрузка смартфона?
  7. SDK options is undefined #190
  8. Comments
  9. Footer
  10. Can’t sign in to VK with installed Official VK Client about asne HOT 5 CLOSED
  11. Comments (5)
  12. Related Issues (20)
  13. Recommend Projects
  14. React
  15. Vue.js
  16. Typescript
  17. TensorFlow
  18. Django
  19. Laravel
  20. Recommend Topics
  21. javascript
  22. server
  23. Machine learning
  24. Visualization
  25. Recommend Org
  26. Facebook
  27. Microsoft
  28. sdk_fingerprint is incorrect #490
  29. Comments

Как исправить ошибку <«error»:»invalid_request»,»error_description»:»Security Error»>?

В сегодняшней статье мы рассмотрим с вами ошибку <«error»:»invalid_request»,»error_description»:»Security Error»>, которая наводит на многих пользователей шок, в первую очередь, благодаря своей ужасной длине.

Возникает данная ошибка всякий раз, когда кто-то попытается выполнить авторизацию с помощью социальной сети ВКонтакте где-нибудь на другом веб-ресурсе, а таких сейчас ужасно много. Причем, стоит заметить, ошибка эта прежде всего возникает у пользователей браузера Google Chrome, впрочем, и на других браузерах ее появление также возможно.

Причина ошибки <«error»:»invalid_request»,»error_description»:»Security Error»>– выполненный ранее вход в учетную запись ВК. По крайней мере, так утверждает сама техническая поддержка ВКонтакте. И, как показала практика, это действительно так.

Если вы и сами повстречались с ошибкой <«error»:»invalid_request»,»error_description»:»Security Error»>, то вам нужно сделать следующее:

  • выйдите из свой учетной записи ВК в браузере;
  • затем снова войдите в нее;
  • далее переходим на нужный вам сайт и проводим авторизацию с помощью ВК – проблема решена.

Как видите, ошибка <«error»:»invalid_request»,»error_description»:»Security Error»>решается буквально за пару-тройку минут, после чего вы можете заходить на любые веб-ресурсы в сети через учетку ВКонтакте. Мы надеемся, что данный материал помог вам устранить проблему.

Источник

Error invalid request error description sdk fingerprint is incorrect на Андроид: что это?

Такой сбой происходит каждый раз, когда кто-то хочет авторизоваться посредством применения соцсети ВКонтакте где-то на другом интернет-портале, а таких сегодня очень большое количество. Кстати, следует отметить, ошибка данная первостепенно возникает у пользователей браузера Гугл Хром, однако, и на других браузерах появится вполне может. Главное не переживать и постараться устранить проблему самостоятельно, следуя советам специалистов.

Причины

Причина сбоя <«error»:»invalid_request»,»error_description»:»Security Error»>– проведенный заблаговременно вход в аккаунт ВКонтакте. По крайней мере, так сообщает непосредственно техподдержка популярной среди пользователей социальной сети. И, действительно, это так, практический опыт многих это доказывает.

Что делать?

Когда пользователю пришло сообщение с ошибкой <«error»:»invalid_request»,»error_description»:»Security Error»>, то необходимо руководствоваться инструкцией.

Алгоритм действий:

  1. Выйти из свой профиля в социальной сети ВКонтакте в своем браузере.
  2. После опять войти в свою учетную запись в соцсети ВК.
  3. Найти необходимый портал и войти на авторизовавшись посредством учетной записи ВКонтакте – ошибка пропадет.

Как становится понятно, если действовать по инструкции, то сбой <«error»:»invalid_request»,»error_description»:»Security Error»>будет устранен буквально за считанные минуты, после чего пользователь сможет входить на любые сайты в интернете через учетную запись социальной сети ВК.

Как сделать перезагрузку операционной системы Андроид?

Первым делом надо зайти в «Меню» смартфона и нажать на «Настройки», далее выбрать категорию «Восстановление и сброс».

По представленному перечню надо опустится в самый низ и кликнуть на «Сброс настроек» (этот пункт на различных мобильных устройствах может иметь разное название: «Сбросить настройки телефона», «Общий сброс», «Стереть все данные», например). Система направит предупредительное сообщение о том, что при сбрасывании настроек удалятся все личные информационные данные, программы, файловые документы.

Что дает перезагрузка смартфона?

Если перезагрузить мобильный, то очистится оперативная память всего лишнего, что ее захламляло, и нормализуется функционирование программ без каких-то негативных последствий для Андроид или другой операционной системы.

К примеру, веб-приложение «диспетчер памяти» элементарно убивает все программы, что применяет пользователь гаджета. Однако, отдельные приложения просто обязаны функционировать, и когда не знаешь, как действовать правильно, лучше обратиться к специалисту.

Источник

SDK options is undefined #190

Если установлено приложение VK, при авторизации через VKShareDialogController в открывшемся VK появляется пустая белая страница с текстом:

Если VK не установлено, то авторизация успешно проходит внутри VKShareDialogController’a.
В чем проблема я так осознать и не смог, все схемы указаны верно, инициализация VKShareDialogController выглядит так:

Версия SDK 1.1.0, версия приложения VK самая свежая 2.2, версия iOS 8.2

The text was updated successfully, but these errors were encountered:

А при обычной авторизации всё норм? Разработчики серверной части говорят, что это означает, что bundle_id оказался nil при авторизации

Ну что значит при обычной? Я в VKSdk поменял метод авторизации таким образом:

VKShareDialogController стал вызывать авторизацию внутри самого себя, и все отлично работает.

У вас 8.2 релизная версия, не бета?
Можете проверить на тестовых приложениях, приходит ли в метод
— (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
sourceApplication вашего приложения, не равен ли он nil?

Проверю, немного позже, на неделе постараюсь найти время

@Dreddik у меня подобная проблема.

Вот так пытаюсь авторизоваться:

Формируется вот такой урл (id изменен):
Printing description of urlToOpen:
vkauthorize://authorize?client_id=1234567&scope=offline&sdk_version=1.1.7&revoke=0

Получаю следующий ответ:
Printing description of url:
vk1234567://authorize#error=access_denied&error_reason=sdk_error&error_description=sdk%2520options%2520is%2520undefined
Printing description of sourceApplication:
com.vk.vkhd

Пробовал на sdk 1.1.7 и 1.1.6

@Dreddik 2 дня уже бьюсь с такой же проблемой при интеграции СДК в новое приложение.
Инициализирую СДК, запрашиваю авторизацию, СДК формирует урл (при наличии приложения: vkauthorize://authorize?scope=notify%2Cfriends%2Cphotos%2Coffline&revoke=1&sdk_version=1.2.2&client_id=ххххх — айдишник приложения убрал). Переходим в вк-приложение и возвращаемся оттуда с вышеописанной ошибкой access_denied.

Старые приложения работают хорошо на той же версии СДК (1.2.2). Ссылка авторизации вк-приложения идентична (за исключением другого айдишника моего приложения). Интерсно, что проблема только при авторизации через vk-приложение, через браузер всё проходит корректно — авторизация проходит, в приложение возвращается вк-токен. Проверил на разных девайсах, под разными вк-аккаунтами.

Возможно имеет значение то, что проблема появилась при использовании СДК из свифта

UPD: Проверил на другом свифтовом приложении — там всё работает, так что дело не в свифте

Буду рад любой помощи

Разобрался — в админке приложения не привязан был bundle id. Банально.. не подумал об этом всерьёз, потому что работала авторизация через сафари, почему-то при авторизации через браузер это не учитывается.

© 2023 GitHub, Inc.

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

Can’t sign in to VK with installed Official VK Client about asne HOT 5 CLOSED

You got it in when try to login?

sough commented on January 16, 2023

After login and login is successful, coz vk app become logged in

gorbin commented on January 16, 2023

Hello, update lib version to 0.3.1 and check it — I check on tutorial app — everything works fine

sough commented on January 16, 2023

I checked on your tutorial ru-branch — got another error message — «sdk_fingerprint is incorrect»

gorbin commented on January 16, 2023

thats mean you should cheack your vk app settings — all apps made for my vk app sdk fingerprint and you will get this error only if you fingerprint in vk app will not match your compiled app. Check this — https://github.com/gorbin/ASNE/wiki/Create-Vkontakte-App

  • OkAuthActivity — Unable to find
  • cannot find symbol method OnGetFriendsIdComplete
  • Not getting Login success Callback from any social login HOT 1
  • Email null for Facebook, twitter, linkedin HOT 4
  • Requesting Detail profile of user for Facebook App crashes
  • Getting a Attempt to invoke virtual method ‘android.support.v4.app.FragmentManager android.support.v4.app.FragmentActivity.getSupportFragmentManager()’ on a null object reference HOT 3
  • While Login on LinkedIn getting this error HOT 1
  • «Must be called from main thread of process» Error in OkAuthActivity.java
  • Not requested Vk email. Field always is null.
  • Error:Configuration with name ‘default’ not found.
  • Confustion about setup
  • Incompatible types SocialNetworkManager
  • get twitter follower counts
  • Error:Error converting bytecode to dex HOT 1
  • Security warning HOT 5
  • Dead project
  • DialogFragment instead of Fragment HOT 1
  • Error: Can’t get personStatus)
  • «java.lang.IncompatibleClassChangeError» If I include GooglePlus dependency
  • For LinkedIn its not working

Recommend Projects

React

A declarative, efficient, and flexible JavaScript library for building user interfaces.

Vue.js

🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

Typescript

TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

TensorFlow

An Open Source Machine Learning Framework for Everyone

Django

The Web framework for perfectionists with deadlines.

Laravel

A PHP framework for web artisans

Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

javascript

JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

Some thing interesting about web. New door for the world.

server

A server is a program made to process requests and deliver data to clients.

Machine learning

Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

Visualization

Some thing interesting about visualization, use data art

Some thing interesting about game, make everyone happy.

Recommend Org

Facebook

We are working to build community through open source technology. NB: members must have two-factor auth.

Microsoft

Open source projects and samples from Microsoft.

Источник

sdk_fingerprint is incorrect #490

Интегрировал OAuth vk с помощью com.vk:androidsdk:2.2.0 в приложение для аутинфикации. При аутинфикации с устройства без установленного приложения Vk — всё работает корректно, а при установленном — вылетает ошибка, указанная выше. Отпечаток сертификата — корректен, проверялся не раз.

Используемые технологии/устройства:
com.vk:androidsdk:2.2.0
minSdkVersion 21
targetSdkVersion 29
versionCode 34
Redmi Note 7
Android 10 QKQ1
MIUI Gobal 12.5.1

The text was updated successfully, but these errors were encountered:

sha вводил и с двоеточием, и без.
проверил лишних пробелов не стоит

Один или два у вас сертификата? необходимо проверить, что используется нужный.
На всякий случай рекомендую использовать последнюю версию 3.2.2

При попытке подключить версию 3.2.2:
Could not find com.vk:androidsdk:3.2.2.
Required by:
project :app
Указано один sha, но 2 раза. Один с двоеточиями, второй без, какой оставить?

SHA-1 отпечаток сертификата нужно указывать без двоеточий.
Обратите внимание на имя пакета и главной Activity — может там опечатка?

Удалю с двоеточиями.
Перепроверил несколько раз.
Main activity для Android — MainActivity
Название пакета для Android — ru.ecoline.app

При попытке подключить версию 3.2.2:
Could not find com.vk:androidsdk:3.2.2.

Проверьте пожалуйста, совпадает ли сертификат, которым подписывается приложение и тот от которого берется fingerprint?

Источник

В сегодняшней статье мы рассмотрим с вами ошибку {«error»:»invalid_request»,»error_description»:»Security Error»}, которая наводит на многих пользователей шок, в первую очередь, благодаря своей ужасной длине.

Как исправить ошибку {«error»:»invalid_request»,»error_description»:»Security Error»}?

Возникает данная ошибка всякий раз, когда кто-то попытается выполнить авторизацию с помощью социальной сети ВКонтакте где-нибудь на другом веб-ресурсе, а таких сейчас ужасно много. Причем, стоит заметить, ошибка эта прежде всего возникает у пользователей браузера Google Chrome, впрочем, и на других браузерах ее появление также возможно.

Причина ошибки {«error»:»invalid_request»,»error_description»:»Security Error»} – выполненный ранее вход в учетную запись ВК. По крайней мере, так утверждает сама техническая поддержка ВКонтакте. И, как показала практика, это действительно так.

Если вы и сами повстречались с ошибкой {«error»:»invalid_request»,»error_description»:»Security Error»}, то вам нужно сделать следующее:

  • выйдите из свой учетной записи ВК в браузере;
  • затем снова войдите в нее;
  • далее переходим на нужный вам сайт и проводим авторизацию с помощью ВК – проблема решена.

Как видите, ошибка {«error»:»invalid_request»,»error_description»:»Security Error»} решается буквально за пару-тройку минут, после чего вы можете заходить на любые веб-ресурсы в сети через учетку ВКонтакте. Мы надеемся, что данный материал помог вам устранить проблему.

Приложение при тестировании на эмуляторе работает исправно, однако при попытке тестировать на реальном устройстве, после нажатия на кнопку «вход через ВК», появляется следующая ошибка: {«error»:»invalid_request»,»error_description»:»sdk_package is incorrect»}.
В настройках приложения на странице «ВК» в поле «название пакета для android» указан applicationId, MainActivity и сертификат тоже указаны верно. Помоги разобраться в чем проблема! Заранее спасибо!
Вот файл манифеста:

<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />

<application
    android:name=".app.Application"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <activity android:name="com.vk.sdk.VKOpenAuthActivity"/>

    <activity
        android:name=".activities.LoadActivity"
        android:label="@string/app_name"
        android:noHistory="true"
        android:theme="@style/AppTheme" >
    </activity>
    <activity
        android:name=".activities.Authorization"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.vk.sdk.VKServiceActivity"
        android:label="ServiceActivity"
        android:theme="@style/VK.Transparent" />
    <activity
        android:name=".activities.MainActivity"
        android:label="@string/title_activity_main"
        android:theme="@style/AppTheme" >
    </activity>
    <activity
        android:name=".activities.FriendsActivity"
        android:label="Друзья"
        android:theme="@style/AppTheme" />
    <activity
        android:name=".activities.GameActivity"
        android:label="Игра"
        android:theme="@style/AppTheme" />
    <activity
        android:name=".activities.WaitingAnswerActivity"
        android:label="@string/title_activity_waiting_answer" >
    </activity>
    <activity
        android:name=".activities.ShowPopUp"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Holo.Light.Dialog" >
    </activity>

    <service android:name="com.parse.PushService" />

    <receiver android:name="com.parse.ParseBroadcastReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.RECEIVE_BOOT_COMPLETED" />
            <action android:name="android.intent.action.USER_PRESENT" />
        </intent-filter>
    </receiver>

    <activity
        android:name=".activities.AnswerActivity"
        android:label="@string/title_activity_answer" >
    </activity>
    <activity
        android:name=".activities.showActiveGame"
        android:label="@string/title_activity_show_active_game" >
    </activity>
    <activity
        android:name=".activities.TempResultActivity"
        android:label="@string/title_activity_temp_result" >
    </activity>
    <activity
        android:name=".activities.ResultActivity"
        android:label="@string/title_activity_result" >
    </activity>
</application>

Вот настройки приложения ВК:
введите сюда описание изображения

На чтение 2 мин Просмотров 1.2к. Опубликовано 05.09.2022

Такой сбой происходит каждый раз, когда кто-то хочет авторизоваться посредством применения соцсети ВКонтакте где-то на другом интернет-портале, а таких сегодня очень большое количество. Кстати, следует отметить, ошибка данная первостепенно возникает у пользователей браузера Гугл Хром, однако, и на других браузерах появится вполне может. Главное не переживать и постараться устранить проблему самостоятельно, следуя советам специалистов.

Причины

Причина сбоя {«error»:»invalid_request»,»error_description»:»Security Error»} – проведенный заблаговременно вход в аккаунт ВКонтакте. По крайней мере, так сообщает непосредственно техподдержка популярной среди пользователей социальной сети. И, действительно, это так, практический опыт многих это доказывает.

Что делать?

Когда пользователю пришло сообщение с ошибкой {«error»:»invalid_request»,»error_description»:»Security Error»}, то необходимо руководствоваться инструкцией.

Алгоритм действий:

  1. Выйти из свой профиля в социальной сети ВКонтакте в своем браузере.
  2. После опять войти в свою учетную запись в соцсети ВК.
  3. Найти необходимый портал и войти на авторизовавшись посредством учетной записи ВКонтакте – ошибка пропадет.

Как становится понятно, если действовать по инструкции, то сбой {«error»:»invalid_request»,»error_description»:»Security Error»} будет устранен буквально за считанные минуты, после чего пользователь сможет входить на любые сайты в интернете через учетную запись социальной сети ВК.

Как сделать перезагрузку операционной системы Андроид?

Первым делом надо зайти в «Меню» смартфона и нажать на «Настройки», далее выбрать категорию «Восстановление и сброс».

По представленному перечню надо опустится в самый низ и кликнуть на «Сброс настроек» (этот пункт на различных мобильных устройствах может иметь разное название: «Сбросить настройки телефона», «Общий сброс», «Стереть все данные», например). Система направит предупредительное сообщение о том, что при сбрасывании настроек удалятся все личные информационные данные, программы, файловые документы.

Что дает перезагрузка смартфона?

Если перезагрузить мобильный, то очистится оперативная память всего лишнего, что ее захламляло, и нормализуется функционирование программ без каких-то негативных последствий для Андроид или другой операционной системы.

К примеру, веб-приложение «диспетчер памяти» элементарно убивает все программы, что применяет пользователь гаджета. Однако, отдельные приложения просто обязаны функционировать, и когда не знаешь, как действовать правильно, лучше обратиться к специалисту.

Время прочтения
9 мин

Просмотры 28K

Встала передо мной задача – сделать постинг ссылок из Андроида в пару-тройку соцсетей. Причем, максимально простой и легкий – чтобы не плодить сущности и как можно меньше заморачиваться с токенами, сессиями и прочая. Задача, действительно, минимум – только размещение ссылки в собственном аккаунте пользователя. Если к ссылке можно легко добавить описания или картинки – сделать, но не упираться.

В силу разных причин были выбраны Facebook, Vkontakte и Google+. Планировала добавить Twitter, но его Fabric к тому времени еще не вышел, а использовать стороннюю библиотеку не хотелось (см. п.2 ниже). Позже добавлю.

В итоге, задача для этих трех соцсетей получилась следующей:

  1. Максимально простой программный интерфейс постинга ссылок.
  2. Использование только нативных SDK (из тех соображений, что эти знания пригодятся в дальнейшем).
  3. Минимум кода – только самое необходимое для работы.
  4. Работать все должно вне зависимости от наличия у пользователя установленного клиента соцсети. Но если он есть – использовать диалоговые окна клиента.
  5. Пользователю должно выводиться сообщение об успешном или нет размещении записи.
  6. Должна быть возможность программно реагировать на успешное размещение записи.

Архитектура решения

Вариант с отдельной библиотекой в конечном итоге оказался чересчур громоздким – итоговый код составил порядка 250 строк вместе с комментариями и пустыми строками. Причем, все инкапсулировалось в один класс, использовать который достаточно просто.

Поскольку ряд объектов из SDK все же пришлось встраивать в жизненный цикл, то нужен был некий контейнер – или Activity, или Fragment. Я выбрала решение с abstract Activity, т.к. мне нужно было вешать команды постинга на кнопку ActionBar. Причем, делать это для нескольких Activity с разными фрагментами внутри.

В abstract Activity я зашила весь код управления постингом, а наружу выставила 3 метода – по одному для каждой сетки. От этой самой abstract Activity потом унаследовала остальные Activity приложения, в которых были нужны соцсети. В них доступ к нужному коду свелся к вызову метода из родительского класса.

Все, что здесь описано, наверняка можно сделать и с фрагментом. Хотя где-то я наталкивалась на сообщение, что встраивание в жизненный цикл все равно нужно делать для родительской Activity. Не знаю, не пробовала.

Итак…

Чтобы описанный ниже код заработал, нужно подключить в проект для каждой соцсети свой SDK и зарегистрировать приложение в разделе разработчиков. Все описано здесь:

  • developers.google.com/+/mobile/android
  • vk.com/dev/android_sdk
  • developers.facebook.com/docs/android/getting-started

При разработке использовались описания SDK на родных сайтах соцсетей, статьи на Хабре и SO, код библиотеки ASNE (спасибо автору!)

Google+

Самым простым кодом логично оказалось решение для G+. Вся работа с аутентификацией и сессиями уже встроена в систему. Нужное диалоговое окно (нативное от клиента или веб, если клиента нет) выбирается само, и само же сообщает об успешном постинге. Вот в последнем и крылась единственная засада – реализация п.6 требований. Для отслеживания успешности публикации пришлось добавить одну константу и один условный оператор в onActivityResult:

	private static final int GOOGLEPLUS_REQUEST_CODE = 1001;

	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            ...
	    if ((requestCode == GOOGLEPLUS_REQUEST_CODE) && (resultCode == -1)) {
	    	//Do something if success
	    }
	} 

Сама процедура постинга:

	/**
	* Publish link in Google+
	* @param text - message about link (may be changed or deleted by user)
	* @param link - http:// etc
	*/
	public final void googleplusPublish(String text, String link) {
		Intent shareIntent = new PlusShare.Builder(this)
                       .setType("text/plain")
                       .setText(text)
                       .setContentUrl(Uri.parse(link))
                       .getIntent();
		startActivityForResult(shareIntent, GOOGLEPLUS_REQUEST_CODE);
	}

FaceBook

C Фейсбуком пришлось повозиться подольше, и не все требования удалось реализовать.

Получилось:

  • обойтись без токенов, сессий и пр.;
  • добавить к ссылке кучу описаний и картинку – в G+ и VK такого функционала нет или он реализуется нетривиально;
  • использовать нативного клиента, если он установлен, но проверку и вызов нужного диалога в отличие от G+ и VK пришлось писать ручками.

Не получилось:

  • отследить закрытие пользователем диалогового окна (Cancel), если клиент установлен (для веб-диалога все работает) – в этом случае слушатель (см. код ниже) радостно рапортовал об успешной публикации записи. Поиски решения увенчались сомнительным успехом – если не реализована аутентификация из самого приложения, то в принципе невозможно отследить закрытие окна без публикации записи. Невозможно от слова «совсем». Городить только ради этого обработку авторизации и сессий не хотелось, поэтому пришлось выкручиваться текстом сообщения пользователю.

Что в коде…

Прежде всего, надо добавить в string.xml айдишник приложения и вписать в манифест метаданные (не забыв разрешить доступ в интернет – это для всех сетей надо!):

        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id"/>

Для работы понадобится вспомогательный объект, который довольно плотно «садится» на методы жизненного цикла. Он нужен для постинга нативным клиентом, если тот установлен. Можно было бы, конечно, обойтись только вебом, но без сессий тот требует ввода пароля каждый раз, что сильно раздражает. А раздражать пользователя лишний раз нехорошо…

Отслеживание успешности публикации тоже пришлось писать ручками. Вот здесь и вылезла та самая бяка с клиентом:

	private UiLifecycleHelper fbUIHelper;

	protected void onCreate(Bundle savedInstanceState) {
            ...
	    fbUIHelper = new UiLifecycleHelper(this, null);
	    fbUIHelper.onCreate(savedInstanceState);
        }

	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	    ...
	    fbUIHelper.onActivityResult(requestCode, resultCode, data, new FacebookDialog.Callback() {
	    	//Listener for Facebook-client if installed
	    	@Override
	    	public void onError(FacebookDialog.PendingCall pendingCall, Exception error, Bundle data) {
	    		toastMessage("Запись не опубликована");
	    	}

	    	@Override
	    	public void onComplete(FacebookDialog.PendingCall pendingCall, Bundle data) {
	    		toastMessage("Если вы сами не отменили команду, то запись опубликована");
	    	}
	    });

	protected void onResume() {
	   ...
	    fbUIHelper.onResume();
	}

	protected void onSaveInstanceState(Bundle outState) {
	    ...
	    fbUIHelper.onSaveInstanceState(outState);
	}

	protected void onPause() {
	    ...
	    fbUIHelper.onPause();
	}

	protected void onDestroy() {
	    ...
	    fbUIHelper.onDestroy();
	}

Сам код метода, который будет использоваться дочерними классами, выглядит следующим образом:

	/**
	* Publish link in FaceBook
	* @param name - title of block
	* @param caption - text on bottom of block
	* @param description - description of link (between title and caption)
	* @param link - http:// etc
	* @param pictureLink - http:// etc - link on image in web
	*/
	public final void facebookPublish(String name, String caption, String description, String link, String pictureLink) {
  	  if (FacebookDialog.canPresentShareDialog(getApplicationContext(), FacebookDialog.ShareDialogFeature.SHARE_DIALOG)) {
  		  //Facebook-client is installed
  		  FacebookDialog shareDialog = new FacebookDialog.ShareDialogBuilder(this)
	    	.setName(name)
	    	.setCaption(caption)
	    	.setDescription(description)
	    	.setLink(link)
	    	.setPicture(pictureLink)
	    	.build();
  		  fbUIHelper.trackPendingDialogCall(shareDialog.present());	    	  
	  } else {
		  //Facebook-client is not installed – use web-dialog
		  Bundle params = new Bundle();
		  params.putString("name", name);
		  params.putString("caption", caption);
		  params.putString("description", description);
		  params.putString("link", link);
		  params.putString("picture", pictureLink);
		  WebDialog feedDialog = new WebDialog.FeedDialogBuilder(this, Utility.getMetadataApplicationId(this), params)
		  	.setOnCompleteListener(new OnCompleteListener() {
		  		//Listener for web-dialog
		  		@Override
		        public void onComplete(Bundle values, FacebookException error) {
		  			if ((values != null) && (values.getString("post_id") != null) && (error == null)) {
		  				toastMessage("Запись опубликована");
		  			} else {
		  				toastMessage("Запись не опубликована");
		  			};
		  		};
		  	})
		  	.build();
		  feedDialog.show();
	  }
	}

ВКонтакте

Пожалуй, самая жуткая документация. Пришлось изрядно попотеть. К тому же, полностью избавиться от использования токенов не удалось – без них никак. Но по порядку…

Здесь тоже придется залезть в манифест ради одной строки кода:

	<activity android:name="com.vk.sdk.VKOpenAuthActivity"/>

В доках мягко написано, что «стоит добавить, иначе могут быть проблемы с запуском авторизационной activity», но если у пользователя не стоит VK-клиент, то приложение вылетит с ошибкой ActivityNotFoundException.

В самом классе в самом начале надо добавить код для хранения айдишника, прав доступа и управления авторизацией:

	private String appId = "1234567"; // Need to change to real app_id
	private static String vkTokenKey = "VK_ACCESS_TOKEN";
	private static String[] vkScope = new String[]{VKScope.WALL};
	private final VKSdkListener vkSdkListener = new VKSdkListener() {
		@Override
	    public void onCaptchaError(VKError captchaError) {
	    	new VKCaptchaDialog(captchaError).show();
		}
	    @Override
	    public void onTokenExpired(VKAccessToken expiredToken) {
	    	VKSdk.authorize(vkScope, true, false);
	    }
	    @Override
	    public void onAccessDenied(VKError authorizationError) {
	    	new AlertDialog.Builder(SocialNetworkActivity.this)
	        	.setMessage(authorizationError.errorMessage)
	            .show();
	    }
	    @Override
	    public void onReceiveNewToken(VKAccessToken newToken) {
	    	newToken.saveTokenToSharedPreferences(getApplicationContext(), vkTokenKey);
	    }
	 };

В методы жизненного цикла Activity эта зараза тоже влезает глубоко, хотя и не так как ФБ:

	protected void onCreate(Bundle savedInstanceState) {
	    ...
            VKUIHelper.onCreate(this);
	    VKSdk.initialize(vkSdkListener, appId, VKAccessToken.tokenFromSharedPreferences(this, vkTokenKey));
	}

	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	    ...
	    VKUIHelper.onActivityResult(this, requestCode, resultCode, data); 
	} 

	protected void onResume() {
	    ...
	    VKUIHelper.onResume(this); 
	}

	protected void onDestroy() {
	    ...
	    VKUIHelper.onDestroy(this); 
	}

Однако при публикации ссылки придется заставить пользователя сначала авторизоваться, а потом уже повторно жать на кнопку публикации. Это плохо с точки зрения юзабилити, но другого варианта я не нашла. Выданный один раз токен вроде как действует около часа. Геморно, но не хуже регистрации при каждом постинге, как в веб-диалоге ФБ.

Еще одна засада скрывалась там, где я подставы не ожидала ну никак. При отладке из Эклипса на реальном устройстве все работало как часы. Но стоило мне установить то же самое приложение из Гугл Плея, как VK-клиент при постинге ссылки начал ругаться:

{«error»:«invalid_request»,«error_description»:«sdk_fingerprint is incorrect»}

При этом авторизация проходит успешно, да и то же самое приложение без VK-клиента через веб работает прекрасно. Т.е. fingerprint корректный. Подозреваю глюк клиента. Или не глюк, а намеренно закрытая возможность, что вполне вероятно, глядя на вот эту ссылку (ближе к концу). Буду разбираться дальше, но если кто в курсе и может помочь – буду признательна.

Еще один нерешенный вопрос – почему заголовок ссылки, видимый в окне предпросмотра, теряется при публикации. Ответа не нашла, увы. Тоже буду признательна за подсказки.

Сам код постинга:

	/**
	* Publish link in Vkontakte
	* @param message - message about link (may be changed or deleted by user)
	* @param link - http:// etc
	* @param linkName - title of link - not published (don't know why...)
	*/
	public final void vkontaktePublish(String message, String link, String linkName) {
		VKAccessToken token = VKAccessToken.tokenFromSharedPreferences(this, vkTokenKey);
		if ((token == null) || token.isExpired()) {
			VKSdk.authorize(vkScope, true, false);
			toastMessage("Требуется авторизация. После нее повторите попытку публикации");
		} else {
			new VKShareDialog()
	        .setText(message)
	        .setAttachmentLink(linkName, link)
	        .setShareDialogListener(new VKShareDialog.VKShareDialogListener() {
	            @Override
	            public void onVkShareComplete(int postId) {
	            	toastMessage("Запись опубликована");
	            }
	            @Override
	            public void onVkShareCancel() {
	            	toastMessage("Запись не опубликована");
	            }
	        }).show(getSupportFragmentManager(), "VK_SHARE_DIALOG");    
		} 
	}

Я писала приложение под Support Library, поэтому в коде используется getSupportFragmentManager. Для версий 3.0+ надо заменить его на вызов родного метода.

Использование кода

Ну, вот, вкратце и все. Теперь наследуем нужную Activity от этой и где требуется используем вызовы хххPublish(). Можно на кнопки вешать, а можно и на popup-меню в ActionBar (правда, в этом случае вызов будет не очень красивый, зато само меню рабочее):

    public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
			case R.id.action_share:
				View view = findViewById(R.id.action_share);
				showPopupMenu(view, 
						"https://play.google.com/store/apps/details?id=ru.fantaversum.taleidoscope",
						"Талейдоскоп - бесплатная библиотека рассказов",
						"Талейдоскоп на Google Play",
						"Рассказы и повести с авторскими байками - все бесплатно и без рекламы. Тексты отобраны издательствами. Регулярные обновления.",
						"http://www.taleidoscope.ru/images/fb_logo.png",
						"Рекомендую: Талейдоскоп - бесплатная библиотека. Рассказы и повести с авторскими байками - все бесплатно и без рекламы. Тексты отобраны издательствами. Регулярные обновления.",
						"Талейдоскоп на Google Play");
				break;
		}
        return super.onOptionsItemSelected(item);
    }

    public void showPopupMenu(View view, final String link, 
    							final String fb_name, final String fb_caption, 
    							final String fb_description, final String fb_pictureLink,
    							final String message, final String linkName) {
        PopupMenu popup = new PopupMenu(this, view);
        popup.getMenuInflater().inflate(R.menu.popup, popup.getMenu());
        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                switch (menuItem.getItemId()) {
                    case R.id.menu_facebook:
                        facebookPublish(fb_name, fb_caption, fb_description, link, fb_pictureLink);
                        return true;
                    case R.id.menu_vkontakte:
                        vkontaktePublish(message, link, linkName);
                        return true;
                    case R.id.menu_googleplus:
                        googleplusPublish(message, link);
                        return true;
                }
                return false;
            }
        });
        popup.show();
    }

Исходный код всей Activity можно скачать здесь.

Иногда при попытке подключения группы ВКонтакте в виде канала открытой линии на этапе авторизации под пользователем:

34.png

в открывшемся окне можно наблюдать текст ошибки {«error»:«invalid_request»,«error_description»:«Security Error»} :

1.png

Проблема возникает из-за старой сессии авторизации ВКонтакте в браузере Chrome. 
Ошибка обработки с API. Для устранения нужно всего лишь перелогиниться в социальной сети. 

Порядок действий такой:

1. Необходимо зайти на VK.com, пройти авторизацию;
2. Выйти из своего аккаунта, путем нажатия кнопки «Выйти» вверху справа;
3. Снова пройти авторизацию во ВКонтакте;
4. Зайти в настройки открытой линии, выбрать ВКонтакте и подключить. 

Также ошибка может вам встретиться при авторизации на самом портале или в Битрикс24 Нетворк. 

Ошибка решается таким же путем (пункты 1-3). 

Спасибо, помогло!

Спасибо :)

Необязательно:

Оставить отзыв о статье

Уточните, пожалуйста, почему:

Это не то, что я ищу

Очень сложно и непонятно

Оставить отзыв о статье

На эмуляторе (Android 4.2.2) нет ошибки с «Войти с помощью Vk», но на реальном устройстве (HTC ONE, Android 4.3) после звонка

VKSdk.authorize (SignInActivity.vkScopes)

я получил

{«error»: «invalid_request», «error_description»: «sdk_package неверный»}

Все 12 Комментарий

Возможно, вы забыли установить пакет Android-приложения на странице настроек приложения, или пакет указан неверно

Да, сейчас все работает нормально. Я сделал глупую ошибку — скопировал имя пакета из настроек приложения iOS vk и оставил одну букву в верхнем регистре, вот почему … Спасибо за вашу работу!

Возможно, вы забыли установить пакет Android-приложения на странице настроек приложения, или пакет указан неверно

Что вы имеете в виду под «страницей настроек»? Манифест?
Эта строка? <activity android:name="com.vk.sdk.VKOpenAuthActivity" />

@Dreddik, передай плиз разработчикам API, что неплохо бы было иметь возможность указывать несколько package_name для одного приложения.
В gradle есть applicationIdSuffix. Им очень удобно разделять приложения — иметь на устройстве одновременно и отладочную версию, и бету и релиз. Тут эта возможность пропадает, или надо создавать несколько приложений :(

Выдавайте мне эту ошибку каждый раз, когда я пытаюсь использовать ВК в своем приложении. Пару недель назад все было хорошо. Думаю, имя пакета и MainActivity заполнены правильно.
MainActivity — MainActivity
Название пакета — com.fooBar
из — Манифест -xmlns: android = » http://schemas.android.com/apk/res/android » package = «com.fooBar»
Устройство Nexus 5.

PS: было еще одно устройство nexus 5, и оно работает. В чем проблема?

VKSdk.login(this, VKScope.WALL);
Открывается вью в которой отображается {«error»:»invalid_request»,»error_description»:»sdk_package is incorrect»} и кнопка «<-Вход», по нажатию на нее у меня заходит в приложение в вк, возвращается на предыдущее активити, но в коллбеке я попадаю в onFailure, что это за магия?

В общем в настройках приложения написано «Название пакета для приложения Android», ну я и скопировал из манифеста package, а как оказалось нужно было в build.gradle, applicationId взять…. Спасибо за прозрачность=)

Моя проблема была в том, что я не удалил двоеточия из сгенерированного SHA1.

Полностью согласен с v4ekmarev.
Абсолютно нигде не сказано что package нужно брать в build.gradle. Это вызвало довольно много мучений.

@Egrace Тот package что в AndroidManifest.xml переписывается тем, что написано в build.gradle. Поэтому это не косяк документации, а незнание того, что в итоге попадает в apk файл.

Была ли эта страница полезной?

0 / 5 — 0 рейтинги

Понравилась статья? Поделить с друзьями:
  • Error invalid request error description sdk fingerprint is incorrect free fire
  • Error invalid request error description redirect uri is blocked
  • Error invalid request error description redirect uri has wrong domain check application settings
  • Error invalid request error description incorrect app unavailable for apps with direct auth
  • Error invalid request error description application was deleted