Хост схемы не работает на 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.
Когда я нажимаю ссылку, она показывает только список браузеров для запуска.

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

Редактировать:

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

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

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

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

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

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

Gif

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

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

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

  1. Ошибка 459156 проекта Chromium. Это означает, что запуск пользовательских схем из браузера Android не работает, если URL-адрес не применяется с использованием JavaScript. Обходной путь см. В этой статье StackOverflow: OAuth и пользовательская схема приводят к «ERR_UNKNOWN_URL_SCHEME» в Chrome
  2. Ошибка 80971: URI с пользовательской схемой не может быть нажата в SMS-тексте (Linkify?)

Мой подход

Я создал два отдельных упражнения, один из них как приемник намерений, а другой – как пусковую установку. В запуске действует 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); } } 

Скриншот:

Результат отправки пользовательского намерения в UriActivity

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

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

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

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

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

Вы написали:

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

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

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

Используйте pathprefix.

  android:pathPrefix="/" 

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