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.
- Cómo burlar un objeto inyectado que no se declara en el módulo?
- Personalizar la imagen referida De Html cadena
- ¿Cómo correctamente y consistentemente se burlan de la ubicación en Android?
- ¿Por qué mi rendimiento aumenta al tocar la pantalla?
- Android: ¿Cómo cargar dinámicamente las clases de un archivo JAR?
-
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>
- Página de detalles de las aplicaciones de lanzamiento de Android
- Cómo analizar este tipo de json String con Gson?
- Sax - ExpatParser $ ParseException
- Cómo compartir un objeto entre dos subprocesos (sincronización de subprocesos)?
- Java.lang.NumberFormatException: Invalid int: ""
- Android contentprovider no devolver Phone.NUMBER
- Error de recursos en el estudio android después de la actualización: No se ha encontrado ningún recurso
- Android Java; ¿Cómo puedo analizar un archivo JSON local de carpeta de activos en un ListView
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 🙂
- Fragmento onHiddenChanged no se llama
- Error de ThreeTen-Backport en Android – ZoneRulesException: No se registraron archivos de zona horaria