Android, как создать пользовательскую схему URL-адресов с заданным форматом myapp://http://

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

Я хочу, чтобы мое приложение запускалось, щелкнув определенный URL-адрес в браузере (любой на мобильном устройстве), дело в том, что мой данный URL-адрес нельзя изменить, поскольку он также обслуживает приложение IOS, и это выглядит так:

"myapp://http://www.name.com/path/path2/"

Я не уверен, как обрабатывать "myapp://http://" и создавать правильный фильтр намерений, и все, что я пробовал, не работает. Любая помощь будет оценена по достоинству, и если я пропустил соответствующий ответ, пожалуйста, за исключением моих извинений.

Это то, что я пробовал до сих пор:

      <activity
        android:name="com.myapp.test.SplashScreen"
        android:exported="true"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

        <!-- Test for URL scheme -->
        <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:host="www.name.com"
                android:path="/path/path2/"
                android:scheme="http" />
            <data
                android:host="www.name.com"
                android:path="/path/path2/"
                android:scheme="https" />

            <data android:scheme="myapp" />
        </intent-filter>
        <!-- End Test for URL scheme -->
    </activity>

Примечание. я пробовал с/без exported:true


person EviatarS    schedule 07.08.2013    source источник
comment
Поскольку это недопустимая структура Uri, я очень сомневаюсь, что она будет работать. Вам будет проще изменить свое приложение iOS, чтобы использовать что-то, что является допустимым URI.   -  person CommonsWare    schedule 07.08.2013
comment
@CommonsWare Привет, спасибо за комментарий. Этот тип URI работает в приложении IOS, им удается открыть приложение, нажав на эту ссылку. Как вы думаете, может быть только одна схема, такая как myapp:// ИЛИ http://?   -  person EviatarS    schedule 07.08.2013
comment
Как вы думаете, может быть только одна схема, такая как myapp:// ИЛИ http:// ? -- да. В лучшем случае, если вам повезет, http:// будет считаться хостом. В худшем случае ваш Uri просто не сможет разобрать. И я могу придумать еще несколько вариантов. В классе Uri есть только одна схема — класс Uri не допускает более одной.   -  person CommonsWare    schedule 07.08.2013
comment
Я прочитал RFC 2396 так, что он определил непрозрачную схему URI, и тот факт, что специфичная для схемы часть выглядит как другой URI, не имеет отношения к синтаксическому анализатору URI. (Кроме того, это немного бойко и бесполезно предлагать просто изменить ваше приложение iOS, вероятно, у него есть код в дикой природе, с которым ему нужно поддерживать совместимость.)   -  person cluesque    schedule 11.12.2013


Ответы (3)


Как сказал CommonsWare, данный URI, когда мне нужно было создать схему, не является допустимым URI, поэтому схема не работала, и приложение не запускалось. После этого объяснения ребята со стороны сервера были убеждены изменить URI на myapp://... и это сработало как по волшебству :).

Активность теперь выглядит так:

 <activity
    android:name="com.myapp.test.SplashScreen"
    android:exported="true"
    android:label="@string/app_name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

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

    <!-- Test for URL scheme -->
    <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>
    <!-- End Test for URL scheme -->
</activity>
person EviatarS    schedule 08.08.2013
comment
Процесс кажется простым, но у меня он не работает - person Mazen Kasser; 24.09.2013
comment
@MazenKasser привет, как выглядит твоя схема? может быть я смогу помочь, если выложишь сюда - person EviatarS; 07.10.2013
comment
спасибо, у меня все заработало, потому что я не пробовал полный формат myapp://mydomain.com/, а также обнаружил, что не все приложения для чтения QR или мобильные интернет-браузеры поддерживают DeepLinking... - person Mazen Kasser; 08.10.2013
comment
myapp:// переход к приложению в браузере по умолчанию. но в хроме не открывается приложение. - person madan V; 07.01.2014
comment
@madanV куда идет хром вместо открытия приложения? - person EviatarS; 13.01.2014
comment
Важное примечание: ввод схемы URL-адреса вручную в адресную строку браузера и нажатие Enter для ее загрузки не работает. Это РАБОТАЕТ, если вы НАЖМЕТЕ на URL-адрес с этой схемой! - person Lane Rettig; 17.09.2016

Это неправильное использование схемы URI и недопустимо. URL-адрес HTTP, который вы хотите передать, является частью данных и поэтому должен быть отправлен в строке запроса.

myapp://somehost/action?url=http%3A%2F%2Fwww.name.com%2Fpath%2Fpath2%2F
person Monstieur    schedule 06.06.2014
comment
Он заявил, что его given URL cannot be modified as it serves IOS app as well - person UeliDeSchwert; 06.06.2014

вам нужно использовать гиперссылку, чтобы запустить приложение. например, вы устанавливаете схему = "yourpackagename", вам нужно установить гиперссылку следующим образом: yourpackagename://host, и вы должны просмотреть гиперссылку в своем мобильном браузере. Если у вас нет ярлыка хоста, просто удалите его.

<!-- Test for URL scheme -->
<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:host="host" android:scheme="yourpackagename" />
</intent-filter>
<!-- End Test for URL scheme -->

Если ваша деятельность имеет более одной схемы, вы должны использовать 2 или более, чтобы указать ее.

person Yachao    schedule 15.03.2016
comment
android:host="" выдает ошибку: android:host не может быть пустым - person Lane Rettig; 17.09.2016
comment
спасибо за ваш комментарий, в студии просто удалите этот код // android:host= если вам не нужен хост - person Yachao; 19.09.2016