org.apache.http.entity.FileEntity está en desuso en Android 6 (Marshmallow)

Estoy actualizando una aplicación a API 23 donde org.apache.http está en desuso.

Mi código actual (obsoleto) se ve así:

 HttpClient httpClient = new DefaultHttpClient(); File file = new File(attr.Value); String url = server_url; HttpPost request = new HttpPost(url); FileEntity fileEntity = new FileEntity(file, "image/png"); request.setEntity(fileEntity); HttpResponse response = httpClient.execute(request); String output = getContent(response.getEntity().getContent()); 

He encontrado algunas sugerencias sobre cómo se debe hacer esto usando HttpURLConnection , pero todas son mucho más complejas que la solución actual (que ya no se puede usar). Estoy hablando de muchas líneas de código para ejecutar la misma funcionalidad que la anterior.

Los ejemplos son: esta página y esta página

¿Alguien tiene una buena solución sólida más corta para eso?

Si cambia su compileSdkVersion a 21, su aplicación comstackrá limpiamente. Una vez dicho esto, hay razones por las cuales Google está retrocediendo en la implementación HttpClient incorporada, por lo que probablemente debería buscar otra biblioteca. Esa “alguna otra biblioteca” podría ser:

  • el clásico Java HttpUrlConnection , aunque como has encontrado, su API deja algo que desear
  • Paquete independiente de HttpClient para Android de Apache
  • OkHttp (mi recomendación)
  • AndroidAsync

En particular, OkHttp parece tener una API bastante buena para publicar un archivo y publicar un formulario de varias partes , que debería ser similar a lo que está haciendo su código HttpClient.

El puerto Apache HttpClient 4.3 para Android estaba destinado a remediar la situación proporcionando versiones oficiales compatibles con Google Android.

Dado que a partir de Android API 23 se ha eliminado el fork de Google de HttpClient, este proyecto ha sido descontinuado.

Se recomienda a los usuarios que deseen continuar utilizando Apache HttpClient en Android que consideren

Apache HttpClient 4.3 puerto para Android cuando se dirige a Android API 22 y anterior

 dependencies { compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1' } 

Paquetes de Apache HttpClient para Android mantenidos por Marek Sebera al apuntar a Android API 23 y versiones posteriores

 dependencies { compile group: 'cz.msebera.android' , name: 'httpclient', version: '4.4.1.1' } 

tomado de Apache Sitio web oficial : Apache HttpClient para Android

NOTA: No es necesario utilizar la useLibrary 'org.apache.http.legacy' , que se introdujo para los proyectos que no migraron de las clases de HttpClient proporcionadas por Android. Para una mayor explicación .

El mejor reemplazo para HTTPClient es usar Volley. Es mucho más fácil de usar, maneja las colas de solicitudes y almacena en caché las solicitudes. Es totalmente compatible con casi todos los niveles de API hasta la API 4.

Consulte la documentación de Android sobre cómo hacerlo.