Если вы после легкого, не-добавленного-ссылочного типа подхода, может быть, этот бит кода, который я только что написал, будет работать (я не могу гарантировать надежность на 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, но технически вы этого не пишете, я сделал]
Используйте
с элементом
. Например, чтобы обрабатывать все ссылки на 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
, которые можно использовать для извлечения определенных частей.
Эй, я нашел решение. Я не установил категорию как "По умолчанию". Также я использовал основную активность для данных намерения. Теперь я использую другую активность для данных намерения. Спасибо за помощь :)
Вам нужно добавить псевдо-имя хоста в CALLBACK_URL 'app://' не имеет смысла как URL и не может быть разобран.
Также должно быть
, добавленное к фильтру намерений, чтобы активность распознавалась должным образом из ссылка на сайт.
См. Мой комментарий здесь: Сделать ссылку в браузере Android запустить мое приложение?
Мы настоятельно не рекомендуем людям использовать свои собственные схемы, если они не определяют новую схему всемирного Интернета.