El redireccionamiento de las pestañas personalizadas de Chrome a la aplicación para Android cerrará la aplicación.

Estoy tratando de implementar un flujo de OAuth2 con una pestaña personalizada de Android Chrome, pero mi aplicación siempre está cerrada (no se bloquea) cuando la pestaña personalizada de Chrome recibe el 302 con la ubicación / esquema de mi aplicación.

Si creo una página HTML con un vínculo ahref y toco manualmente en él, la ficha personalizada de Chrome cambia correctamente a mi aplicación.

Parece que al manejar el servidor 302 redireccionar en la pestaña personalizada de Chrome no manejar correctamente mi esquema de aplicación personalizada … pero ¿por qué?

Si intento la misma URL de redireccionamiento en un navegador de valores o con un WebView, todo funciona también.

Aquí está mi configuración actual:

MainActiviy.java

Button btnChromeCustomTab = (Button) findViewById(R.id.btnChromeCustomTab); btnChromeCustomTab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder().build(); String packageName = CustomTabsHelper.getPackageNameToUse(MainActivity.this); customTabsIntent.intent.setPackage(packageName); Uri theLocationUri = Uri.parse(URL); customTabsIntent.launchUrl(MainActivity.this, theLocationUri); } }); 

AndroidManifest.xml

  <activity android:name=".MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter android:label="@string/filter_title"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="myappscheme" android:host="oauth" /> </intent-filter> </activity> 

Ésta es la URL de redirección que recibió la aplicación con el código HTTP 302:

Myappscheme: // oauth? Code = 1234567 & state = tokenCheck123

Construir un gradiente

 android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "de.myapptest.webviewtest" minSdkVersion 16 targetSdkVersion 23 versionCode 1 versionName "1.0" } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.2.1' compile 'com.android.support:design:23.2.1' compile 'com.android.support:customtabs:23.0.0+' } 

Gracias por cualquier ayuda…

4 Solutions collect form web for “El redireccionamiento de las pestañas personalizadas de Chrome a la aplicación para Android cerrará la aplicación.”

También he observado mi aplicación Android inesperadamente de fondo después de la redirección del servidor 302 a un esquema personalizado y observé el manejo esperado de Chrome autónomo y la redirección desencadenada manualmente en el cliente.

Pude "arreglar" el problema llamando a la función de calentamiento antes de cargar la url que redirecciona.

En otras palabras, esto funciona:

 void launchTab(Context context, Uri uri){ final CustomTabsServiceConnection connection = new CustomTabsServiceConnection() { @Override public void onCustomTabsServiceConnected(ComponentName componentName, CustomTabsClient client) { final CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); final CustomTabsIntent intent = builder.build(); client.warmup(0L); // This prevents backgrounding after redirection intent.launchUrl(context, uri); } @Override public void onServiceDisconnected(ComponentName name) {} }; CustomTabsClient.bindCustomTabsService(context, "com.android.chrome", connection); } 

Esto no funciona:

 void launchTab(Context context, Uri uri){ final CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); final CustomTabsIntent intent = builder.build(); intent.launchUrl(context, uri); } 

La ficha personalizada de Chrome describe el calentamiento como una práctica recomendada, pero también parece ayudar a asegurar el comportamiento esperado.

En términos de env, estoy probando en un Nexus 5X con Chrome 51. Mi dependencia de cromo en la pestaña Gradle se ve así:

 dependencies { compile 'com.android.support:customtabs:24.0.0' 

Me ayudó a establecer la actividad que utilizo para iniciar un CustomTab para singleInstance modo en el archivo de manifiesto:

  <activity android:launchMode="singleInstance" android:name="com.example.SingleInstanceActivityToStartCustomTab" </activity> 

Y en el código hago como de costumbre:

  CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); final CustomTabsIntent customTabsIntent = builder.build(); customTabsIntent.intent.setPackage(someChromePackage); customTabsIntent.launchUrl(singleInstanceModeActivity, someUriThatDoesRedirect); 

Intenté calentar Chrome e incluso llamar a customTabsIntent.launchUrl() con un poco de retraso después de llamar a client.warmup(0l); Y tampoco ayudó.

Si he utilizado android: launchMode = "singleInstance" había varias instancias en el gestor de tareas por lo que no era ninguna opción.

Iniciar el CustomTabsIntent con FLAG_ACTIVITY_NEW_TASK Bandera hizo el truco.

 CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); CustomTabsIntent intent = builder.build(); intent.intent.setFlags(FLAG_ACTIVITY_NEW_TASK); intent.launchUrl(context, Uri.parse(url)); 

Estoy bastante seguro de que este es el resultado de un error en Chrome. He actualizado todos los dispositivos (GS6, GS7, Nexus 7 y Nexus 9) a la última versión de Chrome y mi aplicación ya no se minimiza cuando se produce la redirección.

Acabo de descubrir esto hoy (11/3/2016) así que todavía no tengo ninguna información sobre el bicho específico o su resolución subsecuente. Esto es justo lo que he notado.

¡Espero que ayude!

  • Autenticación social de la API Web de ASP.NET para Web y Mobile
  • ¿Es OAuth en un teléfono móvil usando un servidor proxy demasiado problema?
  • Cómo hacer http obtener solicitud en Android
  • RedDit oAuth 2 para Android aplicación "sin usuario" con Retrofit
  • Twitter OAuth Rest Api Estado Parámetro '@' symbol
  • Signpost OAuth en Android: ¿cómo volver a crear el consumidor entre dos corridas sucesivas?
  • Twitter4J + Android: El desafío de autenticación es una excepción nula
  • Android y OAUTH 2.0
  • Hacer Android WebView no almacenar cookies o contraseñas
  • ¿Alguien puede explicar OAuth?
  • ¿Cómo uso OAuth 2.0 para enviar Gmail desde Indy?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.