Захват данных, предоставленных Intent

На этой странице: https://developer.android.com/training/app-links/deep-linking, в

'Read data from incoming intents'

в разделе Google упоминается:

Once the system starts your activity through an intent filter, you can use data provided by the Intent to determine what you need to render. Call the getData() and getAction() methods to retrieve the data and action associated with the incoming Intent.

И это именно то, что я пытаюсь сделать, но у меня нет помощи.

В этой моей деятельности:

package com.application;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;

@SuppressWarnings("unused")

public class SplashActivity3 extends Activity
{
    Handler Handler;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash3);

        Handler = new Handler();
        Handler.postDelayed(new Runnable()
                            {
                                @Override
                                public void run()
                                {
                                    Intent intent = new Intent(SplashActivity3.this, MainActivity.class);
                                    startActivity(intent);
                                    finish();
                                }
                            },
                1500);

        Intent appLinkIntent = getIntent();
        String appLinkAction = appLinkIntent.getAction();
        Uri appLinkData = appLinkIntent.getData();
    }
}

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

По сути, мое приложение использует ссылки на приложения (некоторые также называют их глубинными ссылками). Таким образом, в случае, когда пользователь «A» отправляет пользователю «B» ссылку на страницу на моем веб-сайте, а у B установлено мое приложение, он / она сможет открыть ссылку в моем приложении вместо браузера.

На данный момент B может открыть ссылку в моем приложении, но мое приложение всегда будет загружать «домашнюю страницу» (это потому, что я закодировал свое приложение для открытия домашней страницы по умолчанию). Я хочу загрузить страницу, которая привела B в свое приложение.

Для примера из реальной жизни, как и в приложении Facebook. Предположим, я поделился с другом ссылкой на страницу или профиль в Facebook. Это стандартная ссылка HTTP, отображаемая в моем веб-браузере. Наверное, поделился с ним в WhatsApp. Он касается ссылки, чтобы открыть ее. На его телефоне установлено официальное приложение Facebook. Итак, Android спрашивает его, хочет ли он открыть ссылку в приложении Facebook или в браузере. Теперь, когда он выбирает браузер, это вообще не проблема. Но когда он выбирает приложение Facebook, приложение загружает профиль или страницу, которая существует по ссылке, а не домашнюю страницу Facebook. Вот чего я хочу добиться.

Обратите внимание: здесь я говорю о стандартных HTTP-ссылках, а не о конкретных URI моего приложения.

ОБНОВИТЬ:

Вот кое-что, что я попробовал сейчас:

Это то же действие, что и выше, я изменил его следующим образом:

package com.application;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;

@SuppressWarnings("unused")

public class SplashActivity3 extends Activity
{
    Handler Handler;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        final Intent appLinkIntent = getIntent();
        final String appLinkAction = appLinkIntent.getAction();
        Uri appLinkData = appLinkIntent.getData();

        final Bundle bundle = new Bundle();
        bundle.putString("web", appLinkAction);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash3);

        Handler = new Handler();
        Handler.postDelayed(new Runnable()
                            {
                                @Override
                                public void run()
                                {
                                    Intent intent = new Intent(SplashActivity3.this, WebViewActivity.class);
                                    intent.putExtras(bundle);
                                    startActivity(intent);
                                    finish();
                                }
                            },
                1500);


    }
}

И действие, в котором я загружаю URL:

package com.application;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.WebChromeClient;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Toast;

@SuppressWarnings("deprecation")

public class WebViewActivity extends AppCompatActivity
{
    private WebView WebView;
    private ProgressBar ProgressBar;
    private LinearLayout LinearLayout;
    private String currentURL;

    @SuppressLint("SetJavaScriptEnabled")

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        WebView wv = new WebView(this);
        wv.loadUrl("file:///android_asset/eula.html");
        wv.getSettings().setJavaScriptEnabled(true);
        wv.getSettings().setUserAgentString("customUA");
        wv.setWebViewClient(new WebViewClient()
        {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url3)
            {
                view.loadUrl(url3);
                return true;
            }
        });

        final SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        boolean agreed = sharedPreferences.getBoolean("agreed",false);

        if (!agreed)
        {
            new AlertDialog.Builder(this, R.style.AlertDialog)
                    .setIcon(R.drawable.ic_remove_circle_black_24dp)
                    .setTitle(R.string.eula_title)
                    .setView(wv)
                    .setCancelable(false)
                    .setPositiveButton(R.string.accept, new DialogInterface.OnClickListener()
                    {
                        @Override
                        public void onClick(DialogInterface dialog, int which)
                        {
                            SharedPreferences.Editor editor = sharedPreferences.edit();
                            editor.putBoolean("agreed", true);
                            editor.apply();
                        }
                    })
                    .setNegativeButton(R.string.decline, new DialogInterface.OnClickListener()
                    {
                        @Override
                        public void onClick(DialogInterface dialog, int which)
                        {
                            finish();
                        }
                    })
                    .show();
        }

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WebView = findViewById(R.id.webView5);
        ProgressBar = findViewById(R.id.progressBar5);
        LinearLayout = findViewById(R.id.layout5);

        ProgressBar.setMax(100);

        Bundle bundle = getIntent().getExtras();
        String url = bundle.getString("web");

        WebView.loadUrl(R.string.url);
        WebView.getSettings().setJavaScriptEnabled(true);
        WebView.getSettings().setUserAgentString("customUA");
        WebView.setWebViewClient(new WebViewClient()
        {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon)
            {
                LinearLayout.setVisibility(View.VISIBLE);
                super.onPageStarted(view, url, favicon);
            }

            @Override
            public void onPageFinished(WebView view, String url)
            {
                LinearLayout.setVisibility(View.GONE);
                super.onPageFinished(view, url);
                currentURL = url;
            }

            @Override
            public void onReceivedError(WebView webview, int i, String s, String s1)
            {
                WebView.setVisibility(View.GONE);
                Intent intent = new Intent(WebViewActivity.this, ErrorActivity.class);
                startActivity(intent);
                finish();
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url2)
            {
                if (url2.contains("www.mydomain.tld"))
                {
                    view.loadUrl(url2);
                    return false;
                } else
                {
                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url2));
                    startActivity(intent);
                    return true;
                }
            }
        });

        WebView.setWebChromeClient(new WebChromeClient()
        {
            @Override
            public void onProgressChanged(WebView view, int newProgress)
            {
                super.onProgressChanged(view, newProgress);
                ProgressBar.setProgress(newProgress);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        super.onPrepareOptionsMenu(menu);
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @SuppressLint("SetJavaScriptEnabled")

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch (item.getItemId())
        {
            case R.id.backward:
                onBackPressed();
                break;

            case R.id.forward:
                onForwardPressed();
                break;

            case R.id.refresh:
                WebView.reload();
                break;

            case R.id.share:
                Intent shareIntent = new Intent(Intent.ACTION_SEND);
                shareIntent.setType("text/plain");
                shareIntent.putExtra(Intent.EXTRA_TEXT,currentURL);
                startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.shareWith)));
                break;

            case R.id.update:
                Intent intent = new Intent(WebViewActivity.this, UpdateActivity.class);
                startActivity(intent);
                finish();
                break;

            case R.id.about:

                WebView wv2 = new WebView(this);
                wv2.loadUrl("file:///android_asset/about.html");
                wv2.getSettings().setJavaScriptEnabled(true);
                wv2.getSettings().setUserAgentString("customUA");
                wv2.setWebViewClient(new WebViewClient()
                {
                    @Override
                    public boolean shouldOverrideUrlLoading(WebView view, String url4)
                    {
                        view.loadUrl(url4);

                        return true;
                    }
                });

                new AlertDialog.Builder(this, R.style.AlertDialog)
                        .setIcon(R.drawable.ic_info_black_24dp)
                        .setTitle(R.string.info)
                        .setView(wv2)
                        .setPositiveButton(R.string.okay, null)
                        .show();
                break;

            case R.id.exit:
                new AlertDialog.Builder(this,R.style.AlertDialog)
                        .setIcon(R.drawable.ic_error_black_24dp)
                        .setTitle(R.string.title)
                        .setMessage(R.string.message)
                        .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener()
                        {
                            @Override
                            public void onClick(DialogInterface dialog, int which)
                            {
                                finish();
                            }
                        })
                        .setNegativeButton(R.string.no, null)
                        .show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    private void onForwardPressed()
    {
        if (WebView.canGoForward())
        {
            WebView.goForward();
        } else
        {
            Toast.makeText(this, R.string.noFurther, Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onBackPressed ()
    {
        if (WebView.canGoBack())
        {
            WebView.goBack();
        } else
        {
            new AlertDialog.Builder(this,R.style.AlertDialog)
                    .setIcon(R.drawable.ic_error_black_24dp)
                    .setTitle(R.string.title)
                    .setMessage(R.string.message)
                    .setPositiveButton(R.string.yes,
                            new DialogInterface.OnClickListener()
                            {
                                @Override
                                public void onClick(DialogInterface dialog, int which)
                                {
                                    finish();
                                }
                            })
                    .setNegativeButton(R.string.no, null)
                    .show();
        }
    }
}

Но я получаю ошибку Cannot resolve symbol url на WebView.loadUrl(R.string.url);

Что делать?

В чем проблема? appLinkData не содержит конкретный URL-адрес или у вас есть проблемы с анализом URL-адреса, чтобы найти желаемое действие и данные для отображения?

Michael Butscher 04.12.2018 12:27

@MichaelButscher Короче говоря, я не знаю, как сохранить URL-адрес в строке. Эта часть кода автоматически создается Android Studio. Я плохо разбираюсь в Java, поэтому не знаю, что он делает. Я как-то хочу передать этот URL-адрес действию. Насколько я понимаю, мне нужно сохранить этот URL-адрес в строке в этом действии, и после этого мне нужно загрузить следующее действие и использовать там строку.

Hrishikesh Kokate 04.12.2018 12:31

В этом случае вы должны начать с Учебники по Java, затем с Документация Android.

Michael Butscher 04.12.2018 12:38

@MichaelButscher Это то, о чем я сейчас говорю. Другая часть моего приложения готова. Это последнее, что мне нужно реализовать.

Hrishikesh Kokate 04.12.2018 12:39

Есть Context.startActivity (Activity - это Context). Возможно, вам придется сконструировать правильный Intent, который описан в документации для Intent.

Michael Butscher 04.12.2018 12:49

@MichaelButscher Итак, я думаю, в автоматически сгенерированном коде уже есть нужный мне URL?

Hrishikesh Kokate 04.12.2018 12:51

У Intent, который вы получили, есть URL-адрес в виде данных, да.

Michael Butscher 04.12.2018 12:54

@MichaelButscher Спасибо за помощь. Теперь мне просто нужно выяснить, как создать намерение.

Hrishikesh Kokate 04.12.2018 13:01

передавать данные с намерением его intent.putExtra ("ключ", "значение"); Здесь вашим значением будет строка URL. Затем в деятельности, к которой идет это намерение, вы его понимаете. Намерение намерения = getIntent (); Строковое значение = intent.getStringExtra («ключ»);

letsCode 04.12.2018 14:41

@DroiDev Это пробовал. Я все еще получаю ту же ошибку. Невозможно разрешить символ. И часть String value показывает, что значение переменной предупреждения никогда не используется, хотя я использую R.string.value для загрузки WebView.

Hrishikesh Kokate 04.12.2018 14:58

вы не используете R.string.value ... вы используете значение. я перечитал твой вопрос. вы сказали, что хотите, чтобы пользователь щелкнул ссылку, и эта ссылка приведет его в приложение на определенную страницу ... верно? Я говорил с вами об этом в другой вашей ступени (прекратите создавать темы). Я отвечу на это так, как задается ваш вопрос.

letsCode 04.12.2018 14:59

@DroiDev Да, это решило проблему. Хотя приложение вылетает. Я исследую это. Спасибо.

Hrishikesh Kokate 04.12.2018 15:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
12
88
0

Другие вопросы по теме