На этой странице: 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);
Что делать?
@MichaelButscher Короче говоря, я не знаю, как сохранить URL-адрес в строке. Эта часть кода автоматически создается Android Studio. Я плохо разбираюсь в Java, поэтому не знаю, что он делает. Я как-то хочу передать этот URL-адрес действию. Насколько я понимаю, мне нужно сохранить этот URL-адрес в строке в этом действии, и после этого мне нужно загрузить следующее действие и использовать там строку.
В этом случае вы должны начать с Учебники по Java, затем с Документация Android.
@MichaelButscher Это то, о чем я сейчас говорю. Другая часть моего приложения готова. Это последнее, что мне нужно реализовать.
Есть Context.startActivity (Activity - это Context). Возможно, вам придется сконструировать правильный Intent, который описан в документации для Intent.
@MichaelButscher Итак, я думаю, в автоматически сгенерированном коде уже есть нужный мне URL?
У Intent, который вы получили, есть URL-адрес в виде данных, да.
@MichaelButscher Спасибо за помощь. Теперь мне просто нужно выяснить, как создать намерение.
передавать данные с намерением его intent.putExtra ("ключ", "значение"); Здесь вашим значением будет строка URL. Затем в деятельности, к которой идет это намерение, вы его понимаете. Намерение намерения = getIntent (); Строковое значение = intent.getStringExtra («ключ»);
@DroiDev Это пробовал. Я все еще получаю ту же ошибку. Невозможно разрешить символ. И часть String value показывает, что значение переменной предупреждения никогда не используется, хотя я использую R.string.value для загрузки WebView.
вы не используете R.string.value ... вы используете значение. я перечитал твой вопрос. вы сказали, что хотите, чтобы пользователь щелкнул ссылку, и эта ссылка приведет его в приложение на определенную страницу ... верно? Я говорил с вами об этом в другой вашей ступени (прекратите создавать темы). Я отвечу на это так, как задается ваш вопрос.
@DroiDev Да, это решило проблему. Хотя приложение вылетает. Я исследую это. Спасибо.




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