在 Android 应用中上传头像的基本流程如下:
1. 获取头像图片
你可以让用户从相册选择图片或使用相机拍照:
- 从相册选择
```java
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);
```
- 拍照
```java
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CODE_TAKE_PHOTO);
```
2. 处理返回的图片
在 `onActivityResult` 处理用户选择的图片:
```java
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
Uri imageUri = data.getData();
if (requestCode == REQUEST_CODE_PICK_IMAGE) {
uploadImage(imageUri);
} else if (requestCode == REQUEST_CODE_TAKE_PHOTO) {
uploadImage(imageUri);
}
}
}
```
3. 上传图片到服务器
使用 `OkHttp` 或 `Retrofit` 进行文件上传:
```java
public void uploadImage(Uri imageUri) {
File file = new File(getRealPathFromURI(imageUri));
RequestBody requestFile = RequestBody.create(MediaType.parse("image/*"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("avatar", file.getName(), requestFile);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://your-api.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiService apiService = retrofit.create(ApiService.class);
Call
call.enqueue(new Callback
@Override
public void onResponse(Call
if (response.isSuccessful()) {
Log.d("Upload", "Success");
}
}
@Override
public void onFailure(Call
Log.e("Upload", "Failure", t);
}
});
}
```
4. API Service 接口
```java
public interface ApiService {
@Multipart
@POST("upload/avatar")
Call
}
```
5. 获取真实文件路径
```java
public String getRealPathFromURI(Uri contentUri) {
String[] proj = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
if (cursor != null) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String path = cursor.getString(columnIndex);
cursor.close();
return path;
}
return null;
}
```
这样,用户选择或拍摄头像后,就能上传到服务器了。