在android中存储其他应用程序可公开访问的视频文件

问题描述

这是我必须将应用程序生成的视频存储在磁盘上的当前代码。我希望其他应用程序(如 TikTok、WhatsApp 和谷歌照片)可以访问这些视频。我还想在我的应用程序中创建我自己的画廊。但是,通过以下方法保存的文件不会显示在 TikTok 上。它们显示在 Google 照片库\电影文件夹下,用户必须深入挖掘才能找到。

如何让所有应用都可以访问这些文件?如何编写自己的视频库以仅显示由我的应用创建的文件

private void addVideoTogallery(File videoFile) {
        Uri uriSavedVideo;
        File createdvideo = null;
        ContentResolver resolver = activity.getContentResolver();

        String path = videoFile.getAbsolutePath();
        String videoFileName = path.substring(path.lastIndexOf("/") + 1);
        ContentValues valuesvideos;
        valuesvideos = new ContentValues();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            valuesvideos.put(MediaStore.Video.Media.RELATIVE_PATH,Environment.DIRECTORY_MOVIES + File.pathSeparator + activity.getString(R.string.app_name));
            valuesvideos.put(MediaStore.Video.Media.TITLE,videoFileName);
            valuesvideos.put(MediaStore.Video.Media.disPLAY_NAME,videoFileName);
            valuesvideos.put(MediaStore.Video.Media.MIME_TYPE,"video/mp4");
            valuesvideos.put(MediaStore.Video.Media.DATE_ADDED,System.currentTimeMillis() / 1000);
            Uri collection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
            uriSavedVideo = resolver.insert(collection,valuesvideos);
        } else {
            String directory = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + Environment.DIRECTORY_MOVIES;
            createdvideo = new File(directory,videoFileName);
            valuesvideos.put(MediaStore.Video.Media.TITLE,System.currentTimeMillis() / 1000);
            valuesvideos.put(MediaStore.Video.Media.DATA,createdvideo.getAbsolutePath());
            uriSavedVideo = resolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,valuesvideos);
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            valuesvideos.put(MediaStore.Video.Media.DATE_TAKEN,System.currentTimeMillis());
            valuesvideos.put(MediaStore.Video.Media.IS_PENDING,1);
        }

        ParcelFileDescriptor pfd;
        try {
            pfd = resolver.openFileDescriptor(uriSavedVideo,"w");
            FileOutputStream out = new FileOutputStream(pfd.getFileDescriptor());
            FileInputStream in = new FileInputStream(videoFile);
            byte[] buf = new byte[8192];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf,len);
            }
            out.close();
            in.close();
            pfd.close();

        } catch (Exception e) {
            e.printstacktrace();
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            valuesvideos.clear();
            valuesvideos.put(MediaStore.Video.Media.IS_PENDING,0);
            resolver.update(uriSavedVideo,valuesvideos,null,null);
        }
    }

代码无法使用以下代码从我的应用访问相同的文件

    private void getVids(){
    List<Video> videoList = new ArrayList<Video>();

    Uri collection;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        collection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL);
    } else {
        collection = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
    }

    String[] projection = new String[] {
            MediaStore.Video.Media._ID,MediaStore.Video.Media.disPLAY_NAME,MediaStore.Video.Media.DURATION,MediaStore.Video.Media.SIZE
    };
    String selection = MediaStore.Video.Media.DURATION +
            " >= ?";
    String[] selectionArgs = new String[] {
            String.valueOf(TimeUnit.MILLISECONDS.convert(5,TimeUnit.MINUTES))};
    String sortOrder = MediaStore.Video.Media.disPLAY_NAME + " ASC";

    try (Cursor cursor = activity.getContentResolver().query(
            collection,projection,selection,selectionArgs,sortOrder
    )) {
        // Cache column indices.
        int idColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID);
        int nameColumn =
                cursor.getColumnIndexOrThrow(MediaStore.Video.Media.disPLAY_NAME);
        int durationColumn =
                cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION);
        int sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE);

        while (cursor.movetoNext()) {
            // Get values of columns for a given video.
            long id = cursor.getLong(idColumn);
            String name = cursor.getString(nameColumn);
            int duration = cursor.getInt(durationColumn);
            int size = cursor.getInt(sizeColumn);

            Uri contentUri = ContentUris.withAppendedId(
                    MediaStore.Video.Media.EXTERNAL_CONTENT_URI,id);

            // Stores column values and the contentUri in a local object
            // that represents the media file.
            videoList.add(new Video(contentUri,name,duration,size));
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)