Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中使用URI获取文件大小_Android_File_Video_Uri - Fatal编程技术网

在android中使用URI获取文件大小

在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

我正在开发android视频应用程序,我正在使用摄像头录制视频,并从gallery拍摄视频。录制视频或从gallery中选择视频后,我想知道我拍摄的视频的大小。如果选择的视频大小大于5MB,我想用逻辑向用户显示一条toast消息。 我做了一个底层逻辑,这个逻辑不起作用,在我试图从URI获取大小的地方给了我0值

提前谢谢

我的逻辑不起作用

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
  • 如果未找到,则在
    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
        }
    }