在android中使用URI获取文件大小
我正在开发android视频应用程序,我正在使用摄像头录制视频,并从gallery拍摄视频。录制视频或从gallery中选择视频后,我想知道我拍摄的视频的大小。如果选择的视频大小大于5MB,我想用逻辑向用户显示一条toast消息。 我做了一个底层逻辑,这个逻辑不起作用,在我试图从URI获取大小的地方给了我0值 提前谢谢 我的逻辑不起作用在android中使用URI获取文件大小,android,file,video,uri,Android,File,Video,Uri,我正在开发android视频应用程序,我正在使用摄像头录制视频,并从gallery拍摄视频。录制视频或从gallery中选择视频后,我想知道我拍摄的视频的大小。如果选择的视频大小大于5MB,我想用逻辑向用户显示一条toast消息。 我做了一个底层逻辑,这个逻辑不起作用,在我试图从URI获取大小的地方给了我0值 提前谢谢 我的逻辑不起作用 java.net.URI juri = new java.net.URI(uri.toString()); File mediaFile = n
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;
}
这是我的代码,我用它从多媒体资料中获取视频并录制视频
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);
}
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;
}
Uri
不是文件
showVideoImage(data.getData());
而且,您已经知道文件在哪里了。在takeVideoFromCamera()
中创建一个文件
对象,并将其用于额外输出
。按住该文件
对象(并将其保存在已保存的实例状态Bundle
),然后使用该文件查找生成视频的大小。尝试此操作
文件=新文件(URI)
当
该文件存在,但包含零字节。
文件不存在,或
该文件是特定于操作系统的特殊文件
private long getFileSize(Uri fileUri) {
Cursor returnCursor = getContentResolver().
query(fileUri, null, null, null, null);
int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
returnCursor.moveToFirst();
return returnCursor.getLong(sizeIndex);
}
查看更多详细信息
AssetFileDescriptor fileDescriptor = getApplicationContext().getContentResolver().openAssetFileDescriptor(uri , "r");
long fileSize = fileDescriptor.getLength();
AssetFileDescriptor.length中隐式检查ParcelFileDescriptor.getStatSize
MediaStore/ContentResolver
是否URI具有content://
scheme文件://
,内容://
方案。如果找不到以下内容,则返回-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: https://stackoverflow.com/questions/48302972/content-resolver-returns-wrong-size
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
}
}
谢谢你的回答和解释。你能在我上面的代码示例中给我一个代码片段吗。这对我真的很有帮助。@CommonWare基本上我想知道两种情况下产生的视频大小,比如takeVideoFromCamera()和takeVideoFromGallery()。Thanks@UKhan:演示如何将
操作\u视频\u捕获
与文件提供程序
一起使用。我将演示如何在字段中保留文件和Uri
。在我的例子中,我碰巧使用了onActivityResult()
中的Uri
,而您将使用文件
。您应该关闭光标以释放资源。介意解释一下代码的作用吗?
AssetFileDescriptor fileDescriptor = getApplicationContext().getContentResolver().openAssetFileDescriptor(uri , "r");
long fileSize = fileDescriptor.getLength();
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: https://stackoverflow.com/questions/48302972/content-resolver-returns-wrong-size
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
}
}