studio sirve que para otra intent intenciones chooser app aplicacion abrir android uri android-manifest android-intent

android - sirve - Filtro de intención para iniciar mi actividad cuando se hace clic en el URI personalizado



intentfilter android (7)

¿Se secó agregando una categoría a su filtro de intención?

<category android:name="android.intent.category.BROWSABLE" />

Estoy tratando de permitir que un URI se registre para abrirse con mi aplicación. Al igual que PatternRepository en Blackberry y CFBundleURLName / CFBundleURLSchemes en el iPhone. ¿Cómo logro los mismos resultados en Android?

El sistema enviará correos electrónicos con el siguiente enlace: myapp://myapp.mycompany.com/index/customerId/12345 . La idea es que el usuario debería poder hacer clic en el enlace para abrir la actividad del cliente en la aplicación.

He intentado numerosas sugerencias de otras publicaciones de SO, pero no logro que el sistema operativo reconozca el patrón y abra mi aplicación.

En la aplicación Gmail se ve así: myapp: // myapp.mycompany.com/index/customerId/12345 . Reconoce y subraya la parte myapp.mycompany.com/index/customerId/12345 del enlace y lo abre en un navegador. La parte myapp:// no está vinculada .

La aplicación de correo estándar trata el enlace completo como texto sin formato.

¿Que me estoy perdiendo aqui?

PD: Ya he analizado Cómo implementar mi propio esquema de URI en Android y Cómo registrar un espacio de nombre de URL (myapp: //app.start/) para acceder a tu programa llamando a una URL en el navegador en el sistema operativo Android.

El Manifiesto

<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="2" android:versionName="0.0.8" package="com.mycompany.myapp.client.android"> <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="7"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <application android:label="@string/app_name" android:name="myappApplication" android:icon="@drawable/ic_icon_myapp" android:debuggable="true"> <activity android:label="My App" android:name=".gui.activity.LoginActivity" label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".gui.activity.CustomerDetailActivity" > <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="myapp"/> </intent-filter> </activity> <activity android:name=".gui.activity.CustomerDetailActivity"/> <activity android:name=".gui.activity.CustomerImageViewerActivity" /> <activity android:name=".gui.activity.CustomerListActivity" android:configChanges="orientation|keyboardHidden"/> <activity android:name=".gui.activity.HomeActivity" android:configChanges="orientation|keyboardHidden"/> <activity android:name=".gui.activity.AboutActivity" android:configChanges="orientation|keyboardHidden"/> <activity android:name=".gui.activity.AccountActivity" android:configChanges="orientation|keyboardHidden" /> </application> </manifest>


Cuando estaba trabajando en OAuth con Google Calendar, tuve que agregar este filtro a la actividad en la que quería recibir la devolución de llamada:

<intent-filter> <action android:name="android.intent.action.VIEW"></action> <category android:name="android.intent.category.DEFAULT"></category> <category android:name="android.intent.category.BROWSABLE"></category> <data android:scheme="yourapp" android:host="goog"></data> </intent-filter>

Cuando el navegador invocaba la yourapp://goog , volvería a mi Actividad.


Esta es una solución para mí. Gracias @DanO

<intent-filter> <data android:scheme="yourcustomname"/> <data android:host="*"/> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> </intent-filter>


La solución final fue una solución hacky para cubrir todas las bases. El correo electrónico ahora también contiene un archivo adjunto con una extensión que está registrada para abrirse con la aplicación.

El Manifiesto

<activity android:name=".gui.activity.CustomerDetailActivity" > <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="https" android:host="myapp.mycompany.com" /> </intent-filter> <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="myapp" android:host="myapp.mycompany.com" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.PICK" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:mimeType="application/myapp" /> </intent-filter> </activity>


Me encontré con esto también, pero para http estándar: URL de esquema. Gmail no parece agregar ninguna categoría al Intento. Ahora compruebo que es BROWSABLE, pero también incluyo un control para! Intent.hasCategories () y también lo paso.


Puede evitar el problema de que GMail no vincule protocolos no estándar utilizando una URL HTTP estándar con un redireccionamiento 302. Podrías configurarlo en el servidor web o servidor de aplicaciones de tu sitio web, o para la prueba rápida y sucia podrías usar un acortador de URL como http://bit.ly .


Siempre puedes intentar enviar tus correos electrónicos usando HTML y luego usar una etiqueta <a> para crear la URL. No creo que haya una manera de cambiar la forma en que Gmail o Mail analizan su texto, ya que probablemente utilicen la clase Linkify .

Otra opción sería usar el uso de http: // y luego simplemente analizar un subdominio personalizado específico que proporcionaría a los usuarios la opción de abrir en un navegador o aplicación.