El permiso personalizado de Android falla según el orden de instalación de la aplicación

Tener problemas con mis aplicaciones en Google Play. Tengo una aplicación gratuita que utiliza un permiso personalizado. Este permiso permite el acceso a aplicaciones pagadas. Estas aplicaciones de pago actúan como “claves” y funciones de deslocking en la aplicación gratuita. Básicamente, la aplicación gratuita intentará iniciar la intención de una de las aplicaciones de pago. La aplicación paga hará algunas cosas y regresará diciendo si la aplicación gratuita debería desbloquear funciones o no.

El problema surge basado en el orden de instalación de la aplicación. Si primero se instala la aplicación gratuita y luego una aplicación de pago, la aplicación gratuita no puede iniciar la intención. Devuelve la denegación del permiso. Si la aplicación de pago se instala primero y luego la aplicación gratuita, la aplicación gratuita puede iniciar la intención sin ningún problema. Reiniciar el dispositivo y / o forzar la detención de las aplicaciones no resuelve el problema. Estoy adjuntando el código de recurso. Algo me dice que estoy haciendo algo incorrectamente.

  • Aplicación gratuita Manifiesto (código relevante):

    ...  ... 
  • Código de aplicación gratis para verificar la intención (código relevante):

     Intent KeyApp = new Intent("com.company.license.action.AUTH_1"); KeyApp.putExtra("com.company.license.challenge", 1); //If free app is installed first, an exception is thrown for not having the proper permission. If paid app is installed first, no exception is thrown try { startActivityForResult(KeyApp, COMMING_FROM_KEYAPP); } catch (Exception e) { cancelStartUp(); } 
  • Manifiesto de aplicación pagada (código relevante):

     <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.installer.1" ...                  

Coloque el mismo elemento en ambas aplicaciones. Además, dado que esto es específico para sus dos aplicaciones, usaría android:protectionLevel="signature" lugar de normal – esto significa que el usuario nunca tendrá que aprobar el permiso y nadie más podrá solicitarlo. Y, esta receta permitirá la instalación en cualquier orden.

ACTUALIZACIÓN : tenga en cuenta, sin embargo, que el uso de permisos personalizados abre posibles vulnerabilidades, debido al enfoque de “el primero en ganar” de Android .

ACTUALIZACIÓN # 2 : Y esto ya no es compatible con Android 5.0 , ya que dos aplicaciones no pueden tener el mismo elemento menos que estén firmadas por la misma clave de firma.

Pude solucionar el problema que mencionó @CommonsWare en su Actualización # 2. Simplemente declarando solo el permiso en la aplicación que se instalará primero.

Explicación: Tengo la aplicación A y la aplicación B, firmadas con diferentes firmas. La aplicación A necesita usar la aplicación B para iniciar sesión, pero la aplicación A se instala primero y se asegura de que el usuario instale la aplicación B.

Debido a que la aplicación B parece ser el servicio (inicio de sesión), declaré el permiso personalizado en la aplicación B. La aplicación B tiene un servicio (propósito) que otras aplicaciones pueden usar, siempre que utilicen el permiso y estén en nuestra lista blanca. Así que la aplicación B tenía el servicio y el permiso declarado.

Pero como la aplicación A se instaló antes del descubrimiento de BI, también necesitaba agregar el permiso a la aplicación A. De lo contrario, la aplicación A no parecía tener el permiso después de instalar la aplicación B. Mi mejor estimación es que esto se debe a que el permiso es hecho en la instalación. Y como la aplicación A no declaró el permiso, en la instalación no sucedió nada. Pero luego se instala la aplicación B, que tiene el permiso, pero la aplicación A aún no recibe este permiso.

Pero luego probé en Android 5 y me topé con sus cambios de permisos únicos. Así que probé algunos flujos y declaraciones de permisos y encontré una solución funcional: ¡Declare el permiso personalizado en la aplicación que se instala primero! Por supuesto, esto solo funciona cuando se sabe qué aplicación se instalará primero. Pero en mi caso, donde la aplicación A depende de la aplicación B y la aplicación A instala la aplicación B, esta fue la solución 🙂