Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why I cant't get the video duration from MediaStore?

On one of my device, the following code can't make my video appear in Gallery:

File file = new File(path);
Uri uri = Uri.fromFile(file);
Intent scanFileIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
activity.sendBroadcast(scanFileIntent);

So I use scanFile explicitly:

android.media.MediaScannerConnection.scanFile(activity, new String[]{file.getAbsolutePath()},
                new String[]{"video/" + mMimeType}, null);

When my video is xxx.mpeg4, the value of mMimeType is mp4, the result is that the video can appear in MediaStore but I can't get the duration later(the returned value is always 0). Need help on this.

public static long[] getVideoDetail(Context context, Uri uri) {
        long[] result = new long[] {DEFAULT_VIDEO_FRAME_WIDTH, DEFAULT_VIDEO_FRAME_HEIGHT, -1};
        if(uri == null || (!ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()))) {
            return result;
        }
            String[] projection = new String[] {MediaStore.Video.Media.RESOLUTION, MediaStore.Video.VideoColumns.DURATION};
            Cursor cursor = null;
            boolean success = false;
            try {
                cursor = context.getContentResolver().query(uri, projection, null, null, null);
                if (cursor.moveToFirst()) {
                    String resolution = cursor.getString(0);
                    if(!StringUtils.isEmpty(resolution)) {
                        int index = resolution.indexOf('x');
                        result[0] = Integer.parseInt(resolution.substring(0, index));
                        result[1] = Integer.parseInt(resolution.substring(index + 1));
                        if(result[0] != 0 && result[1] != 0) {
                            success = true;
                        }
                        if(result[0] > result[1]) {
                            swap(result, 0, 1);
                        }
                    }
                    result[2] = cursor.getLong(1);
                    if(result[2] >= 0 && success) {
                        success = true;
                    } else {
                        success = false;
                    }
                }
                if (null != cursor) {
                    cursor.close();
                }
            }
            catch (Exception e) {
                // do nothing
            } finally {
                try {
                    if (null != cursor) {
                        cursor.close();
                    }
                } catch (Exception e2) {
                    // do nothing
                }
            }
            if (!success) {
                try {
                    ContentResolver contentResolver = context.getContentResolver();
                    String selection = MediaStore.Images.Media._ID + "= ?";
                    String id = uri.getLastPathSegment();
                    String[] selectionArgs = new String[]{ id };
                    cursor = contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, projection, selection, selectionArgs, null);
                    if (cursor.moveToFirst()) {
                        String resolution = cursor.getString(0);
                        if(!StringUtils.isEmpty(resolution)) {
                            int index = resolution.indexOf('x');
                            result[0] = Integer.parseInt(resolution.substring(0, index));
                            result[1] = Integer.parseInt(resolution.substring(index + 1));
                            if(result[0] > result[1]) {
                                swap(result, 0, 1);
                            }
                        }
                        result[2] = cursor.getLong(1);
                    }
                    if (null != cursor) {
                        cursor.close();
                    }

                } catch (Exception e) {
                    // do nothing
                } finally {
                    try {
                        if (cursor != null) {
                            cursor.close();
                        }
                    } catch (Exception e) {
                        // do nothing
                    }
                }
            }
        if(result[0] <= 0) {
            result[0] = DEFAULT_VIDEO_FRAME_WIDTH;
        }
        if(result[1] <= 0) {
            result[1] = DEFAULT_VIDEO_FRAME_HEIGHT;
        }
        return result;
    }
like image 271
suitianshi Avatar asked Nov 01 '22 13:11

suitianshi


1 Answers

As I see in your code you are requesting duration in your projection

 String[] projection = new String[] {MediaStore.Video.Media.RESOLUTION, MediaStore.Video.VideoColumns.DURATION};

now you just need to retrieve it from the cursor like shown below:

 long timeInMs = cursor.getLong(cursor.getColumnIndex(MediaStore.Video.VideoColumns.DURATION));
like image 57
Volodymyr Avatar answered Nov 12 '22 19:11

Volodymyr