Запустите пользовательское приложение для Android из браузера Android

Если вы после легкого, не-добавленного-ссылочного типа подхода, может быть, этот бит кода, который я только что написал, будет работать (я не могу гарантировать надежность на 100%).

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

public Dictionary<string, object> ParseJSON(string json)
{
    int end;
    return ParseJSON(json, 0, out end);
}
private Dictionary<string, object> ParseJSON(string json, int start, out int end)
{
    Dictionary<string, object> dict = new Dictionary<string, object>();
    bool escbegin = false;
    bool escend = false;
    bool inquotes = false;
    string key = null;
    int cend;
    StringBuilder sb = new StringBuilder();
    Dictionary<string, object> child = null;
    List<object> arraylist = null;
    Regex regex = new Regex(@"\\u([0-9a-z]{4})", RegexOptions.IgnoreCase);
    int autoKey = 0;
    for (int i = start; i < json.Length; i++)
    {
        char c = json[i];
        if (c == '\\') escbegin = !escbegin;
        if (!escbegin)
        {
            if (c == '"')
            {
                inquotes = !inquotes;
                if (!inquotes && arraylist != null)
                {
                    arraylist.Add(DecodeString(regex, sb.ToString()));
                    sb.Length = 0;
                }
                continue;
            }
            if (!inquotes)
            {
                switch (c)
                {
                    case '{':
                        if (i != start)
                        {
                            child = ParseJSON(json, i, out cend);
                            if (arraylist != null) arraylist.Add(child);
                            else
                            {
                                dict.Add(key, child);
                                key = null;
                            }
                            i = cend;
                        }
                        continue;
                    case '}':
                        end = i;
                        if (key != null)
                        {
                            if (arraylist != null) dict.Add(key, arraylist);
                            else dict.Add(key, DecodeString(regex, sb.ToString()));
                        }
                        return dict;
                    case '[':
                        arraylist = new List<object>();
                        continue;
                    case ']':
                        if (key == null)
                        {
                            key = "array" + autoKey.ToString();
                            autoKey++;
                        }
                        if (arraylist != null && sb.Length > 0)
                        {
                            arraylist.Add(sb.ToString());
                            sb.Length = 0;
                        }
                        dict.Add(key, arraylist);
                        arraylist = null;
                        key = null;
                        continue;
                    case ',':
                        if (arraylist == null && key != null)
                        {
                            dict.Add(key, DecodeString(regex, sb.ToString()));
                            key = null;
                            sb.Length = 0;
                        }
                        if (arraylist != null && sb.Length > 0)
                        {
                            arraylist.Add(sb.ToString());
                            sb.Length = 0;
                        }
                       continue;
                    case ':':
                        key = DecodeString(regex, sb.ToString());
                        sb.Length = 0;
                        continue;
                }
            }
        }
        sb.Append(c);
        if (escend) escbegin = false;
        if (escbegin) escend = true;
        else escend = false;
    }
    end = json.Length - 1;
    return dict; //theoretically shouldn't ever get here
}
private string DecodeString(Regex regex, string str)
{
    return Regex.Unescape(regex.Replace(str, match => char.ConvertFromUtf32(Int32.Parse(match.Groups[1].Value, System.Globalization.NumberStyles.HexNumber))));
}

[Я понимаю, что это нарушает OP Limitation # 1, но технически вы этого не пишете, я сделал]

399
задан Rahul Tiwari 15 August 2015 в 10:48
поделиться

5 ответов

Используйте с элементом . Например, чтобы обрабатывать все ссылки на twitter.com, вы должны поместить это в свой в своем AndroidManifest.xml :

<intent-filter>
    <data android:scheme="http" android:host="twitter.com"/>
    <action android:name="android.intent.action.VIEW" />
</intent-filter>

Затем, когда пользователь нажимает ссылку на твиттер в браузере, у них спросят, какое приложение использовать для выполнения действия: браузер или ваше приложение.

Конечно, если вы хотите обеспечить тесную интеграцию между вашим веб-сайтом и вашим приложением, вы можете определить свою собственную схему:

<intent-filter>
    <data android:scheme="my.special.scheme" />
    <action android:name="android.intent.action.VIEW" />
</intent-filter>

Затем в своем веб-приложении вы можете разместить такие ссылки, как:

<a href="my.special.scheme://other/parameters/here">

И когда пользователь нажимает ваше приложение будет запущено автоматически (потому что оно, вероятно, будет единственным, которое может обрабатывать тип uris my.special.scheme: // ). Единственным недостатком этого является то, что если у пользователя не установлено приложение, он получит неприятную ошибку. И я не уверен, что есть возможность проверить.


Изменить: Чтобы ответить на ваш вопрос, вы можете использовать getIntent (). GetData () , который возвращает объект Uri . Затем вы можете использовать методы Uri. * для извлечения необходимых данных. Например, предположим, что пользователь щелкнул ссылку на http://twitter.com/status/1234 :

Uri data = getIntent().getData();
String scheme = data.getScheme(); // "http"
String host = data.getHost(); // "twitter.com"
List<String> params = data.getPathSegments();
String first = params.get(0); // "status"
String second = params.get(1); // "1234"

Вы можете сделать это в любом месте своего Activity , но вы, вероятно, захотите сделать это в onCreate () . Вы также можете использовать params.size () , чтобы получить количество сегментов пути в Uri . Обратитесь к документации javadoc или на веб-сайте разработчика Android, чтобы узнать о других методах Uri , которые можно использовать для извлечения определенных частей.

605
ответ дан 22 November 2019 в 23:38
поделиться

Эй, я нашел решение. Я не установил категорию как "По умолчанию". Также я использовал основную активность для данных намерения. Теперь я использую другую активность для данных намерения. Спасибо за помощь :)

0
ответ дан 22 November 2019 в 23:38
поделиться

Вам нужно добавить псевдо-имя хоста в CALLBACK_URL 'app://' не имеет смысла как URL и не может быть разобран.

0
ответ дан 22 November 2019 в 23:38
поделиться

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

18
ответ дан 22 November 2019 в 23:38
поделиться

См. Мой комментарий здесь: Сделать ссылку в браузере Android запустить мое приложение?

Мы настоятельно не рекомендуем людям использовать свои собственные схемы, если они не определяют новую схему всемирного Интернета.

66
ответ дан 22 November 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: