定义接口
@Multipart
@POST
Observable uploadFile(
@Url String url,
@Part("description") RequestBody description1,
@Part MultipartBody.Part file1,
@Part("description") RequestBody description2,
@Part MultipartBody.Part file2);
//调用系统相机
package com.xxx.www.videouploading;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import java.io.File;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button video;
private Button images;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Window window = getWindow();// 得到窗口
requestWindowFeature(Window.FEATURE_NO_TITLE);// 没有标题
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 屏幕高亮
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
video = (Button) findViewById(R.id.video);
images = (Button) findViewById(R.id.images);
video.setOnClickListener(this);
images.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.video:
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
//设置视频录制的画质
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
startActivityForResult (intent, 1);
break;
case R.id.images:
startActivity(new Intent(MainActivity.this,ImagesActivity.class));
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && requestCode == 1){
Uri uri = data.getData();
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = this.managedQuery(uri, proj, null,null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String filepath = cursor.getString(column_index);
String[] split = filepath.split("Camera/");
String s = split[1];
Log.e("tta",filepath);
Intent intent = new Intent(MainActivity.this, VideoActivity.class);
intent.putExtra("mp4",s);
startActivity(intent);
}
}
}
//上传路径
package com.xxx.www.videouploading;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import android.widget.VideoView;
import com.google.gson.Gson;
import com.xxx.www.videouploading.utils.ApiService;
import com.xxx.www.videouploading.utils.RetrofitHelper;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;
import rx.Observable;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class VideoActivity extends AppCompatActivity implements View.OnClickListener {
//生成的文件
private File vecordFile;
private Button video;
private VideoView vv;
private String latitude="39.95"; // 纬度
private String longitude="116.30"; // 经度
private File videoFile; // 视屏资源
private File coverFile; // 视屏封面
private String videoDesc = "这个视屏非常好看!"; // 视屏描述
private String uid = "13315"; // uid 废物的id
private String token = "CA0472E4E3D63DCE47F388F778CA6C17"; // 用户令牌
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video);
Intent intent = getIntent();
String mp4 = intent.getStringExtra("mp4");
initView();
File f1 = Environment.getExternalStorageDirectory();
videoFile = new File(f1+"/DCIM/Camera",mp4); // 视屏资源
File f2 = Environment.getExternalStorageDirectory();
coverFile = new File(f2,"nv.png");
}
private void initView() {
video = (Button) findViewById(R.id.video);
video.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.video:
shangchuan();
break;
}
}
private void shangchuan() {
if(!latitude.equals("")&&!longitude.equals("")){
HashMap map = new HashMap<>();
map.put("uid",uid);
map.put("videoDesc",videoDesc);
map.put("latitude",latitude);
map.put("longitude",longitude);
map.put("token",token); // ?source=android&appVersion=101
map.put("source","android");
map.put("appVersion","101");
String oldUrl ="quarter/publishVideo";
StringBuilder stringBuilder = new StringBuilder();//创建一个stringBuilder
stringBuilder.append(oldUrl);
if (oldUrl.contains("?")){
//?在最后面....2类型
if (oldUrl.indexOf("?") == oldUrl.length()-1){
}else {
//3类型...拼接上&
stringBuilder.append("&");
}
}else {
//不包含? 属于1类型,,,先拼接上?号
stringBuilder.append("?");
}
for (Map.Entry entry: map.entrySet()) {
//拼接
stringBuilder.append(entry.getKey())
.append("=")
.append(entry.getValue())
.append("&");
}
//删掉最后一个&符号
if (stringBuilder.indexOf("&") != -1){
stringBuilder.deleteCharAt(stringBuilder.lastIndexOf("&"));
}
String newUrl = stringBuilder.toString();//新的路径
// 凡是经过file上传的参数,我都需要对其进行指示,也可以理解为对他进行备注,转码
// 这这个接口中,我们发现有两个参数是通过file类型上传的,所以我们可以理解为这是一个多文件上传
// 首先是对文件视频的备注 ,
// 备注分为三个步骤 1,转为请求体 2.指定真正的参数名 与 实际名 3. 为file类型添加描述
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), videoFile);
// 2.指定真正的参数名 与 实际名
MultipartBody.Part body = MultipartBody.Part.createFormData("videoFile", videoFile.getName(), requestFile);
// 3. 为file类型添加字段描述
String descriptionString = "hello, 这是文件视屏";
RequestBody description = RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString);
// 为文件封面进行转码,备注
RequestBody requestFile1 = RequestBody.create(MediaType.parse("multipart/form-data"), coverFile);
// MultipartBody.Part is used to send also the actual file name
MultipartBody.Part body1 = MultipartBody.Part.createFormData("coverFile", coverFile.getName(), requestFile1);
// 添加描述
String descriptionString1 = "hello, 这是文件封面";
RequestBody description1 = RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString1);
Log.e("ta",newUrl);
RetrofitHelper.getApiService("https://www.zhaoapi.cn/").uploadFile(newUrl, description, body, description1, body1)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer(){
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Gson gson = new Gson();
ShangChuanBean shangChuanBean = gson.fromJson(s, ShangChuanBean.class);
Toast.makeText(VideoActivity.this, shangChuanBean.getMsg(), Toast.LENGTH_LONG).show();
}
});
}
}
}