下面给出详细的“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_CAPTURE
,resultCode
为拍照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_KEY
、SECRET_KEY
和BUCKET
为自己的配置。
示例二:使用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技术站