Хостът на схемата не работи на 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.
Когато щракна върху връзката, тя показва само списъка с браузъри за стартиране.

Какво трябва да направя?


person Salmaan    schedule 18.03.2015    source източник
comment
Можете ли да споделите вашия URL адрес. включете вашия префикс път.. опитайте да промените и sdk 21   -  person Ahmad Arslan    schedule 13.04.2015


Отговори (5)


Моля, използвайте префикс на пътя.

   android:pathPrefix="/"

Може да реши проблема ви. Моля, следвайте URL адреса на ръководство за програмисти за Android.

person Ahmad Arslan    schedule 13.04.2015

Редактиране:

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

Също така имайте предвид, че грешка 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

Изтегляне на тестов проект:

Направих изтегляне за проекта, ако не искате опитайте го сами.

person Rolf ツ    schedule 14.04.2015
comment
Благодаря, @Rolf, но работи, когато схемата е http или https, но аз използвам персонализирана схема ... Но ако използвам http/https като схема и щракна върху връзката от приложението за имейл, то се показва отворено с диалогов прозорец или отваря избраното приложение по подразбиране за стартиране на URL адреси, т.е. браузър. Искам да отвори приложението ми. - person Salmaan; 14.04.2015
comment
@Salmaan персонализиран URI работи за мен (вижте екранната снимка). Прочетохте ли доклада за грешка относно браузъра Chromium? Персонализираните схеми не се поддържат, освен ако не са заредени чрез window.location (JavaScript) - person Rolf ツ; 14.04.2015
comment
Можете да изтеглите проекта и да премахнете частите google.com и http/ https и да опитате сами;) - person Rolf ツ; 14.04.2015
comment
@Salmaan Току-що се опитах да стартирам персонализираната схема от браузъра Android 5.0 с помощта на JavaScript и открих, че ti не работи, но когато използвам схема с малки букви, всичко работи добре! Така че трябва да използвате схема с малки букви. - person Rolf ツ; 14.04.2015
comment
Само не забравяйте частта с JavaScript;) Актуализирах и изходния код за изтегляне! - person Rolf ツ; 14.04.2015
comment
Изпращам си хипервръзка като имейл, hfi://elabelrid/123, и не знам защо все още не работи :/? - person Salmaan; 14.04.2015
comment
и работеше на предишни версии на android :/ Пробвано на 4.4 - person Salmaan; 14.04.2015
comment
И @Rolf го отварям от приложението за имейл - person Salmaan; 14.04.2015
comment
Моят примерен проект работи ли за вас? Редактирахте ли схемите във файла manifest.xml? Забележка: Приложението за имейл вероятно използва WebView за показване на съдържанието на имейла. WebView в Android 5.0 използва Chromium webkit, поради грешката, която споменах, щракването върху връзката не работи. Ами ако се опитате да изпратите връзка с JavaScript? - person Rolf ツ; 14.04.2015
comment
Е, това е твой проблем, но не мога да ти помогна с това ;) Или трябва да изчакаш корекцията на грешки в Chromium. - person Rolf ツ; 14.04.2015
comment
Разбрах, че предложеният от вас метод работи на няколко браузъра (напр. dolphin, UC Browser), но не и на chrome, нито на някои приложения... Нито една дейност не може да отвори този URI - person Salmaan; 14.04.2015
comment
Можете да попълните доклад за грешка при разработчиците на Chrome. - person Rolf ツ; 14.04.2015
comment
Благодаря Ролф. как да управлявам това като pathPattern example?id=123 ‹data android:pathPattern=/› пробвах example?id= и example?id=*, но не работи! някаква идея? - person Muhammad Babar; 26.05.2015

Вместо да използвате връзка към customScheme://customHost/49FYTJTF00, пробвали ли сте да използвате връзка като

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

Chrome трябва да може да го отвори в приложението ви съвсем добре. В същото време това може да не работи на всички браузъри.

person A J    schedule 18.04.2015

Имайте предвид, че ако искате да стартирате приложението от Google Chrome, трябва да го направите по друг начин .

person klimat    schedule 19.04.2015
comment
Е, не става въпрос само за chrome, но и за всяко имейл приложение, което потребителят има, или всеки браузър, който използва - person Salmaan; 19.04.2015
comment
@Salmaan Не ви давам решение за всички случаи, но съм почти сигурен, че подходът, който споменах, ще ви помогне с Chrome. - person klimat; 19.04.2015

Ти написа:

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

Затова използвайте customScheme://customHostName/49FYTJTF00
вместо customScheme://customHost/49FYTJTF00

person ytRino    schedule 17.04.2015
comment
Това е просто печатна грешка във въпроса (като пример), OP каза, че е работил преди. - person Rolf ツ; 17.04.2015