studio programacion para móviles libro edición desarrollo curso cuenta conectadas aplicaciones android android-contentprovider google-photos

android - programacion - ¿Está utilizando datos de proveedores de contexto o solicitando permiso de lectura de Google Photos?



manual de programacion android pdf (6)

Mi aplicación permite a los usuarios importar sus fotos y videos desde otras aplicaciones. Ahora que Google reemplazó las fotos de Google+ con Google Photos, un par de cosas se rompieron para mí. Una de estas cosas es reutilizar archivos importados después de reiniciar la aplicación. Tengo la sensación de que han ajustado los permisos otorgados cuando Google Photos devuelve la intención con el URI de la imagen, por lo que después de que se elimine la aplicación, ya no tendrá permiso para acceder al archivo cargado. Estoy recibiendo la expectativa de seguridad:

java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.contentprovider.MediaContentProvider from ProcessRecord{2c17ab9e 2124:com.myapp.myapp/u0a436} (pid=2124, uid=10436) that is not exported from uid 10427

EDITAR:

También tengo el mismo problema con la reutilización de los archivos provistos por com.google.android.apps.docs.sync.filemanager.FileProvider

¿Alguna sugerencia / solución? Sé que puedo leer el archivo antes de perder el permiso, así que en teoría podría copiarlo, pero no puedo decir que me guste mucho ...


  1. Puede reproducir este Registro de excepción de seguridad cuando utiliza la aplicación "Google Photo".

  2. La causa principal de este problema es que "Google Photo" comparte ContentUri con una cadena fija como "contenido: //com.google.android.apps.photos.contentprovider/1/1" y lo conecta con valores temporales estáticos. "Google Photo" no proporciona la ruta del archivo cuando la Actividad real o el Contexto que recibe Intent.ACTION_SEND. Tal vez, es la política de "Google Photo", no exponer el archivo de imagen privada a otra aplicación.

  3. Por ejemplo, define 2 Actividad en el archivo Manifiesto, Actividad A y Actividad B. La Actividad A para recibe el Intent.ACTION_SEND. Actividad B para procesar el archivo de imagen. La actividad A reenvía la intención a la actividad B. Luego, la actividad B no es la actividad correcta para "Google Photo", usted encuentra la excepción SecurityException.

Por lo tanto, le recomiendo que guarde el archivo temporalmente en la Actividad A y use la ruta del archivo temporal en la Actividad B


Debe establecer permisos explícitos para que todos los paquetes coincidan con su intención. Ocurre en Android 4.4 por lo general.

Puedes usar esta utilidad para hacer eso:

List<ResolveInfo> resInfoList = getContext().getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); for (ResolveInfo resolveInfo : resInfoList) { String packageName = resolveInfo.activityInfo.packageName; getContext().grantUriPermission(packageName, imageFileUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); }


Parece que this pregunta es simular

Creo que cuando muere la actividad (no el fragmento): todo el URI recuperado se invalida

También tengo el mismo problema: intentar cargar una imagen en segundo plano. Pero el usuario en el hilo de la interfaz de usuario puede cambiar la actividad y el URI se vuelve inválido


Sí, esto es por diseño, como se describe en el sitio de Android Developer .

Por razones de seguridad, los permisos son temporales, por lo que una vez que se termina la pila de tareas de la aplicación cliente, el archivo ya no es accesible. Debe obtener los datos del archivo cuando reciba la respuesta del intento, en el método onActivityResult. Almacene una copia de los datos del archivo, porque el archivo ya no estará disponible cuando onActivityResult regrese.



quizás pueda intentar agregar este permiso de usuario en su archivo de manifiesto.

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />