Aprovechar las API nativas de Android para compartir funciones (2)
En el artículo anterior, presentamos el proceso de implementación del uso de la API nativa de Android para implementar funciones compartidas, pero todavía quedan muchos obstáculos que enfrentar en el proceso de implementación específico. Esta publicación de blog proporcionará una biblioteca Share2 empaquetada para su referencia.
Dirección del proyecto GitHub: Share2
Si has leído el artículo anterior, debes conocer los tres pasos principales para llamar a la función de compartir integrada de Android:
Acerca de Consulte el artículo anterior para obtener más detalles, por lo que no entraré en detalles aquí.
Una vez que comprenda el proceso de implementación general, podrá implementar la función resolviendo las siguientes preguntas.
En realidad, esto determina directamente la forma de implementación final. Conocemos los escenarios de uso comunes, que son solo compartir imágenes y algunos archivos entre aplicaciones. Es decir, para aquellos productos que solo comparten texto, los dos son los problemas. a considerar para cada implementación son completamente diferentes.
Por lo tanto, para resolver este problema, podemos predefinir los tipos de contenido admitidos y realizar diferentes procesamientos para diferentes tipos.
En Share2, hemos definido 5 tipos de contenido compartido en ****, que básicamente cubren escenarios de uso comunes. Puede especificar directamente el tipo de contenido al invocar la interfaz para compartir, como texto, imágenes, audio, video y varios otros tipos de archivos.
Puede haber diferentes fuentes para diferentes categorías de contenido. Por ejemplo, el texto podría ser simplemente un objeto de cadena, mientras que cuando compartimos una imagen u otro archivo, necesitamos un Uri para identificar el recurso. Esto plantea un gran problema de implementación, que es cómo hacer que se comparta el Uri del archivo y cómo permitir que la aplicación que recibe el contenido compartido maneje ese Uri.
Entonces, ¿cómo se obtiene el Uri del archivo que desea compartir y cómo se maneja ese Uri para que el destinatario pueda obtener el archivo basándose en el Uri?
Dividimos las fuentes del Uri del archivo en los siguientes tres tipos:
Escenarios de aplicación comunes: obtenga el Uri del archivo desde el selector de archivos
A través de esto El sistema ContentProvider devuelve el Uri obtenido por el método, que es una característica más común en las versiones de Android anteriores y posteriores a la 4.4, pero no era común en las versiones anteriores. Las versiones anteriores y posteriores a Android 4.4 son muy diferentes y analizaremos cómo solucionarlo más adelante. Discutiremos cómo manejar esto más adelante. Recordar el Uri que nos devuelve el sistema.
Por ejemplo, si llama a la cámara del sistema para tomar una foto o grabar audio o video y desea generar el archivo de destino pasando el Uri, entonces, a partir de 7.0, necesitamos usar un FileProvider. para lograr esto.
Si usa FileProvider, debe prestar atención a la diferencia entre el Uri devuelto por el sistema ContentProvider. Por ejemplo, si usamos el atributo android:authorities="com.xx.xxx. al configurar. el FileProvider en el Manifile, luego el formato Uri devuelto por el sistema se convertirá en: content://com.xx.xxx.fileProvider.... Para este tipo de Uri, lo llamamos el Uri devuelto por el FileProvider personalizado, que Más adelante discutiremos cómo lidiar con esto.
Cuando llamamos a un archivo nuevo, necesitamos pasar la ruta del archivo especificada, generalmente una ruta absoluta: /storage/emulated/0/... Para llamar a Share, necesitamos convertir este estilo en a Uri, entonces, ¿cómo convertimos la ruta del archivo en un archivo Uri? Esta pregunta también será respondida a continuación.
Mencionamos tres categorías de Uri de archivo y los métodos de procesamiento para diferentes tipos también son diferentes. De lo contrario, el primer problema que encuentra es:
Esto se debe a que el sistema devuelve The. Uri carece de permiso de acceso, por lo que debe autorizar a la aplicación a acceder temporalmente a Uri; de lo contrario, indicará una falta de permiso.
Para compartir el Uri devuelto por el sistema, podemos manejarlo de esta manera:
Cabe señalar que para el Uri devuelto por el FileProvider personalizado, incluso si configura un acceso temporal permisos para él, Uri tampoco se reconoce cuando se comparte con aplicaciones de terceros
Un escenario de aplicación típico es que si colocamos un FileProvider personalizado en el archivo, podemos usarlo como una aplicación.
Un escenario de aplicación típico es que si compartimos el Uri devuelto por un FileProvider personalizado con aplicaciones de terceros como WeChat o QQ, entonces el archivo no existirá porque no pueden reconocer el Uri.
Manejar esto es lo mismo que convertir la ruta del archivo en un Uri devuelto por el sistema, como veremos a continuación. Simplemente cambiamos el Uri devuelto por el FileProvider personalizado por un Uri devuelto por el sistema que las aplicaciones de terceros puedan reconocer.
Cuando crea un FileProvider, necesita pasar un objeto de archivo, para que pueda conocer directamente la ruta del archivo, convirtiendo así el problema en cómo obtener el Uri devuelto por el sistema desde el archivo. ruta
A continuación se explica cómo consultar el sistema según el objeto de archivo y el tipo de archivo que ingresa.
Consultaremos el ContentProvider en el sistema según el objeto de archivo y el tipo de archivo que ingresa para obtener el Uri correspondiente, que se ha ajustado para diferentes tipos de archivos en diferentes versiones del sistema.
El método forceGetFileUri se implementa mediante reflexión y se utiliza para manejar la compatibilidad de sistemas superiores a 7.0 en circunstancias especiales. No se llamará en circunstancias normales. Android 7.0 no permite usar file:// Uri para disfrutar de archivos entre diferentes aplicaciones, pero si lo reemplaza con un FileProvider, todavía no funciona. Pero si cambia al método FileProvider, todavía no funciona y podemos deshacernos de esta detección mediante la reflexión.
Al convertir la ruta del archivo a Uri, finalmente unificamos los tres escenarios de aplicación diferentes para pasar Uri al llamar al sistema compartido, y finalmente convertimos todos los escenarios de aplicación para pasar el Uri devuelto por el sistema, de modo que el tercer tercer Las aplicaciones de terceros pueden obtener correctamente el contenido compartido.
Share2 se implementa según el método anterior y se puede integrar de las siguientes maneras:
Comparte imágenes en una interfaz específica, como WeChat's Moments
GitHub proyecto: Share2
La dirección del proyecto GitHub es:
Share2
Share2 es una aplicación para compartir imágenes en una interfaz específica.