Usm*_*han 5 video android uri file
我正在开发 android 视频应用程序,我正在使用 Camera Intent 录制视频并从图库中拍摄视频。录制视频时或从图库中选择视频后,我想知道我拍摄的视频的大小。如果选择的视频大小大于 5MB,我想创建一个逻辑来向用户显示吐司消息。我做了一个不工作的底层逻辑,并给了我 0 值,我试图从 URI 中获取大小。
提前致谢。
我的逻辑不起作用
java.net.URI juri = new java.net.URI(uri.toString());
File mediaFile = new File(juri.getPath());
long fileSizeInBytes = mediaFile.length();
long fileSizeInKB = fileSizeInBytes / 1024;
long fileSizeInMB = fileSizeInKB / 1024;
if (fileSizeInMB > 5) {
Toast.makeText(this,"Video files lesser than 5MB are allowed",Toast.LENGTH_LONG).show();
return;
}
Run Code Online (Sandbox Code Playgroud)
这是我用来从图库获取视频并录制视频的代码。
public void takeVideoFromCamera(){
File mediaFile =new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/myvideo.mp4");
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
Uri videoUri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// videoUri = FileProvider.getUriForFile(this, this.getApplicationContext().getPackageName() + ".provider", mediaFile);
videoUri = FileProvider.getUriForFile(this, "i.am.ce.by.ncy.provider", mediaFile);
} else {
videoUri = Uri.fromFile(mediaFile);
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, videoUri);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 5491520L);//5*1048*1048=5MB
intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT,45);
startActivityForResult(intent, VIDEO_CAPTURE);
}
public void takeVideoFromGallery(){
Intent intent = new Intent();
intent.setType("video/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
long maxVideoSize = 5 * 1024 * 1024; // 10 MB
intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, maxVideoSize);
startActivityForResult(Intent.createChooser(intent,"Select Video"),REQUEST_TAKE_GALLERY_VIDEO);
}
Run Code Online (Sandbox Code Playgroud)
onActivityResult 代码
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == this.RESULT_OK) {
switch (requestCode) {
case VIDEO_CAPTURE:
if (resultCode == RESULT_OK) {
showVideoImage(data.getData());
// Here I want to know what is the size of my Video File
}
break;
case REQUEST_TAKE_GALLERY_VIDEO:
if (resultCode == RESULT_OK) {
showVideoGallery(data);
// Here I want to know what is the size of my Video File
}
break;
}
Run Code Online (Sandbox Code Playgroud)
小智 15
AssetFileDescriptor fileDescriptor = getApplicationContext().getContentResolver().openAssetFileDescriptor(uri , "r");
long fileSize = fileDescriptor.getLength();
Run Code Online (Sandbox Code Playgroud)
AssetFileDescriptor.length
ParcelFileDescriptor.getStatSize
在内部隐式检查AssetFileDescriptor.length
MediaStore/ContentResolver
URI是否有content://
scheme应该适用于file://
,content://
计划。-1L
如果找不到则返回:
fun Uri.length(contentResolver: ContentResolver)
: Long {
val assetFileDescriptor = try {
contentResolver.openAssetFileDescriptor(this, "r")
} catch (e: FileNotFoundException) {
null
}
// uses ParcelFileDescriptor#getStatSize underneath if failed
val length = assetFileDescriptor?.use { it.length } ?: -1L
if (length != -1L) {
return length
}
// if "content://" uri scheme, try contentResolver table
if (scheme.equals(ContentResolver.SCHEME_CONTENT)) {
return contentResolver.query(this, arrayOf(OpenableColumns.SIZE), null, null, null)
?.use { cursor ->
// maybe shouldn't trust ContentResolver for size: /sf/ask/3381208071/
val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE)
if (sizeIndex == -1) {
return@use -1L
}
cursor.moveToFirst()
return try {
cursor.getLong(sizeIndex)
} catch (_: Throwable) {
-1L
}
} ?: -1L
} else {
return -1L
}
}
Run Code Online (Sandbox Code Playgroud)
java.net.URI juri = new java.net.URI(uri.toString());
File mediaFile = new File(juri.getPath());
Run Code Online (Sandbox Code Playgroud)
AUri
不是File
。
showVideoImage(data.getData());
Run Code Online (Sandbox Code Playgroud)
而且,您已经知道该文件在哪里。您在 中创建一个File
对象takeVideoFromCamera()
并将其用于EXTRA_OUTPUT
. 按住该File
对象(并将其保存在已保存的实例状态中Bundle
),然后使用它来找出生成的视频的大小。