关于android上传图片,视频,音频到rails后台服务器
android客户端实现图片,视频,音频采集
我在项目中主要是调用系统接口,获取图片,拍照,录像,录制音频时使用MediaRecorder进行录制。
获取相册图片
调用系统相册:
Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT); //"android.intent.action.GET_CONTENT"
galleryIntent.setType("image/*");
//查看类型 String IMAGE_UNSPECIFIED = "image/*" ;
Intent wrapperGalleryIntent = Intent.createChooser(galleryIntent, null);
startActivityForResult(wrapperGalleryIntent, REQUEST_CODE_TAKE_GALLERY);
拍照
调用系统相机拍照:
if (isHasSdcard())
{
//指定输出的文件
uploadGalleryFile = new File(file, imagePrefix + format.format(new Date()) + ".jpg");
}
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //"android.media.action.IMAGE_CAPTURE";
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(uploadGalleryFile));
startActivityForResult(cameraIntent, REQUEST_CODE_TAKE_CAMERA);
录像
调用系统相机录像:
if (isHasSdcard())
{
uploadVideoFile = new File(file, videoPrefix + format.format(new Date()) + ".3gp");
}
Intent videoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
videoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(uploadVideoFile));
startActivityForResult(videoIntent, REQUEST_CODE_TAKE_VIDEO);
录制音频
使用MediaRecorder录制音频:
private void startRecord() {
if (hasSdcard()) {
sdcardPath = new File(dir);
try {
recordPath = File.createTempFile(prefix, ".amr", sdcardPath); //三个参数分别为前缀、后缀、目录
} catch (Exception e) {
e.printStackTrace();
}
} else {
Toast.makeText(activity, "未找到存储卡,无法存储", Toast.LENGTH_SHORT).show();
return;
}
initRecorder();
try {
recorder.prepare();
recorder.start();
stateView.setText("正在录音...");
btnStartRecord.setVisibility(View.GONE);
btnStopRecord.setVisibility(View.VISIBLE);
btnPlayRecord.setVisibility(View.GONE);
} catch (Exception e) {
e.printStackTrace();
}
btnStartRecord.setClickable(false);
btnPlayRecord.setClickable(false);
btnStopRecord.setClickable(true);
}
将图片等文件上传
- 这里提供一个根据uri找到指定文件的方法
点击查看 - 使用AsyncHttpClient请求将文件上传到服务器
// /*
// * 上传文件
// */
@SuppressLint("ShowToast")
public void upload(File file, Integer type) {
RequestParams params = new RequestParams();
try {
params.put("doctor_id", UserInfo.user.getDoctor_id().toString());
params.put("suffer_id", patientInfo.getId().toString());
params.put("resource_type", type.toString());
params.put("resource_size", UsedTools.generateFileSize(file));
params.put("resource_category", category);
params.put("resource_url", file);
} catch (IOException e) {
e.printStackTrace();
}
String url = Configuration.newResourceUrl;
AsyncHttpClient client = new AsyncHttpClient();
client.post(url, params, new JsonHttpResponseHandler() {
@SuppressLint("ShowToast")
@Override
public void onSuccess(JSONObject response) {
try {
successResponse = response.get("success").toString();
} catch (JSONException e) {
e.printStackTrace();
}
if (successResponse.equals("1")) {
Toast.makeText(UploadRecord.this, "上传成功", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(UploadRecord.this, "上传失败", Toast.LENGTH_LONG).show();
}
}
@SuppressLint("ShowToast")
@Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
Toast.makeText(UploadRecord.this, "网络访问异常,请重试", Toast.LENGTH_LONG).show();
}
});
}
rails后台接收文件
使用rails开发框架,能够加快开发进度,省去很多麻烦。
利用carrierwave插件能够实现图片等文件的上传。具体方法
rails后台如何接收数据
- 首先,确保carrierwave的相关准备都完成,特别注意要在model中加入一下代码:
mount_uploader :doctor_url, DoctorUrlUploader
- 然后,在controller中加入方法,实现图片的接收。例如更新用户头像:
#更新用户头像
def update_userPictureUrl
@user = User.find(params[:doctor_id])
@user.update_attributes(:doctor_url => params[:doctor_url])
if @user.save
doctor_url = @user.doctor_url.url
json_str = "{'doctor_url':'#{IP}#{doctor_url}'}" #返回用户头像路径
render json: json_str
else
render json: @user.errors
end
end
- 视频和音频的处理都可以通过同样的方法接收