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

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

El problema surge en función del orden de instalación de la aplicación. Si la aplicación gratuita se instala en primer lugar una aplicación de pago, la aplicación gratuita no puede iniciar la intención. Devuelve la denegación de permisos. Si la aplicación de pago se instala en primer lugar, la aplicación gratuita, la aplicación gratuita puede iniciar la intención no hay problema. Reiniciar el dispositivo y / o detener la aplicación de las aplicaciones no resuelve el problema. Estoy adjuntando el código relavent. Algo me dice que estoy haciendo algo incorrecto.

  • Manifiesto de aplicación gratuita (código relevante):

    ... <uses-permission android:name="com.company.license.PERMISSION" /> ... 
  • Código de aplicación gratuito para comprobar la intención (código pertinente):

     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 la aplicación pagada (código relevante):

     <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.installer.1" ... <permission android:name="com.company.license.PERMISSION" android:icon="@drawable/icon" android:label="@string/app_name" android:protectionLevel="normal" > </permission> <application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoDisplay" > <activity android:name="com.company.license.auth" android:configChanges="keyboardHidden|orientation" android:exported="true" android:permission="com.company.license.PERMISSION" android:theme="@style/Theme.Transparent" > <intent-filter> <action android:name="com.company.license.action.AUTH_1" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name="com.company.installer.redirect" android:configChanges="keyboardHidden|orientation" android:exported="true" android:theme="@style/Theme.Transparent" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

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

ACTUALIZACIÓN : Tenga en cuenta, sin embargo, que el uso de permisos personalizados abre vulnerabilidades potenciales, debido al enfoque de "primer uno en victorias" de Android .

UPDATE # 2 : Y ahora ya no es compatible con Android 5.0 , ya que dos aplicaciones no pueden tener el mismo elemento <permission> menos que estén firmadas por la misma clave de firma.

Yo era capaz de trabajar en torno a la cuestión @ CommonsWare mencionado en su actualización # 2. Simplemente declarando el permiso en la aplicación que se instalará primero.

Explicación: Tengo la aplicación A y la aplicación B, firmada con diferentes firmas. La aplicación A necesita utilizar 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 (intención) que otras aplicaciones pueden usar, siempre y cuando usen el permiso y estén en nuestra lista blanca. Así que la aplicación B tenía el servicio y el permiso declarados.

Pero como la aplicación A está instalada antes del descubrimiento de aplicaciones BI, necesitaba agregar el permiso también 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 conjetura es que esto es porque el material de permiso es Hecho en la instalación. Y puesto que la aplicación A no declaró el permiso, en la instalación nada sucedió. Pero entonces se ha instalado la aplicación B que tiene el permiso pero la aplicación A todavía no recibe este permiso.

Pero luego probé en Android 5 y me encontré con sus cambios de permiso únicos. Así que probé algunos flujos y declaraciones de permiso y surgió con una solución de trabajo: Declare el permiso personalizado en la aplicación que se instala primero! Por supuesto, esto sólo funciona cuando se sabe qué aplicación se va a 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 era la solución 🙂

  • Cómo resolver este error VFY: no se puede resolver el método virtual
  • Cómo dar formato a longs en android para siempre mostrar dos dígitos
  • Error al entregar el resultado ResultInfo
  • Java 8 Stream API en Android N
  • Cómo implementar XMPP para enviar notificaciones push
  • Android Estática Inicialización opencv 3.0 No se puede cargar la biblioteca "opencv_java3"
  • Obtener un nombre corto de tres letras de tiempo (en contraposición a cuatro letras)?
  • Plantilla de diseño de Android
  • ¿Cómo puede mi aplicación Android comunicarse con un daemon nativo?
  • Error al ejecutar sbt install-emulator
  • Java REST cliente API para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.