您的位置:

Android拍照上传功能详解

一、调用相机拍照

在Android中,我们可以使用Intent调用系统相机拍照。以下是一个调用拍照界面的示例代码:

// 打开系统相机
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
    // 创建一个保存照片的文件路径
    File photoFile = null;
    try {
        photoFile = createImageFile();
    } catch (IOException ex) {
        Log.e(TAG, ex.getMessage());
    }
    if (photoFile != null) {
        // 把文件路径装进 Intent
        Uri photoURI = FileProvider.getUriForFile(this,
                "com.example.android.fileprovider",
                photoFile);
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}

// 创建保存照片的文件路径
private File createImageFile() throws IOException {
    // 以当前时间生成文件名
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* 前缀 */
            ".jpg",         /* 后缀 */
            storageDir      /* 目录 */
    );

    // 保存文件路径以便之后调用相机
    mCurrentPhotoPath = image.getAbsolutePath();
    return image;
}

二、将拍摄的照片上传到服务器

在拍照完成后,我们需要将照片上传到服务器。以下是一个上传照片的示例代码:

// 使用 OkHttp 上传图片到服务器
public void uploadImage(File imageFile) throws IOException {
    RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)    // 设置为表单类型
            .addFormDataPart("file", imageFile.getName(),
                    RequestBody.create(MediaType.parse("image/*"), imageFile))
            .build();

    Request request = new Request.Builder()
            .url("https://example.com/upload_image")
            .post(requestBody)
            .build();

    OkHttpClient client = new OkHttpClient();
    Response response = client.newCall(request).execute();
    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

    Log.d(TAG, response.body().string());
}

三、显示拍摄的照片

在拍照完成并上传照片后,我们希望能够显示拍摄的照片。以下是一个显示照片的示例代码:

// 显示拍照后的图片
private void setPic() {
    // 获取 ImageView 的尺寸
    int targetW = mImageView.getWidth();
    int targetH = mImageView.getHeight();

    // 获取图片的尺寸
    BitmapFactory.Options bmOptions = new BitmapFactory.Options();
    bmOptions.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
    int photoW = bmOptions.outWidth;
    int photoH = bmOptions.outHeight;

    // 根据 ImageView 的尺寸计算缩放比例
    int scaleFactor = Math.min(photoW / targetW, photoH / targetH);

    // 解码图片文件并缩放
    bmOptions.inJustDecodeBounds = false;
    bmOptions.inSampleSize = scaleFactor;
    bmOptions.inPurgeable = true;

    Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
    mImageView.setImageBitmap(bitmap);
}

四、权限申请

在 Android 6.0 及以上版本中,需要在运行时申请拍照和文件存储的权限。以下是一个权限申请的示例代码:

// 检查权限并申请
private void checkPermissions() {
    if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.CAMERA)
            != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.CAMERA},
                REQUEST_CAMERA_PERMISSION);
    }
    if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_WRITE_STORAGE_PERMISSION);
    }
}

// 处理权限申请结果
@Override
public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == REQUEST_CAMERA_PERMISSION) {
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            takePicture();
        }
    } else if (requestCode == REQUEST_WRITE_STORAGE_PERMISSION) {
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            checkPermissions();
        }
    }
}

五、错误处理

在开发中,我们需要确保错误处理机制的健全。以下是一个上传照片时的错误处理的示例代码:

// 使用 OkHttp 上传图片到服务器
public void uploadImage(File imageFile) throws IOException {
    RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)    // 设置为表单类型
            .addFormDataPart("file", imageFile.getName(),
                    RequestBody.create(MediaType.parse("image/*"), imageFile))
            .build();

    Request request = new Request.Builder()
            .url("https://example.com/upload_image")
            .post(requestBody)
            .build();

    OkHttpClient client = new OkHttpClient();

    try (Response response = client.newCall(request).execute()) {
        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
        Log.d(TAG, response.body().string());
    } catch (ConnectException e) {
        Log.e(TAG, "Failed to connect to server.");
    } catch (IOException e) {
        Log.e(TAG, e.getMessage());
    }
}

六、总结

本文详细介绍了如何在 Android 中实现拍照上传功能,并分别从调用相机拍照、上传照片、显示照片、权限申请和错误处理等方面进行了详细阐述。通过本文,您可以掌握 Android 中拍照上传的基本实现方式,帮助您更好地开发移动应用。

Android拍照上传功能详解

2023-05-20
使用Python编写Android上传照片功能

2023-05-14
相机拍照上传java后台(相机拍照后怎么上传)

2022-11-09
Android应用调用摄像头实现照片拍摄功能

一、前言 Android应用的摄像头功能是比较基础的功能之一,实现照片的拍摄功能可以满足用户在应用中的需求,例如社交类应用需要上传用户头像,或者是在线购物类应用需要拍摄商品照片等。本文将详细介绍如何在

2023-12-08
实现定制相机界面与照片拍摄功能

2023-05-14
php把图片上传到又拍云(照片上传到云)

2022-11-12
使用uniapp拍照上传的实现

2023-05-21
阿里云笔记的功能与使用详解

2023-05-21
印象笔记记录java学习(Java成长笔记)

2022-11-12
了解Typora PicGo :实现快捷上传和管理笔记中的图

2023-05-21
php实现拍照上传,php接收图片

2022-12-02
python如何设置摄像头焦距(python控制摄像头拍照)

2022-11-11
良田高拍仪java调用,良田高拍仪sdk

2022-11-22
java客户端学习笔记(java开发笔记)

2022-11-14
java方法整理笔记(java总结)

2022-11-08
安卓摄像头权限:保证应用的拍照和录像功能顺利运行

一、安卓摄像头解析 现代移动设备都配备了摄像头,而安卓设备的摄像头在手机应用中是一个非常常见的功能。安卓设备可以有多个摄像头,包括前置和后置摄像头,这些摄像头可以用来进行拍照和录像等操作。 二、安卓摄

2023-12-08
java包笔记,Java语言包

2022-11-18
安卓拍照请求php后台接口的简单介绍

2023-01-05
java学习笔记(java初学笔记)

2022-11-14
Android源码——实现图片压缩和上传

2023-05-14