Android custom url схема..?

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

Я пытаюсь использовать этот url: cedemo://com.cedem.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 из моего приложения?


Update:

Обновление: я сделал модификацию действия (как было сказано в одном из ответов), и он работал нормально. Дело в том, что я все еще не могу получить значение переменной 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 от всех функций... что еще я могу сделать?

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

  • Запущено мое программное обеспечение.
  • Мой запуск программного обеспечения, затем браузер
  • пользователь нажимает ссылку в браузере, а браузер переходит к схеме URL-адресов, обратно к программному обеспечению с переменной "X" (например)
  • программное обеспечение должно читать переменную "X"

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

Любые идеи?


Update:

Я нашел ответ, что вы должны быть в основном для этого.

Ответ 1

Я думаю, проблема в том, что вы определили действие. Существует "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"); 

Ответ 2

Что для меня окончательно изменило, это изменить порядок элементов 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

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

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

<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>

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

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

просто откройте этот html файл и нажмите на test to....: -)