Puede usar esta biblioteca liviana para implementar la función de archivo adjunto (tomar fotos con la cámara, recopilar archivos/imágenes de la galería o sistema de archivos o Google Drive). La biblioteca lo ayuda a simplificar todos los procesos relacionados con la recuperación de archivos sin preocuparse por los permisos del sistema
Ayuda de idioma
¡Advertencia!
-
Esta biblioteca está compilada usando AndroidXEntonces, te recomiendo que migres tu proyecto a AndroidX de lo contrario, podría causar problemas al usar tanto androidx como las bibliotecas de soporte juntas.
-
Puede encontrar un error
Invoke-customs are only supported starting with android 0 --min-api 26
Para solucionar esto, agregue las siguientes líneas en el nivel de la aplicación construir.gradle Archivo.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
- Agregar permisos y proveedores en AndroidManifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.attachmentmanager"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider"
tools:replace="android:resource" />
</provider>
- Crear proveedor_archivo.xml en ris/xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="myApp"
path="Download/" />
<external-files-path
name="images"
path="Pictures" />
</paths>
- Si tiene como objetivo Android 11+, debe agregar las siguientes consultas en AndroidManifest.xml
<queries>
<intent>
<action android:name="android.intent.action.OPEN_DOCUMENT" />
<!-- If you don't know the MIME type in advance, set "mimeType" to "*/*". -->
<data android:mimeType="*/*" />
</intent>
<intent>
<action android:name="android.intent.action.PICK" />
<!-- If you don't know the MIME type in advance, set "mimeType" to "*/*". -->
<data android:mimeType="*/*" />
</intent>
</queries>
- Actualizar el nivel del proyecto construir.gradle Archivo.
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" } //Make sure to add this in your project
}
}
implementation 'com.github.Zaid-Mirza:AttachmentManager:2.0.1'
- Inicie el objeto AttachmentManager usando la plantilla del constructor
kotlin
private var attachmentManager: AttachmentManager? = null
var gallery = arrayOf("image/png",
"image/jpg",
"image/jpeg")
var files = arrayOf("application/msword",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document", // .ppt & .pptx
"application/pdf")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
attachmentManager = AttachmentManager.AttachmentBuilder(this) // must pass Context
.fragment(null) // pass fragment reference if you are in fragment
.setUiTitle("Choose File") // title of dialog or bottom sheet
.allowMultiple(false) // set true if you want make multiple selection, default is false
.asBottomSheet(true) // set true if you need to show selection as bottom sheet, default is as Dialog
.setOptionsTextColor(android.R.color.holo_green_light) // change text color
.setImagesColor(R.color.colorAccent) // change icon color
.hide(HideOption.DOCUMENT) // You can hide any option do you want
.setMaxPhotoSize(200000) // Set max photo size in bytes
.galleryMimeTypes(gallery) // mime types for gallery
.filesMimeTypes(files) // mime types for files
.build(); // Hide any of the three options
}
Java
private AttachmentManager attachmentManager = null;
String[] gallery = {"image/png",
"image/jpg",
"image/jpeg"};
String[] files = { "application/msword",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document", // .ppt & .pptx
"application/pdf"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
attachmentManager = new AttachmentManager.AttachmentBuilder(this) // must pass Context
.fragment(null) // pass fragment reference if you are in fragment
.setUiTitle("Choose File") // title of dialog or bottom sheet
.allowMultiple(false) // set true if you want make multiple selection, default is false
.asBottomSheet(true) // set true if you need to show selection as bottom sheet, default is as Dialog
.setOptionsTextColor(android.R.color.holo_green_light) // change text color
.setImagesColor(R.color.colorAccent) // change icon color
.hide(HideOption.DOCUMENT) // You can hide any option do you want
.setMaxPhotoSize(200000) // Set max photo size in bytes
.galleryMimeTypes(gallery) // mime types for gallery
.filesMimeTypes(files) // mime types for files
.build(); // Hide any of the three options
}
- Declara registerForActivityResult
kotlin
private var mLauncher = registerForActivityResult(StartActivityForResult()) { result ->
val list = attachmentManager?.manipulateAttachments(this,result.resultCode,result.data)
Toast.makeText(this, list?.size.toString(), Toast.LENGTH_LONG).show()
}
Java
ActivityResultLauncher<Intent> mLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
ArrayList<AttachmentDetail> list = attachmentManager.manipulateAttachments(this,result.getResultCode(),result.getData());
});
- Llamar selección abierta () método para mostrar la interfaz de usuario seleccionada y pasar ActivityResultLauncher
kotlin
attachmentManager?.openSelection(mLauncher)
Java
attachmentManager.openSelection(mLauncher);
- Sobrescribir aRequestPermissionsResult (opcional)
kotlin
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
attachmentManager?.handlePermissionResponse(requestCode, permissions, grantResults)
}
Java
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
attachmentManager.handlePermissionResponse(requestCode,permissions,grantResults);
}
Otro uso
- Puede abrir la galería, la cámara o el sistema de archivos directamente sin mostrar la IU de selección al usuario
kotlin
attachmentManager?.startCamera(mLauncher)
// OR
attachmentManager?.openGallery(mLauncher)
// OR
attachmentManager?.openFilSystem(mLauncher)
Java
attachmentManager.startCamera(mLauncher);
// OR
attachmentManager.openGallery(mLauncher);
// OR
attachmentManager.openFilSystem(mLauncher);
Nota
Cualquier tipo de mejora y sugerencias son bienvenidas. Además, si está utilizando esta biblioteca en su proyecto, proporcione la URL de la aplicación. Voy a enumerar su aplicación aquí.