11

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

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

  • App libre Manifiesto (código correspondiente): Código

    ... 
    <uses-permission android:name="com.company.license.PERMISSION" /> 
    ... 
    
  • aplicación gratuita para comprobar intención (código correspondiente):

    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(); 
    } 
    
  • la aplicación de pago Manifiesto (código correspondiente):

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

Respuesta

11

Coloque el mismo elemento <permission> en ambas aplicaciones. Además, como esto es específico para sus dos aplicaciones, usaría android:protectionLevel="signature" en 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 potential vulnerabilities, due to Android's "first one in wins" approach.

ACTUALIZACIÓN # 2: y esto es ahora no longer supported as of Android 5.0, como dos aplicaciones no ambos pueden tener el mismo elemento <permission> a menos que estén firmados por la misma clave de firma.

+1

Eso lo hizo el truco. ¡Gracias! –

+4

Problema: si la primera aplicación instalada especifica y con el mismo permiso, no se informa al usuario de la solicitud de permiso en el momento de la instalación. Después de que se instala la segunda aplicación, la primera puede acceder a los componentes de la segunda aplicación que requieren ese permiso. ¿Problema de seguridad mayor? –

+0

@MarkCarter: Definitivamente, no se le solicitarán permisos de "firma" al usuario. Sin embargo, eso realmente no depende del orden de instalación; 'signature'-level permisos nunca aparecen. Como los permisos de nivel de "firma" son para código escrito por un desarrollador (o equipo), se supone que estos permisos controlan lo que equivale a agregar comunicaciones internas, y no es necesario que el usuario se moleste. Sin embargo, si está viendo su comportamiento descrito con permisos 'normales' o 'peligrosos', eso me sorprendería, y tendría que investigar más. – CommonsWare

2

Pude solucionar el problema @CommonsWare mencionado en su Actualización # 2. Simplemente por solo se declara 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 debe 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.

Como la aplicación B parece ser el servicio (inicio de sesión), declare el permiso personalizado en la aplicación B. B tiene un servicio (intencionado) que otras aplicaciones pueden usar, siempre y cuando usen el permiso y estén en nuestra lista blanca. Entonces, la aplicación B tenía el servicio y el permiso declarados.

Pero debido a que la aplicación A se instala antes de la aplicación BI discovery, 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 sospecha es que esto se debe a el material de permiso se hace en la instalación. Y dado que 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 encontré sus cambios de permiso únicos.Así que probé algunos flujos y declaraciones de permisos y obtuve una solución funcional: ¡Declare el permiso personalizado en la aplicación que se instala primero! Por supuesto, esto solo funciona cuando sabes 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 :)

Cuestiones relacionadas