php - studio - ¿Cómo tomar una foto y enviarla a HTTP POST request con Android?
subir audio a servidor android studio (1)
Este enlace debería ser más que suficiente para hacer clic, guardar y obtener la ruta de una imagen: Capturar imágenes
Esta es la clase que escribí para subir imágenes a través de HTTP POST:
public class MultipartServer {
private static final String TAG = "MultipartServer";
private static String crlf = "/r/n";
private static String twoHyphens = "--";
private static String boundary = "*****";
private static String avatarPath = null;
public static String postData(URL url, List<NameValuePair> nameValuePairs) throws IOException {
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setReadTimeout(10000);
connection.setConnectTimeout(15000);
connection.setRequestMethod("POST");
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Cache-Control", "no-cache");
connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
String avatarName = null;
StringBuilder query = new StringBuilder();
boolean first = true;
for (NameValuePair pair : nameValuePairs) {
if (first)
first = false;
else
query.append("&");
query.append(URLEncoder.encode(pair.getName(), "UTF-8"));
query.append("=");
query.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
if ((avatarName = pair.getName()).equals("avatar")) {
avatarPath = pair.getValue();
}
}
FileInputStream inputStream;
OutputStream outputStream = connection.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeBytes(query.toString());
// Write Avatar (if any)
if(avatarName != null && avatarPath != null) {
dataOutputStream.writeBytes(twoHyphens + boundary + crlf);
dataOutputStream.writeBytes("Content-Disposition: form-data; name=/"" + avatarName + "/";filename=/"" + new File(avatarPath).getName() + "/";" + crlf);
dataOutputStream.writeBytes(crlf);
/*Bitmap avatar = BitmapFactory.decodeFile(avatarPath);
avatar.compress(CompressFormat.JPEG, 75, outputStream);
outputStream.flush();*/
inputStream = new FileInputStream(avatarPath);
byte[] data = new byte[1024];
int read;
while((read = inputStream.read(data)) != -1)
dataOutputStream.write(data, 0, read);
inputStream.close();
dataOutputStream.writeBytes(crlf);
dataOutputStream.writeBytes(twoHyphens + boundary + twoHyphens + crlf);
}
dataOutputStream.flush();
dataOutputStream.close();
String responseMessage = connection.getResponseMessage();
Log.d(TAG, responseMessage);
InputStream in = connection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
StringBuilder response = new StringBuilder();
char []b = new char[512];
int read;
while((read = bufferedReader.read(b))!=-1) {
response.append(b, 0, read);
}
connection.disconnect();
Log.d(TAG, response.toString());
return response.toString();
}
}
El uso es bastante simple: llama a este método estático y pasa la ruta de tu imagen como:
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("avatar", imagePath));
y finalmente:
MultipartServer.postData(url, nameValuePairs);
y no te olvides de llamar a esta función en un hilo separado o obtendrás NetworkOnMainThreadException .. :)
Actualizar
Recomiendo no reinventar la rueda y usar OkHttp en su lugar. Haga la compra de la página Recetas . Descargo de responsabilidad : no soy colaborador del proyecto, pero me encanta. Gracias al equipo de Square.
Sé que esto tiene respuestas aquí y allá, pero no pude hacer que ninguna de ellas funcionara. ¿Alguien sabe una buena referencia, o un tutorial para esto, tal vez también publicar aquí?
Lo que necesito hacer es:
1) proporciona un botón que abre la aplicación de la cámara. Lo he hecho por una startResultActivity()
2) el usuario toma la foto y regresa a la aplicación, con la foto guardada, preferiblemente con una vista previa en un ImageView. Intenté algo, pero no puedo probar en un dispositivo emulado.
3) presiona un botón "enviar" y la aplicación envía la imagen a HTTP POST. Con "multiparte", sea lo que sea eso. El desarrollador de PHP no quiere que envíe la imagen como una cadena convertida de una matriz de mapa de bits.
Cualquier ayuda para esto será apreciada. Gracias !