这个和上篇不同的是,拍摄视频不用自己创建文件直接存储到uri格式,再通过uri路径获取文件路径创建自己路径的文件再进行上传
上篇的顺序是先创建文件将拍摄的视频直接保存起来,文件后续直接用,自己决定文件路径的写法
事件
Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
takeVideoIntent.putExtra(MediaStore.EXTRA_DURATION_LIMIT,60);
startActivityForResult(takeVideoIntent, videoId);
拍摄好之后可以直接data获取url不用存储到File
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable @org.jetbrains.annotations.Nullable Intent data) {
if (resultCode == RESULT_OK)
if (requestCode == videoId){
assert data != null;
Uri videoUri = data.getData();
Intent intent = new Intent(getActivity(), VideoActivity.class);
intent.setData(videoUri);
intent.putExtra("rt_no",elcQtBarRtNo.getRtNo());
intent.putExtra("quote_item_no",elcQtBarRtNo.getQuoteItemNo());
startActivity(intent);
}
}
也是到下一个界面
下一个界面VideoAtivity
uri = getIntent().getData();
这么获取上一个界面的data uri就行
然后一样的文件存储
path = getFilePath(uri);
public String getFilePath(Uri uri) {
String path = "";
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
if (DocumentsContract.isDocumentUri(this, uri)) {
// 如果是document类型的 uri, 则通过document id来进行处理
String documentId = DocumentsContract.getDocumentId(uri);
if (isMediaDocument(uri)) {
// MediaProvider
// 使用':'分割
String id = documentId.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=?";
String[] selectionArgs = {id};
path = getDataColumn(this, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection, selectionArgs);
} else if (isDownloadsDocument(uri)) {
// DownloadsProvider
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.parseLong(documentId));
path = getDataColumn(this, contentUri, null, null);
}
return path;
}
if (isKitKat && DocumentsContract.isDocumentUri(this, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.parseLong(id));
return getDataColumn(this, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[] {
split[1]
};
return getDataColumn(this, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
return getDataColumn(this, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return path;
}
然后上传视频到后端
private void startUpload(boolean largeThan29){
File files;
if (largeThan29) {
files = uriToFileApiQ(uri);
} else {
files = new File(path);
}
String url = baseUrl + "/elcqrbarrtno/upload?quote_item_no=" + quote_item_no
+ "&rt_no=" + rt_no;
SharedPreferences userInfo = getSharedPreferences("userInfo",MODE_PRIVATE);
String token = userInfo.getString("token","");
//这里的进度条是不动的,能上传,但是是不能动,后面那篇文章才是能动的进度条
MaterialDialog.Builder builder = new MaterialDialog.Builder(this)
.title("上传视频")
.content("上传中···")
.contentGravity(GravityEnum.CENTER)
.progress(false,100)
.cancelable(false);
builder.show();
RxHttp.postForm(url) //发送Form表单形式的Post请求
.addFile("li", files)
.addHeader("Authorization","Bearer "+token)
.upload(AndroidSchedulers.mainThread(), progress -> {
//上传进度回调,0-100,仅在进度有更新时才会回调
builder.showListener(dialog -> updateProgress((MaterialDialog)dialog));
}) //指定回调(进度/成功/失败)线程,不指定,默认在请求所在线程回调
.asString()
.timeout(720, TimeUnit.SECONDS)
.to(RxLife.to(this))
.subscribe(System.out::println, throwable -> System.out.println(throwable.getMessage()));
}
这里有文件存储了就要判断是否andorid11及以上
public File uriToFileApiQ(Uri uri) {
File file = null;
//android10以上转换
if (uri.getScheme().equals(ContentResolver.SCHEME_FILE)) {
file = new File(uri.getPath());
} else if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
//把文件复制到沙盒目录
ContentResolver contentResolver = this.getContentResolver();
Cursor cursor = contentResolver.query(uri, null, null, null, null);
if (cursor.moveToFirst()) {
String displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
try {
InputStream is = contentResolver.openInputStream(uri);
File cache = new File(this.getExternalCacheDir().getAbsolutePath(), Math.round((Math.random() + 1) * 1000) + displayName);
FileOutputStream fos = new FileOutputStream(cache);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
FileUtils.copy(is, fos);
}
file = cache;
fos.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return file;
}