当前位置: 首页 > 知识库问答 >
问题:

如何用Android拍摄一张照片并发送到HTTP POST请求?

卢志行
2023-03-14

任何对此的帮助都将不胜感激。谢了!

共有1个答案

丰誉
2023-03-14

这个链接对于点击、保存和获取图像的路径应该足够了: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);
 类似资料:
  • 可使用前端相机或背面相机拍摄照片。 A ) (显示模式) 轻触图标可切换为显示模式。 B ) (位置数据)/(切换相机)/(切换图像大小) 启用位置数据的使用设定即可显示(位置数据)。轻触图标可使用Wi-Fi、GPS*、手机基地台*的信息取得位置数据。取得后会显示(已取得位置数据),拍摄照片时会同时记录位置数据。 * 仅限3G/Wi-Fi机种 C ) (快门) 轻触图标可拍摄照片。 D ) 已拍摄

  • 问题内容: 我需要在活动中获得并显示照片库中最近拍摄的3张照片,而无需任何点击。 完成此步骤后,滚动时,我应该以3 x 3的方式拍摄其他照片。 您知道快速执行此操作的正确方法吗?谢谢。 问题答案: 这是使用适用于iOS 8+设备的框架的解决方案:

  • 我需要捕捉多张照片使用Camera2 API后,特定的间隔,如5秒。我需要在没有预演的情况下做。我可以捕获一张单张照片没有预览,但我需要知道如何捕获多张照片?一旦相机打开,我不想一次又一次地设置所有的参数,我只想在特定的间隔后捕捉照片,一旦所有的照片都捕捉到了,然后我会关闭相机。 也只是第一次被捕获的图像。第二次调用takepciture()方法时,什么也没有发生。 下面是我的代码。

  • 我试图在没有预览的情况下配置相机兼容性,但在拍摄第二张照片后,应用程序异常崩溃: 2018-12-27 14:36:20.392 123 89-12977/com.example.android.braillefeedere/requestThread-0:捕获调用期间收到设备异常:java.io.ioException:setPreviewTexture在Android.hardware.cam

  • 问题内容: 我想在我的应用中以真实的黑白照片。我也在该网站上搜索了解决方案,但是我总是找到将照片放成灰度的解决方案(例如在本主题中),但这不是我想要的… 我还发现了一个提出这一建议的主题: 但是图像质量太差了… 请问有人有主意吗? 谢谢 问题答案: 如果您希望图像为1位黑白,则可以使用简单的(慢速)阈值算法 但是,根据看起来不太好的东西,要获得更好的结果,您需要使用抖动算法,请参阅算法概述 -这是

  • 我一直在开发一个摄像头应用程序,所有的工作都是拍摄和保存照片。但我希望在拍摄照片时显示的Imageview能够保存在实际拍摄的照片中。可能吗? 现在,我一直试图让图像视图与我绘制相机预览的布局相同。 我想,也许如果它画在与相机相同的视图上,那么它也会看到图像和照片。 有没有人知道这是否可能,或者我必须采取另一种方法?如果是这样,链接到其他解决方案如何做到这一点将不胜感激:) 谢谢 编辑:我一直遵循

  • 在我从相机中拍摄了照片之后,在onActivityResult(int requestCode,int resultCode,Intent data)方法中调用。在本例中,我得到了一个NPE,因为数据是空的。 编辑

  • 使用 Lightroom 的应用内相机在支持的设备上拍摄 DNG 和 HDR 照片,并在“专业”模式下调整快门速度、对焦和闪光灯等设置。 注意:基于 Android 的平板设备无法使用拍摄模块。 快速访问应用内相机 您可以使用以下任一方法启动应用内相机: 应用程序快捷键 “相机”Widget 应用程序快捷键 注意: 从 Lightroom for mobile (Android) 3.2 版开始,