Android индивидуальная схема URL ..? - PullRequest
40 голосов
/ 26 октября 2010

Я пытаюсь создать свою собственную схему URL, чтобы мое приложение для Android можно было вызывать через URL, но сейчас у меня нет успеха.

Я пытаюсь заставить работать этот URL: cedemo: // com.cedemo.scan? X = toto

Вот часть моего файла манифеста:

<activity android:name=".Gallery1" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.GALLERY" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="cedemo" android:host="com.cedemo.scan" />

        </intent-filter>
</activity>

Кто-нибудь может помочь мне сказать, что не так?Кроме того, если кто-то обнаружит, что что-то не так, может кто-нибудь сказать мне, как я читаю переменную "X" из кода Android из моего приложения?


Обновление:

Обновление: я сделал модификацию действия (как советовали в одном из ответов), и оно работало нормально.Дело в том, что я до сих пор не могу получить значение переменной URL.Вот код, который я попробовал.

final Intent intent = getIntent();
final String myScheme=intent.getScheme();
final Bundle myBundle=intent.getExtras();
final boolean inContestKey;
if (myBundle != null) {
    inContestKey=myBundle.containsKey("inContest");
}
final Uri myURI=intent.getData();
final String value;
if (myURI != null) {
    value = myURI.getQueryParameter("inContest");
}

Но я получаю null от всех функций ... что еще я могу сделать?

Может быть, я должен лучше объяснить контекст моего программного обеспечения:

  1. Мое программное обеспечение запущено
  2. Мое программное обеспечение запускается, затем браузер
  3. пользователь нажимает на ссылку в браузере, и браузер переходит к схеме URL, назадв программное обеспечение с переменной «X» (например)
  4. программное обеспечение должно читать переменную «X»

Но в моем случае: myScheme, myBundle,myURI установлены на null.

Есть идеи?


Обновление:

Я нашел ответ, что у вас естьбыть в основной деятельности, чтобы сделать это.

Ответы [ 3 ]

42 голосов
/ 26 октября 2010

Я думаю, что проблема с определенным вами действием.Существует «android.intent.action.VIEW», который, как я думаю, вы хотите.

<activity android:name=".Gallery1" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="cedemo" android:host="com.cedemo.scan" />

        </intent-filter>
</activity>

Попробуйте, и я держу пари, что проблема будет решена правильно.Я сделал это предположение только потому, что вы включили категорию просматриваемости, которая обычно используется браузером, который не знает ни о каких ваших пользовательских действиях.Если вы хотите, чтобы действие GALLERY имело значение, которое вы подразумевали, просто создайте 2 фильтра

<activity android:name=".Gallery1" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.GALLERY" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="cedemo" android:host="com.cedemo.scan" />

        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="cedemo" android:host="com.cedemo.scan" />

        </intent-filter>
</activity>

Таким образом, в пределах содержания вашей деятельности вы можете сделать что-то вроде:

// Value should be "toto" as in your example
String value = getData().getQueryParameter("X"); 
8 голосов
/ 11 июля 2013

Что меня окончательно исправило, так это изменение порядка элементов XML.В частности, поменяйте местами строки данных и действий так, чтобы данные были до того, как действие заставило их начать работать.

     <intent-filter>
        <data android:scheme="myappname" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.DEFAULT" />
     </intent-filter>

И для полноты, моя ссылка в html - "myappname: // noop".

3 голосов
/ 05 декабря 2014

Еще одна вещь, я хотел бы пролить свет. Первоначально это не работало для меня, потому что я использовал теги Main / Launcher перед View / Default / Browsable / data.

Как только я изменил порядок, он начал работать нормально. Т.е. изначально не работает код

<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.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="myapp" />
</intent-filter>

правильный код заказа

 <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="myapp" />
</intent-filter>

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>

и способ проверки на андроид очень прост. Сделайте любую вставку html файла

<a href="myapp://http://www.google.com/">test to launch myapp</a> <br /><br />

просто откройте этот HTML-файл и нажмите на тест, чтобы ....: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...