Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
#1

Яндекс.Диск API - Программирование Android

18.02.2014, 13:48. Просмотров 2326. Ответов 7
Метки нет (Все метки)

Работал кто-нибудь с этим API? Запускаю дефолтный пример яндекса, и при авторизации через браузер показывает вот это:

Никто не сталкивался с такой проблемой?
0
Миниатюры
Яндекс.Диск API  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2014, 13:48
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Яндекс.Диск API (Программирование Android):

Реализация Яндекс SpeechKit Cloud API - Программирование Android
Добрый день! Пытаюсь встроить в своё приложение распознование речи от яндекса. У меня получилось прикрутить к нему SpeechKit SDK, но как...

Яндекс карты и Яндекс MapKit - Программирование Android
Передо мной стоят такие задачи: показать карту, на ней показать маркеры на определенных координатах, построить маршрут между задаными...

Android SDK Manager не отображает платформы 2.3.3 (API 10), 2.3.1 (API 9). Как быть? - Программирование Android
Добрый день! Использую Android Studio под Windows 7. Из-за несовместимости с операционной системой Android SDK Manager не отображает...

Android Studio не дает работать с API 8 без установленного API 21 - Программирование Android
Удалил все не интересующие меня библиотеки и поставил только API Level 8. Но при создании приложения вылезает куча ошибок таких как: Что...

Ошибка minSDK(API 23, N preview) != deviceSDK(API 17) - Программирование Android
Недавно начал учить андроид и возникла такая ошибка, когда я пытаюсь запустить проект на своем телефоне или эмуляторе. При этом в проекте...

Яндекс Карты - Программирование Android
Доброго времени суток! Хотел бы узнать как использовать Яндекс.карты в своем проекте, а также навигацию по картам, но чтобы это работало в...

7
angryrobot
Командир зеленых роботов
348 / 285 / 53
Регистрация: 08.10.2013
Сообщений: 565
18.02.2014, 13:57 #2
Цитата Сообщение от KillAndEat Посмотреть сообщение
Никто не сталкивался с такой проблемой?
Скорее всего забыли прописать в манифесте интент-фильтр для вашей активити.
Или прописали но не такой какой надо (не совпадает с вашим Callback URI который вы указывали при регистрации нового приложения в яндксе).
0
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
18.02.2014, 15:17  [ТС] #3
Цитата Сообщение от angryrobot Посмотреть сообщение
Скорее всего забыли прописать в манифесте интент-фильтр для вашей активити.
Или прописали но не такой какой надо (не совпадает с вашим Callback URI который вы указывали при регистрации нового приложения в яндксе).
Это же пример Яндекса, все должно совпадать) Дело в том, что раньше регистрация проходила, а сейчас перестал. Хотя аккаунт я с телефона удалил.
0
angryrobot
Командир зеленых роботов
348 / 285 / 53
Регистрация: 08.10.2013
Сообщений: 565
18.02.2014, 15:53 #4
Цитата Сообщение от KillAndEat Посмотреть сообщение
Это же пример Яндекса, все должно совпадать
Покажите манифест приложения, и скажите какой вы указали Callback URI.
0
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
18.02.2014, 16:21  [ТС] #5
Манифест

Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.yandex.disk.sdk.example"
          android:versionCode="1"
          android:versionName="1.0">
 
    <uses-sdk android:minSdkVersion="11"
              android:targetSdkVersion="17"/>
 
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    <uses-permission android:name="android.permission.USE_CREDENTIALS"/>
 
    <application android:label="@string/app_name"
                 android:icon="@drawable/ic_launcher"
                 android:name=".Application"
                 android:hardwareAccelerated="true">
 
        <activity android:name=".ExampleActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="yandexdisk" />
            </intent-filter>
        </activity>
 
    </application>
 
</manifest>


Callback URI не могу посмотреть так как акrаунт за яндексом зарегистрирован, но предполагаю что он http://localhost
0
angryrobot
Командир зеленых роботов
348 / 285 / 53
Регистрация: 08.10.2013
Сообщений: 565
18.02.2014, 23:13 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от KillAndEat Посмотреть сообщение
Callback URI не могу посмотреть так как акrаунт за яндексом зарегистрирован, но предполагаю что он http://localhost
Судя по вашему манифесту, он должен быть yandexdisk://чтоугодно в противном случае ничего работать не будет. Есть два пути решения вашей проблемы:

1) Регистрируйте свой аккаунт и сделайте в нем нормальный Callback URI. Нормальный это например такой:
имяВашегоПриложения://чтоугодно/
Затем в манифесте меняете строчку
XML
1
<data android:scheme="yandexdisk" />
на
XML
1
<data android:scheme="имяВашегоПриложения" />
И всё начинает работать.


2) Этот вариант нужно использовать если аккаунт не ваш, и изменить Callback URI вы не можете. Чтоб всё заработало нужно заменить строчку
XML
1
<data android:scheme="yandexdisk" />
на строчку
XML
1
<data android:host="localhost" android:scheme="http" />
Но после установки вашего приложения, ссылка http://localhost будет открываться либо в браузере либо в вашем приложении. Это может заставить пользователей изрыгать проклятия в ваш адрес Поэтому этот вариант плохой, но для отладки пойдет.
1
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
19.02.2014, 12:16  [ТС] #7
Спасибо! Вы очень помогли!

Дабы не создавать новую тему про API облачных хранилищ задам вопрос в этом топике.

Разбирался с Dropbox Datastore API и столкнулся со следующей проблемой.

При попытке получить экземпляр DbxAccountManager

Java
1
DbxAccountManager mDbxAcctMgr = DbxAccountManager.getInstance(getApplicationContext(), appKey, appSecret);
вылетает следующее исключение:

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Thread [<1> main] (Suspended (exception ExceptionInInitializerError))   
    <VM does not provide monitor information>   
    DbxAccountManager.getInstance(Context, DbxConfig, CoreConfig$Hosts, CoreAccountManager$AccountStorageProvider) line: 158    
    DbxAccountManager.getInstance(Context, String, String) line: 116    
    MainActivity.onCreate(Bundle) line: 19  
    MainActivity(Activity).performCreate(Bundle) line: 5008 
    Instrumentation.callActivityOnCreate(Activity, Bundle) line: 1079   
    ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 2041    
    ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 2102 
    ActivityThread.access$600(ActivityThread, ActivityThread$ActivityClientRecord, Intent) line: 133    
    ActivityThread$H.handleMessage(Message) line: 1208  
    ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
    Looper.loop() line: 137 
    ActivityThread.main(String[]) line: 4765    
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
    Method.invoke(Object, Object...) line: 511  
    ZygoteInit$MethodAndArgsCaller.run() line: 791  
    ZygoteInit.main(String[]) line: 558 
    NativeStart.main(String[]) line: not available [native method]


Причем это происходит и в примерах Dropbox и в моих поделках)
0
arvalon
21 / 6 / 2
Регистрация: 26.10.2012
Сообщений: 179
Записей в блоге: 1
12.04.2018, 15:49 #8
Подниму старую тему, столкнулся с аналогичной проблемой. Не могу воспроизвести всю схему с получением токена в приложение Android для работы с Yandex Disk'ом по REST API.
Итак обо всё по порядку:
За пример взял официальный пример yandex-disk-restapi-java. Прочитал документацию по Yandex OAuth.
Зарегистрировал своё приложение "testapp", получил его:AndroidManifest.xml:
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ru.arvalon.***">
 
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
 
        <activity android:name=".MainActivity" android:label="@string/app_name">
 
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
 
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="yx687d4a6bb5674102a321d11ac1422adb" />
            </intent-filter>
 
        </activity>
 
    </application>
 
</manifest>

MainActivity.java
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public class MainActivity extends AppCompatActivity {
 
    public static final String CLIENT_ID = "%ID%";
 
    public static final String AUTH_URL =
            "https://oauth.yandex.ru/authorize?response_type=token&client_id="+CLIENT_ID;
 
    static final String USERNAME = "username";
    static final String TOKEN = "token";
 
    private static final String AUTHDIALOGTAG = "auth";
 
    private static final String TAG = "logtag";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        Log.d(TAG,"onCreate");
 
        if (getIntent() != null && getIntent().getData() != null){
            onLogin();
        }
 
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
        String token = sp.getString(TOKEN,null);
        if (token==null){
            startLogin();
            return;
        }
 
        if (savedInstanceState==null){
            doSomething();
        }
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"onResume");
        onLogin();
 
    }
 
    /** запускаем диалог получения токена */
    private void startLogin() {
        Log.d(TAG,"startLogin");
        new AuthDialog().show(getSupportFragmentManager(), AUTHDIALOGTAG);
    }
 
    /** ковыряемся в Intent Data Bundle на предмет токена и сохраняем в SP */
    private void onLogin() {
        if (getIntent()!=null && getIntent().getData()!=null){
            Log.d(TAG,"onLogin has intent data:"+getIntent().getData().toString());
        }
    }
 
    /** токен есть, делаем что-нибудь */
    private void doSomething() {
        Log.d(TAG,"doSomething...");
    }
}

Запускаю приложение, диалог как положено открывает браузер предоставления прав моему "testapp" приложению предлагая авторизоваться под УЗ Яндекса. Нажимаю "предоставить", браузер открывает адрес:

https://yx687d4a6bb5674102a321d11ac1422adb.oauth.yandex.ru/auth/finish?platform=android#access_token=AQ*************fhs&token_type=bearer&expires_in=31535999

В котором по идее есть токен, тип, время жизни, т.е. всё по плану. Но вместо перехода в приложение остаюсь в браузере с текстом:
Авторизация в приложении testapp не удалась.
Возможные причины: Приложение не установлено
Покопавшись ещё раз во всех ключах/параметрах/значениях и сравнив с примером от Яндекса понял что что-то с перехватом Intent'а, приложение должно обработать путь как-то среагировав на "схему". В выше приложенном AndroidManifest'е есть соответсвующий параметр
XML
1
<data android:scheme="yx687d4a6bb5674102a321d11ac1422adb" />
куда вставлена "Custom URL Scheme" со странички регистрации приложения https://oauth.yandex.ru/ В примере яндекса там написано
XML
1
<data android:scheme="yandexdisk" />
Попробовал разные комбинации схемы - http, id, последующий путь, не помогло:
XML
1
2
3
<data android:scheme="https://yx687d4a6bb5674102a321d11ac1422" />
<data android:scheme="https://yx687d4a6bb5674102a321d11ac1422adb.oauth.yandex.ru" />
<data android:scheme="https://yx687d4a6bb5674102a321d11ac1422adb.oauth.yandex.ru/auth" />
На страничке настройки приложения https://oauth.yandex.ru/ есть так же чекбокс "Веб-сервисы" если отметить который появляется ещё одной поле ввода "Callback URI #1" и кнопка "Подставить URL для разработки" по нажатию на которую в поле ввода подставляется "https://oauth.yandex.ru/verification_code". В некоторых инструкциях по авторизации в Yandex OAuth так и написано было сделать, я оставил. Тоже не заработало, но есть некоторые изменения. После предоставления приложению доступа к ресурсам пользования (Диску в данном случае) редиректит на

https://oauth.yandex.ru/verification_code#access_token=AQ*************fhs&token_type=bearer&expires_in=31536000

А токен таже дублируется в теле самой странички в браузере. Но дальнейшего перехода в приложение тоже не происходит. onCreate/onResume не вызывается. По несколько раз всё перепроверил - id приложения, пакет, SHA256
Это какой-то тупик, кто-нибудь можнет подсказать где я ошибся, что-то со схемой, перехватом Intent'а и др? Настройки приложения из примера Яндекса не доступны, их же нельзя посмотреть, что бы сделать у себя по аналогии.
0
12.04.2018, 15:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2018, 15:49
Привет! Вот еще темы с ответами:

Ошибка с яндекс картой - Программирование Android
Добрый день. Нам создали анлроид приложение. В нем есть раздел контакты, в который встроена яндекс-карта с адресом офиса. Изначально...

Переход с Google на Яндекс карты - Программирование Android
Приветствую, Такой вопрос, есть исходники буржуйского приложения (свободнораспространяемое) которое использует Google карты, хочу...

Ошибка при запуске Яндекс Карт - Программирование Android
Здравствуйте, пытаюсь разобраться с работой Яндекс карт. По примеру скачал и подключил библиотеку API Yandex Map Kit c гитхаба к новому...

Яндекс. Магазин - альтернативный маркет Android - Программирование Android
Вот и наши взялись, за высокие технологии. Регистрация пока бесплатна. Так что налетай, как говориться, пока горячее. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru