Android拍照上传功能示例代码

下面给出详细的“Android拍照上传功能示例代码”的完整攻略,包含两条示例代码。

概述

在移动App开发中,上传图片是常见的需求之一,而且常常需要支持拍照上传功能。本篇攻略将介绍如何在Android App开发中,实现拍照上传功能。

实现步骤

步骤一:添加权限

首先在AndroidManifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

其中,CAMERA权限是拍照所必需的,WRITE_EXTERNAL_STORAGE权限是为了保存拍摄的照片。

步骤二:创建拍照Intent

在需要拍照上传的地方,例如一个上传头像的按钮,可以添加以下代码:

private static final int REQUEST_IMAGE_CAPTURE = 1;

// 按钮点击事件
public void onUploadAvatarClick(View view) {
    // 创建拍照Intent
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}

这段代码创建了一个拍照Intent,并启动该Intent,如果有可以处理该Intent的Activity则打开拍照应用。

其中,REQUEST_IMAGE_CAPTURE是一个自定义的常量,用于区分该Intent的返回值。

步骤三:保存拍照照片

当拍照完成时,Android系统会将拍摄的照片保存在默认的存储路径下。我们可以在onActivityResult()方法中接收到该照片并进行进一步处理,例如将其上传到服务器。以下是处理方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        // 获取拍摄的照片
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");

        // 保存照片(可选)
        String imageFileName = "avatar.jpg";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File imageFile = null;
        try {
            imageFile = File.createTempFile(
                    imageFileName,
                    ".jpg",
                    storageDir
            );
            FileOutputStream out = new FileOutputStream(imageFile);
            imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 将照片上传到服务器(可选)
        // TODO: 上传照片到服务器
    }
}

该方法会在拍照完成后被调用,其中requestCode即为之前定义的REQUEST_IMAGE_CAPTUREresultCode为拍照Activity返回的结果码,data为拍照Activity返回的Intent。

该方法中,我们首先从data中获取拍摄的照片,其次保存该照片到指定位置(可选),最后将照片上传到服务器(可选)。

需要注意的是,保存照片和上传照片的代码需要额外的处理,这里只提供了大致的思路。

示例代码

下面给出两个示例代码:

示例一:上传照片到七牛云存储

首先在build.gradle文件中添加以下依赖:

implementation 'com.qiniu:qiniu-android-sdk:7.3.8'

然后,在需要上传照片的地方,添加以下代码:

private static final String ACCESS_KEY = "your_access_key";
private static final String SECRET_KEY = "your_secret_key";
private static final String BUCKET = "your_bucket_name";

// 按钮点击事件
public void onUploadAvatarClick(View view) {
    // 创建拍照Intent
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        // 获取拍摄的照片
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");

        // 保存照片(可选)
        String imageFileName = "avatar.jpg";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File imageFile = null;
        try {
            imageFile = File.createTempFile(
                    imageFileName,
                    ".jpg",
                    storageDir
            );
            FileOutputStream out = new FileOutputStream(imageFile);
            imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
            out.flush();
            out.close();

            // 上传照片到七牛云存储
            Configuration config = new Configuration.Builder()
                    .zone(Zone.zone0())
                    .build();
            UploadManager uploadManager = new UploadManager(config);
            String key = UUID.randomUUID().toString() + ".jpg";
            String token = Auth.create(ACCESS_KEY, SECRET_KEY)
                    .uploadToken(BUCKET);
            uploadManager.put(
                    imageFile.getPath(),
                    key,
                    token,
                    new UpCompletionHandler() {
                        @Override
                        public void complete(String key, ResponseInfo info, JSONObject response) {
                            if (info.isOK()) {
                                // 上传成功
                            } else {
                                // 上传失败
                            }
                        }
                    },
                    null
            );

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

该示例利用了七牛云存储提供的SDK将照片上传到云端存储。

需要注意的是,需要在代码中替换ACCESS_KEYSECRET_KEYBUCKET为自己的配置。

示例二:使用OkHttp上传照片到服务器

首先在build.gradle文件中添加以下依赖:

implementation 'com.squareup.okhttp3:okhttp:4.4.0'

然后,在需要上传照片的地方,添加以下代码:

// 按钮点击事件
public void onUploadAvatarClick(View view) {
    // 创建拍照Intent
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        // 获取拍摄的照片
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");

        // 保存照片(可选)
        String imageFileName = "avatar.jpg";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File imageFile = null;
        try {
            imageFile = File.createTempFile(
                    imageFileName,
                    ".jpg",
                    storageDir
            );
            FileOutputStream out = new FileOutputStream(imageFile);
            imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
            out.flush();
            out.close();

            // 上传照片到服务器
            OkHttpClient client = new OkHttpClient();
            RequestBody requestBody = new MultipartBody.Builder()
                    .setType(MultipartBody.FORM)
                    .addFormDataPart("file", imageFile.getName(),
                            RequestBody.create(MediaType.parse("image/jpeg"), imageFile))
                    .build();
            Request request = new Request.Builder()
                    .url("http://myserver.com/upload")
                    .post(requestBody)
                    .build();
            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    // 上传失败
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    // 上传成功
                }
            });

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

该示例使用了OkHttp库将照片以multipart/form-data格式上传到服务器。

需要注意的是,需要在代码中替换上传地址为自己的服务器地址。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android拍照上传功能示例代码 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java编程小白进阶包的作用详解

    Java编程小白进阶包的作用详解 简介 Java编程小白进阶包是一个帮助Java初学者进阶的工具包,它包括了大量实用的工具类和基础知识的讲解,可以快速提升初学者的编程水平。 功能 Java编程小白进阶包的主要功能包括: 1. 工具类 Java编程小白进阶包提供了很多实用的工具类,例如字符串处理、日期时间处理、集合操作等等。这些工具类都经过了精心设计和优化,可…

    Java 2023年5月23日
    00
  • 20基于java的科研管理系统设计与实现

    背景及意义 目前许多人仍将传统的纸质工具作为信息管理的主要工具,而网络技术的应用只是起到辅助作用。在对网络工具的认知程度上,较为传统的office软件等仍是人们使用的主要工具,而相对全面且专业的信息管理软件仍没有得到大多数人的了解或认可。本选题则旨在通过标签分类管理等方式,实现教研的各种功能,从而达到对科研管理系统的管理。 科研项目管理系统,以项目化管理为思…

    Java 2023年5月4日
    00
  • 如何基于JWT实现接口的授权访问详解

    基于JWT实现接口的授权访问详解攻略如下。 JWT简介 JWT (JSON Web Token) 是一种用于进行身份认证的开放标准(RFC 7519)。JWT由三部分组成:Header、Payload 和 Signature。其中,Payload 用于存储要传递的信息,可以包括用户 ID、角色等信息。Header 使用 Base64 编码存储,表示使用的算法…

    Java 2023年5月20日
    00
  • java开发SSM框架具有rest风格的SpringMVC

    Java开发SSM框架具有REST风格的SpringMVC 在 Java 开发中,SSM 框架是一种常用的 Web 开发框架,它由 Spring、SpringMVC 和 MyBatis 三个框架组成。其中,SpringMVC 是用于处理 Web 请求的框架,支持 REST 风格的 Web 服务。本文将详细讲解如何在 SSM 框架中使用 SpringMVC 实…

    Java 2023年5月18日
    00
  • java时间段查询将00:00:00更换成23:59:59

    针对Java时间段查询将00:00:00更换成23:59:59的问题,我可以提供以下攻略: 方法一:使用时间处理类 在Java中,可以使用Java提供的时间处理类来实现将时间段的起始时间和结束时间从00:00:00和23:59:59的时间戳互相转换,具体实现步骤如下: 首先,定义起始时间和结束时间的字符串,如下所示: String startTimeStr …

    Java 2023年5月20日
    00
  • java对象拷贝详解及实例

    首先我们需要明确一下,Java中的对象拷贝指的是拷贝一个对象的副本,而不是两个对象共享同一块内存地址。在Java中,我们可以使用浅拷贝和深拷贝两种方式来实现对象的拷贝。 浅拷贝 浅拷贝最简单的方式就是使用Object类的clone()方法,该方法可以复制一个Java对象。但是,它并不是完全的复制。当我们使用clone()方法来复制一个Java对象时,它会返回…

    Java 2023年5月26日
    00
  • Spring循环引用失败问题源码解析

    下面就为大家详细讲解一下“Spring循环引用失败问题源码解析”的完整攻略。 1. 问题背景 在Spring中,设置成员变量注入时,会遇到“循环引用”的问题。即,在两个类中,它们互相持有对方对象时,Spring容器初始化时会出现错误。 2. 循环引用失败原理 导致循环引用的根本原因,是Java中对象的创建流程涉及到对象的实例化和初始化。在一个Java对象实例…

    Java 2023年5月19日
    00
  • 建议你使用LocalDateTime而不是Date哦

    当你需要在Java应用程序中使用日期和时间时,Java提供了两个主要的类:Date和LocalDateTime。但是,在开发中,建议使用LocalDateTime而不是Date,因为LocalDateTime提供了更好的灵活性和可读性。 为什么建议使用LocalDateTime? Date类在Java中存在了很长时间,不过它存在一些问题,包括: Date类的…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部