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 2023年5月18日
    00
  • Java实现经典游戏2048的示例代码

    以下是“Java实现经典游戏2048的示例代码”的完整攻略: 1. 确定游戏规则和逻辑 在开始编写游戏代码之前,需要先确认游戏规则和逻辑。2048游戏的规则是:玩家通过移动方块,让相同数字的方块叠加在一起,最终得到2048方块。每次移动时,所有方块会向移动的方向靠拢,相同数字的方块叠加在一起,如果四个方向都没有可以移动的方块,则游戏结束。 2. 创建代码框架…

    Java 2023年5月19日
    00
  • Spring MVC整合Kaptcha的具体使用

    下面是Spring MVC整合Kaptcha的具体使用的攻略: 准备工作 在Spring MVC项目中使用Kaptcha,需要先导入Kaptcha的依赖。可以在maven项目的pom.xml中添加以下代码: <dependency> <groupId>com.google.code.kaptcha</groupId> &l…

    Java 2023年6月16日
    00
  • Java栈的三种实现方式(完整版)

    Java栈的三种实现方式 什么是栈 栈(Stack)是一种常见的数据结构,它的特点是后进先出(LIFO,Last In First Out),就是存入栈的元素的顺序是先后顺序,最后存入的元素最先取出。栈只允许在栈顶进行插入和删除操作。 在程序中,栈常用于实现递归、函数调用和表达式求值等相关操作。 栈的实现方式 Java语言中,栈的实现通常有以下三种方式: 继…

    Java 2023年5月18日
    00
  • 纯Java代码实现流星划过天空

    下面是纯Java代码实现流星划过天空的完整攻略。 步骤一:实现画布 首先需要使用Java的GUI库,比如Swing或JavaFX,来创建一个窗口,并在窗口上绘制流星。 使用JavaFX实现画布 import javafx.application.Application; import javafx.scene.Group; import javafx.sce…

    Java 2023年5月26日
    00
  • 详解基于Mybatis-plus多租户实现方案

    详解基于Mybatis-plus多租户实现方案 什么是多租户? 多租户(Multi-tenancy)指的是在同一套软件系统中,支持多个客户共享同一份代码,同时彼此之间又独立隔离,从而保证各个客户之间的数据互不干扰。 Mybatis-plus多租户实现方案 Mybatis-plus是Mybatis的增强工具包,其中提供了多租户的实现方案。 1. 引入依赖 首先…

    Java 2023年5月23日
    00
  • Spring MVC的web.xml配置详解

    简介 在Spring MVC应用程序中,web.xml文件是必需的配置文件之一。它包含了应用程序的基本配置信息,例如Servlet、Filter、Listener等。本文将详细介绍Spring MVC的web.xml配置,并提供两个示例说明。 配置Servlet 在Spring MVC应用程序中,我们需要配置一个Servlet来处理HTTP请求。以下是一个配…

    Java 2023年5月17日
    00
  • MyBatis的五种批量查询实例总结

    MyBatis的五种批量查询实例总结 1. 需要批量查询的场景 在实际的开发中,我们常常会遇到需要批量查询数据的场景,如查询一个部门下所有的员工信息、查询某个账户下所有的交易明细信息等等。这些场景中,我们需要查询的数据量比较大,单次查询的效率较低,因此需要采用批量查询的方式来提高查询效率。 2. MyBatis的五种批量查询实例 下面我们介绍MyBatis的…

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