Chrome 自定义选项卡 - 未触发意图 (Android)
Posted
技术标签:
【中文标题】Chrome 自定义选项卡 - 未触发意图 (Android)【英文标题】:Chrome Custom Tabs - Intent not being triggered (Android) 【发布时间】:2016-08-28 18:10:29 【问题描述】:我正在努力在我当前的 android 应用程序中实现 PayPal,并且有人建议我使用 Chrome 自定义选项卡,但我似乎无法触发 Intent。
我相信我已经在 AndroidManifest.xml 中正确设置了 Intent
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.rhiannon.chromecustomtabs">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".CompletePayPalPaymentActivity">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="Test"
android:host="com.Test.TestApp.PayPalReturn"/>
</intent-filter>
</activity>
</application>
</manifest>
我能够在 Fragment 类中成功启动 Google Chrome 选项卡(我有 2 个按钮:
将在 Chrome 自定义标签中启动 www.google.co.uk 的按钮 一个按钮,用于启动我的自定义网页(托管在本地主机上),当用户单击按钮/链接时将引发重定向请看下面这个片段的代码:
public class MainFragment extends Fragment implements CustomTabsSceneHelper.ConnectionCallback
public enum CustomTabsAction
GOOGLE ("Open Google", "http://google.co.uk"),
REDIRECT ("Open Redirect", "http://mylocalhost_ip/~Rhiannon/example1/test.html");
private final String mActionDescription;
private final String mActionUrl;
CustomTabsAction (
final String actionDescription,
final String actionUrl)
mActionDescription = actionDescription;
mActionUrl = actionUrl;
public String actionDescription ()
return mActionDescription;
public String actionUrl ()
return mActionUrl;
private CustomTabsSceneHelper mCustomTabsSceneHelper;
private CustomTabsAction mCurrentAction;
@Override
public void onCreate(@Nullable Bundle savedInstanceState)
super.onCreate(savedInstanceState);
mCustomTabsSceneHelper = new CustomTabsSceneHelper();
mCustomTabsSceneHelper.setConnectionCallback(this);
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment_main, container, false);
Button buttonGoogle = (Button) view.findViewById(R.id.button_google);
buttonGoogle.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
open(CustomTabsAction.GOOGLE);
);
Button buttonRedirect = (Button) view.findViewById(R.id.button_redirect);
buttonRedirect.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
open(CustomTabsAction.REDIRECT);
);
return view;
private void open(CustomTabsAction action)
final Activity scene = getActivity ();
mCurrentAction = action;
CustomTabsSceneHelper.openCustomTab(
scene,
getCustomTabIntent(scene, mCustomTabsSceneHelper.occupySession()).build(),
Uri.parse(action.actionUrl())
);
public static CustomTabsIntent.Builder getCustomTabIntent(
@NonNull Context context,
@Nullable CustomTabsSession session)
// Construct our intent via builder
final CustomTabsIntent.Builder intentBuilder = new CustomTabsIntent.Builder (session);
// Toolbar color
intentBuilder.setToolbarColor(Color.GREEN);
// Show title
intentBuilder.setShowTitle(true);
// Allow hiding for toolbar
intentBuilder.enableUrlBarHiding();
return intentBuilder;
@Override
public void onCustomTabsConnected()
Log.i("MainFragment", "Custom Tabs > CONNECTED");
if(mCurrentAction != null)
mCustomTabsSceneHelper.mayLaunchUrl(Uri.parse(mCurrentAction.actionUrl()), null, null);
@Override
public void onCustomTabsDisconnected()
Log.i("MainFragment", "Custom Tabs > DISCONNECTED");
@Override
public void onStart()
super.onStart();
mCustomTabsSceneHelper.bindCustomTabsService(getActivity());
@Override
public void onStop()
mCustomTabsSceneHelper.unbindCustomTabsService(getActivity());
super.onStop();
@Override
public void onDestroy()
mCustomTabsSceneHelper.setConnectionCallback(null);
super.onDestroy();
然后我有我的自定义网页:
<!DOCTYPE html>
<html>
<head>
<title>PayPal Test Redirect</title>
<script type="text/javascript">
function RedirectSuccess()
window.location="Test://com.Test.TestApp.PayPalReturn://return";
function RedirectCancel()
window.location="Test://com.Test.TestApp.PayPalReturn://cancel";
</script>
</head>
<body>
<a href="Test://com.Test.TestApp.PayPalReturn://return">Success</a>
<a href="Test://com.Test.TestApp.PayPalReturn://cancel">Cancel</a>
<input type="button" onclick="RedirectSuccess();" name="ok" value="Success" />
<input type="button" onclick="RedirectCancel();" name="ok" value="Cancel" />
</body>
</html>
我希望当用户单击 Chrome 自定义选项卡中网页上的链接/按钮之一时,用户将被重定向回应用程序,但我似乎无法使此功能正常工作。
public class CompletePayPalPaymentActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_complete_paypal);
List<String> params = getIntent().getData().getPathSegments();
if(params.get(0).equals("return"))
Log.i("CompletePP", "PayPal Payment Success");
else
Log.i("CompletePP", "PayPal Payment Cancelled");
任何帮助,将不胜感激!
【问题讨论】:
对于任何试图将http://localhost:8200
用作redirectUrl
进行授权的人...您根本不能将localhost
与Chrome Custom Tabs
一起使用...您需要定义您自己的自定义 url 方案。如果您只是 Android 开发人员,您可能需要让您的后端开发人员在他们的末端包含此更改。
【参考方案1】:
我认为您的方案和主机混淆了。自定义方案 URI 没有主机!所以试试这个:
AndroidManifest.xml
<activity android:name=".CompletePayPalPaymentActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="com.Test.TestApp.PayPalReturn"/>
</intent-filter>
</activity>
那么您的 HTML 链接将是:
<a href="com.Test.TestApp.PayPalReturn:/cancel">Cancel</a>
对于一个工作示例,结帐AppAuth for Android,它显示了一个 Chrome 自定义选项卡用于执行 OAuth 流(到 Google 的 OAuth 服务器),包括从返回意图解析数据。这是该演示中的AndroidManifest.xml。
【讨论】:
以上是关于Chrome 自定义选项卡 - 未触发意图 (Android)的主要内容,如果未能解决你的问题,请参考以下文章
Chrome 自定义选项卡自定义(如 setToolbarColor、开始和退出动画)不起作用
如何在 Android 应用程序的对话框中打开 Chrome 自定义选项卡
从 Chrome 自定义选项卡重定向到 Android 应用程序时“导航被阻止”