Я знаю, что у этого есть ответы здесь и там, но я не мог заставить их работать. Кто-нибудь знает хорошую ссылку или учебник для этого, может быть, также может быть здесь?
Что мне нужно сделать:
1) введите кнопку, открывающую приложение камеры. Я сделал это с помощью функции startResultActivity()
2) пользователь берет фотографию и возвращается в приложение с сохраненной фотографией, предпочтительно с предварительным просмотром в ImageView. Я что-то пробовал, но не могу проверить на эмулированном устройстве.
3) нажимает кнопку «отправить», и приложение отправляет изображение в HTTP POST. С «multipart», что бы это ни было. Разработчик php не хочет, чтобы я отправлял изображение в виде строки, преобразованной из массива растровых изображений.
Любая помощь для этого будет оценена по достоинству. Благодаря !
Эта ссылка должна быть более чем достаточной для нажатия, сохранения и получения пути к изображению: Capture Images
Это класс, который я написал для загрузки изображений через 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(); } }
Использование довольно просто: вызовите этот статический метод и пройдите путь к вашему изображению, например:
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("avatar", imagePath));
и наконец:
MultipartServer.postData(url, nameValuePairs);
и не забудьте вызвать эту функцию в отдельном потоке или вы получите NetworkOnMainThreadException .. 🙂
Я бы рекомендовал не изобретать колесо и использовать OkHttp . Выполните проверку на странице « Рецепты» . Отказ от ответственности : я не участвую в проекте, но мне это нравится. Благодаря команде Square.