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 进行授权的人...您根本不能将localhostChrome 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、开始和退出动画)不起作用

如何获取 Chrome 自定义选项卡保存的 cookie?

如何在 Android 应用程序的对话框中打开 Chrome 自定义选项卡

从 Chrome 自定义选项卡重定向到 Android 应用程序时“导航被阻止”

从 Chrome 自定义选项卡重定向到 Android 应用程序时“导航被阻止”

在 Chrome 自定义选项卡中从 WebView 打开链接时获取 ANR 对话框。我该如何调试?