Android使用okhttp拍照上传与选择照片上传功能实现
时间: 2025-02-12 10:15:36 浏览: 36
### Android 应用中使用 OkHttp 实现拍照上传和选择照片上传
#### 权限声明与配置
为了确保应用程序能够访问相机和外部存储,在`AndroidManifest.xml`文件中需声明必要的权限:
```xml
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
```
同时,对于API级别23及以上版本还需要动态申请这些权限[^1]。
#### 创建布局界面
创建一个简单的用户界面来触发拍照或选取相册中的图片。此部分不涉及具体编码细节,但通常包括两个按钮分别用于启动摄像头和打开图库挑选图像。
#### 启动相机或图库获取图片路径
当用户点击相应按钮时,可以通过Intent对象调起系统的Camera Activity 或者 Gallery Activity 获取图片资源。这里给出一段简化版的代码片段展示如何设置回调监听器以接收返回的数据:
```java
private static final int REQUEST_IMAGE_CAPTURE = 1;
private Uri imageUri;
// 打开相机
public void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {}
if (photoFile != null) {
imageUri = FileProvider.getUriForFile(this,
"com.example.android.fileprovider",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case REQUEST_IMAGE_CAPTURE:
if(resultCode == RESULT_OK && data!=null){
uploadPhoto(imageUri); // 调用上传函数
}
break;
default:
break;
}
}
```
#### 使用OkHttp进行图片上传
一旦获得了要上传的图片URI,则可利用OkHttp库来进行HTTP POST请求发送多媒体表单数据给远程服务器。下面是一个基于MultipartBody.Builder构建multipart/form-data类型的Request Body的例子:
```java
import okhttp3.*;
...
private OkHttpClient client = new OkHttpClient();
void uploadPhoto(Uri uri) throws IOException{
String url = "http://your.server.com/upload";
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", "filename.jpg",
RequestBody.create(MediaType.parse("image/jpeg"),
getContentResolver().openInputStream(uri)))
.build();
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()){
throw new IOException("Unexpected code " + response);
}
System.out.println(response.body().string());
}
```
上述代码实现了从本地获取图片并通过网络传输至指定地址的功能[^2]。
阅读全文
相关推荐


















