Перейти к содержанию
Fire Monkey от А до Я

nek

Пользователи
  • Постов

    18
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные nek

  1. Приложение ВКонтакте на Андроид и обращения к API немного разные вещи (см название раздела). С помощью API можно например вызвать метод groups.isMember,но из своего приложения (в рамках FMX). Причём используя даже официальный id мобильного приложения ВК всё равно придётся заставить юзера ввести имя и пароль от аккаунта, т.к. токен для выполнения метода другим способом не получить (прямая авторизация не в счёт)).

     

    Можно:

    1) Попробовать определить установлено ли приложение на устройстве по наличию папки sdcard0/android/data/com.vkontakte.android

    2) Поискать в гугле "Detect if app is installed on Android" и как-то воспроизвести сие в программе (имеется ввиду вариант с йунити).

    3) Открыть "С помощью..." ВК ссылку. Знаю такое умеет Total Commander, что будет в данном случае не знаю)) :P

  2. Здравствуйте. Каким образом вызвать Tfrm_OAuthWebForm и обработать OnAfterRedirect для извлечения токена из URI?

     

    На REST.Authenticator.OAuth.WebForm.FMX.hpp компилятор ругается (ненравится объявдение класса), других модулей не знаю. На VCL не всё так печально:

    Tfrm_OAuthWebForm* form;

    ...можно, но дальше тож пока глухо (а раньше вроде получалось, тока исходник посеял)

    На Делфи я как погляжу всё гладенько. В uses добавляется pas, далее нужному событию назначается процедура в которой и происходит разбор строки с токеном.

    214
  3. Может тут посмотришь? Клац!
    А меня интересует FLV. Правда у меня несколько иная задача (боюсь придется создавать новую тему). Что бы не мучатся с форматами использую TMediaPlayer как источник информации о разрешении видео. Ещё не знаю как определить частоту кадров :(

    P.S.: Сорри за некропост

    UPD: o.O всё открывается, но надо переименовать файл в mp4. Но это ведь не дело заставлять юзера переименовывать пачку? Когда файлов 50, среди них n другого формата.

    UPD2:  Дошли руки. Надо ведь регистрировать свой тип? Т.к. по-умолчанию MP знает лишь небольшое кол-во файлов. Пока так  TMediaCodecManager::RegisterMediaCodecClass(".flv","Flash Video",TMediaType::Video,...

  4. Намучался я с этим CB!

    Вот мои)

    #include "Clipbrd.hpp" 
    #include "DateUtils.hpp"

    Кода ~500 строк не считая юниты.

    Чистый проект ведёт себя адекватно. Открываю большой и понеслась! При попытке проверить синтаксис/какие-то внутринние действия или отобразить подсказку IDE виснет. Если повезёт, то вскоре очухается, если нет, то CB вылетит без каких либо ошибок.

    Иногда работает подсказка ListView1->Items->..отображается список методов, иногда нет. То же со справкой F1.

    Очень редко возникает ошибка "Программа всё ещё запущена?", недавно решил поискать мой процесс в...process explorer'е и угадайте, где я его нашел? В Steam.exe, который никак не связан с моей программой и находится на другом диске. Поясняю: steam система дистрибьюции цифрового контента в частности игр, которая люто бешено ненавидит вмешательства в своё адресное пространство и просто напросто банит аккаунты за посягательства на файлы ядра и изменение процесса в памяти. О бане можно узнать и через недельку другую, причём никакие "я больше так не буду" или "это не я" не помогут)))

    Тьфу тьфу тьфу пока всё ок. Я вообще у себя избавился от одной сомнительной фичи, но факт остаётся фактом как-то процесс "перетёк" в другой)) Ничего криминального в коде нет,

  5. Доброго времени суток. Как "прикинуться" приложению Firemonkey ClipboardViewer'ом? И можно ли потом обойтись малой кровью перепилив это дело под мак?

    Не делать же каждые N мс проверку буфера (в моём случае на совпадение с рег. выр)

    Вот например код для VCL (C++) , но он не работает в FireMonkey, не знаю какую библиотеку ещё подрубить кроме vcl.clipbrd.hpp (clipbrd.hpp)

    Оригинал здесь

    // ...class TForm1 : public TForm{// ...private:    // User declarations    HWND FNextCbViewer;    void __fastcall WMChangeCBChain(TWMChangeCBChain &Msg);    void __fastcall WMDrawClipboard(TWMDrawClipboard &Msg);public:     // User declarations    __fastcall TForm1(TComponent* Owner);     BEGIN_MESSAGE_MAP        VCL_MESSAGE_HANDLER(WM_CHANGECBCHAIN, TWMChangeCBChain, WMChangeCBChain)        VCL_MESSAGE_HANDLER(WM_DRAWCLIPBOARD, TWMDrawClipboard, WMDrawClipboard)    END_MESSAGE_MAP(TForm)};// ...
    __fastcall TForm1::TForm1(TComponent* Owner)    : TForm(Owner){    FNextCbViewer = 0; // Изначально никаких попыток перехвата нет} //---------------------------------------------------------------------------// При уничтожении формы "отцепимся" от цепочкиvoid __fastcall TForm1::FormDestroy(TObject *Sender){    if(FNextCbViewer)    {        ChangeClipboardChain(this->Handle, FNextCbViewer);        FNextCbViewer = 0;    }} //---------------------------------------------------------------------------// Эта кнопка будет добавлять наше приложение к цепочке, получающей уведомления// об изменении содержимого Clipboard-аvoid __fastcall TForm1::btnSetViewerClick(TObject *Sender){    if(FNextCbViewer) // Второй раз добавлять себя не будем    {        ShowMessage(L"Уже зарегистрировано");    }    else    {        FNextCbViewer = SetClipboardViewer(this->Handle); // А если еще не делали - добавим    }} //---------------------------------------------------------------------------// Ну, и кнопка, чтобы "отцепиться" вручнуюvoid __fastcall TForm1::btnResetViewerClick(TObject *Sender){    ChangeClipboardChain(this->Handle, FNextCbViewer);    FNextCbViewer = 0;} //---------------------------------------------------------------------------// void __fastcall TForm1::WMChangeCBChain(TWMChangeCBChain &Msg){    // inherited;    Msg.Result = 0;    if(Msg.Remove == FNextCbViewer)    {        FNextCbViewer = Msg.Next;    }    else    {        // Информируем дальше по цепочке о событии изменении цепочки        SendMessage(FNextCbViewer, WM_CHANGECBCHAIN,                    WPARAM(Msg.Remove), LPARAM(Msg.Next));    } }void __fastcall TForm1::WMDrawClipboard(TWMDrawClipboard &Msg){    try    {        // Собственно, уведомление пользователя. Тут можешь делать        // с Clipboard-ом все что нужно        MessageBox(0, _T("Содержимое буфера обмена изменилось"), _T("Внимание!"), MB_ICONINFORMATION);    }    __finally    {        // Но в конце информируем следующего об изменении буфера        SendMessage(FNextCbViewer, WM_DRAWCLIPBOARD, WPARAM(0), LPARAM(0));    }}

    Функции передачи дальше по цепочке (если я не ошибаюсь) нет.

    ChangeClipboardChain(this->Handle, FNextCbViewer);

    Если можно с примерами) желательно не делфи

  6. Пример под себя переделал:

    #include <Data.DBXJSON.hpp>
    #include <memory>
    ...
    std::auto_ptr<TJSONObject> object(static_cast<TJSONObject*>(TJSONObject::ParseJSONValue(Memo1->Lines->Text)));
    TJSONObject* response = static_cast<TJSONObject*>(object->Get("response")->JsonValue);
    TJSONArray* items = static_cast<TJSONArray*>(response->Get("items")->JsonValue);
    TJSONObject* id = static_cast<TJSONObject*>(items->Get(0));
    ShowMessage(id->GetValue("id")->ToString());

     

     
  7. String s = Memo1->Text; //Берём строку из Мемо
    TJSONObject* jOb = new TJSONObject(); //Создаём экземпляр класса
    jOb->ParseJSONValue(s); //Парсим значение
    TJSONPair* jP = jOb->Get(0);//Получаем первый элемент

    Как-то так) Коменты конечно же отсебятина)

     

    А дальше без dynamic_cast утечка памяти :(

     

  8. тем более работаю с C++.

    Делфи мне не интересен. Т.е. да, там много написано про REST и про порядок действий..мне же надо выдирать уже готовые значения. из ответа

     

    На эту статью я натыкался и её обязательно прочитаю...

    UPD сорри, вчера быстренько отписался и ушел

  9. Доброго времени суток!

    Где-то на формуах спрашивал, но потом забросил эту тему) было не до этого...

     

    В то время я много читал про Delphi вариант TJSONObject, Array, Items и т.д., но из-за нехватки знаний так и не разобрался в последовательности действий, тем более работаю с C++.

    Вариантов и на Сишке куча, но все же у людей частные проблемы вроде утечки памяти, не так сделать, а эдак. Такие заумные вещи мне не по плечу (пока)
    Про Data.DBXJSON знаю) Смотрел оф. справку.
     
    Вопрос: (и мне бы желательно видеть конкретные рабочие примеры) допустим есть вот такая шняга - ответ ВК API:
     

    {
      "response": {
        "count": 1638,
        "items": [
          {
            "id": 168886508,
            "owner_id": -51189706,
            "title": "Jenga Cat",
            "duration": 83,
            "description": "Еще больше крутых видео: vk.com\/just_vid\nРекомендую!",
            "date": 1401295313,
            "views": 754,
            "comments": 5,
            "photo_130": "http:\/\/cs541206.vk.me\/u2949887\/video\/s_af146ce5.jpg",
            "photo_320": "http:\/\/cs541206.vk.me\/u2949887\/video\/l_1b666cdd.jpg",
            "player": "http:\/\/vk.com\/video_ext.php?oid=-51189706&id=168886508&hash=a89ac9f2208445bf",
            "can_comment": 1,
            "can_repost": 1,
            "likes": {
              "user_likes": 0,
              "count": 35
            },
            "repeat": 0
          }
        ]
      }
    }
    

    Мне отсюда нужны id, owner_id, player, title в переменные.
     
     
    Если группы/пользователя нет, то ответ примерно такой:

    {"error":{"error_code":15,"error_msg":"Access denied:  user deactivated","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"video.get"},{"key":"owner_id","value":"000000000000"},{"key":"v","value":"5.21"},{"key":"count","value":"1"},{"key":"extended","value":"1"},{"key":"access_token","value":"Многа_Букафф"}]}}

    Сорри за оффтоп, у TOAuth2Authenticator в модуле REST.Authenticator.OAuth.WebForm.Win.hpp описана форма Tfrm_OAuthWebForm, как её вызвать? Не хочется возиться с IdHTTP/CPPWebBrowser.

     
  10. Занимался я как-то этим делом и вот мои наработки (советую хотя бы прочитать про авторизацию на сайте vk api, я хреново объясняю):

    Сначала нужно поместить на форму TOAuth2Authenticator. Сейчас точно не скажу куда какие URL вписывать в интерфейс компонента. По-мойму 2 левых верхних https....api.vk.com\auth (надо смотреть по документации...это должен быть базовый адрес для авторизации до знака вопроса). Третий адрес ....\blank.html (тож из документации).

    Далее scope (разрешения): offline,video. Видео нужно мне для собственных нужд, offline - токен, который вернет сервер не будет нуждаться в обновлении.

    И последнее id приложения (по-моему верхнее правое поле). Берется он с "панели управления" приложением вк.

    Как написано в standalone не рекомендуется использовать secret, т.к. его можно достать и использовать в нехороших целях)

    Ах да, чуть не забыл. Ответ должен быть token, не code.

    Компонент собирает во едино всю информацию в 1 URL и отправляет пост, например: _ttps:\\api.vk.com\authorize?id=0000&scope=offline,photo&v=5.21&response=token&... Но параметра v= (версия апи) там не будет, как добавить свои параметры в запрос не разбирался.

    В документации API сказано, что по этому адресу происходит редирект на стр. авторизации вк с вопросом "дать постоянный (пар. Offline)доступ к .... %application_name%?", если юзер дает добро, то его опять редиректит по адресу в котором уже будет токен. Токен нужен для исполнения методов. Естественно все что касается пользователя нуждается в отображении.

    Нажимаешь кнопочку Authorization. Если все правильно открывается окно для авторизации вк. Нужно это для отладки, а так это самое окно вызывается кодом. Для делфи примеров 9000+, для с++ наверное мне не хватает мозгов( Даже аналогичный delphi'вскому .pas есть .hpp с тем же именем, но форму создать мне не удалось.

    Можно все тоже самое и вручную через IdHTTP. Но в хе5- был баг. location была пустой для https запросов. Т.е. получить адрес куда тебя редиректнуло невозможно. Сейчас я создаю окно, где есть tcppwebbrowser, с его помощью наверное и буду просить доступ у пользователя к его профилю.

    Методы - те же url в которых REST компоненты играют роль интерфейса. В методе как раз и нужен токен.

    Про отправку через RESTRequest я уж молчу. Мне бы с формой авторизации разобраться, что бы самому все не делать.

    Ответ приходит либо в виде json, либо в xml.

    Пока пользуюсь xml, но лучше бы json, но с ним у меня проблемы.

    Так и не понял как работает TJSONObject и прочие классы. Естественно читал доки и смотрел Си-шные примеры, но так ничего и не добился.

    Тебе "читать" json нужно для того, что бы узнать а можно ли вообще загрузить фото на стр или группу? И там есть свои ограничения.

    Запросы нужно делать не чаще 3 в 1 сек.

    Дальше однотипные запросы потребуют капчи, потом просто пустой ответ.

×
×
  • Создать...