Хост схемы не работает на android lollipop, нажмите на ссылку, чтобы открыть приложение

Я использую этот кусок кода для запуска своего приложения по ссылке.

<activity
        android:name="com.example.myApp.myClass"
        android:label="@string/app_name" >
    <intent-filter>
        <data
            android:host="customHostName"
            android:scheme="customScheme" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>  

Это ссылка href, я хочу получить ключ в конце.

customScheme://customHost/49FYTJTF00

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

Что мне делать?

Ответ 1

Пожалуйста, используйте pathprefix.

   android:pathPrefix="/"

Это может решить вашу проблему. Пожалуйста, следуйте URL-адрес разработчика Android.

Ответ 2

Изменить:

После тестирования и тестирования я обнаружил, что если ваша схема содержит символ верхнего регистра, браузер не сможет ее запустить. Ваша схема должна содержать только строчные символы!

Также обратите внимание, что ошибка 459156 проекта chromium по-прежнему не позволяет вам запускать url напрямую, вы должны ссылаться на веб-страницу, содержащую этот код JavaScript:

<!DOCTYPE html>
<html>
    <body>
        <script language="javascript">
            window.location = 'customscheme://customHost/49FYTJTF00';
        </script>
    </body>
</html>

Пользователям, приземляющимся на этой странице, автоматически будет предложено либо диалоговое окно выбора действий, либо непосредственно отправить в свою активность.

Чтобы попробовать, откройте браузер Android, перейдя по указанному ниже адресу и скопируйте этот фрагмент в редакторе: http://www.w3schools.com/html/tryit.asp?filename=tryhtml_intro

Gif, показывающий браузер + JavaScript, открывающий активность

Gif

Оригинальное сообщение

Я опробовал свой пользовательский URI, и он работает на Android 5.0

Но вы должны знать о следующих двух ошибках/проблемах:

Мой подход

Я создал два отдельных Деяния, один как приемник цели, а другой - как пусковую установку. В запуске действует EditText, где может быть введен полный URI и кнопка для запуска введенного URI.

Main.java onClick (активность запуска)

@Override
public void onClick(View view) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse(input.getText().toString()));
    try {
        startActivity(intent);
    } catch(ActivityNotFoundException e){
        Toast.makeText(this, "Auww!! No Activity can open this URI!", Toast.LENGTH_SHORT).show();
    }
}

manifest.xml(только действия)

Обратите внимание на часть <data android:pathPattern=".*"/>. эта часть важна, поэтому все, что принимается хостом, будет считаться действительным.

<activity
    android:name=".Main"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

<activity
    android:name=".UriActivity"
    android:label="@string/app_name">

    <!--
    This intent-filter will open any URI with the following forms:

    customscheme://customHost/49FYTJTF00
    customscheme://customHost
    https://www.google.com/something/something
    http://www.google.com/
    http://google.com/something
    -->

    <intent-filter>
        <data android:scheme="https"/>
        <data android:scheme="http"/>
        <data android:host="google.com"/>
        <data android:host="www.google.com"/>

        <data android:scheme="customscheme"/>
        <data android:host="customHost"/>

        <data android:pathPattern=".*"/>

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

UriActivity.java(Получение активности)

public class UriActivity extends ActionBarActivity {

    private TextView tvText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_uri);
        tvText = (TextView) findViewById(R.id.text);
        setTextFromIntent();
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setTextFromIntent();
    }

    private void setTextFromIntent(){
        StringBuilder text = new StringBuilder();

        Uri data = getIntent().getData();
        if(data != null){
            text.append("Path:\n");
            text.append(data.getPath());

            text.append("\n\nScheme:\n");
            text.append(data.getScheme());

            text.append("\n\nHost:\n");
            text.append(data.getHost());

            text.append("\n\nPath segments:\n");
            text.append(Arrays.toString(data.getPathSegments().toArray()));
        } else {
            text.append("Uri is null");
        }
        tvText.setText(text);
    }
}

Скриншот:

Result of sending the custom intent to the UriActivity

Загрузка тестового проекта:

Я сделал скачать для проекта, если вы не попробуете сами.

Ответ 3

Вместо использования ссылки на customScheme://customHost/49FYTJTF00 вы пробовали использовать ссылку, например

<a href="intent://customHostName/49FYTJTF00#Intent;scheme=customScheme;end">

Chrome должен иметь возможность открыть это приложение просто отлично. В то же время это может не работать во всех браузерах.

Ответ 4

Вы писали:

    <data
        android:host="customHostName"
        android:scheme="customScheme" />

Итак, используйте customScheme://customHostName/49FYTJTF00
вместо customScheme://customHost/49FYTJTF00

Ответ 5

Имейте в виду, что если вы хотите запустить приложение из Google Chrome, вы должны сделать это в другим способом.