Пользовательские вкладки Chrome — намерение не срабатывает (Android)

Я работаю над внедрением PayPal в свое текущее приложение для Android, и мне посоветовали использовать настраиваемые вкладки Chrome, но я не могу заставить активировать Intent.

Я считаю, что правильно настроил Intent в AndroidManifest.xml.

<?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>

Я могу успешно запустить вкладки Google Chrome в своем классе Fragment (где у меня есть 2 кнопки:

  • Кнопка, которая запускает www.google.co.uk на пользовательской вкладке Chrome.
  • Кнопка, которая запускает мою пользовательскую веб-страницу (размещенную на локальном хосте), которая будет вызывать перенаправления, когда пользователь нажимает кнопку/ссылку.

Пожалуйста, смотрите ниже код для этого фрагмента:

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");
        }
    }
} 

Любая помощь вообще, будет принята с благодарностью!


person RheeBee    schedule 03.05.2016    source источник
comment
Для всех, кто пытается использовать http://localhost:8200 в качестве redirectUrl для своих авторизаций... вы вообще не можете использовать localhost с Chrome Custom Tabs... вам нужно определить собственную пользовательскую схему URL-адресов. Возможно, вам потребуется, чтобы ваш бэкэнд-разработчик включил это изменение в свою часть, если вы просто разработчик Android.   -  person Sakiboy    schedule 14.04.2017


Ответы (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 для Android, он показывает настраиваемую вкладку Chrome, используемую для выполнения потока OAuth (к Google серверы OAuth), включая синтаксический анализ данных из намерения возврата. Вот AndroidManifest.xml из этой демонстрации.

person William Denniss    schedule 06.05.2016