Xamarin Forms Android 10 及更高版本在公共外部存储中按文件名查找视频并获取路径

Posted

技术标签:

【中文标题】Xamarin Forms Android 10 及更高版本在公共外部存储中按文件名查找视频并获取路径【英文标题】:Xamarin Forms Android 10 and higher find video by filename in public external storage and get path 【发布时间】:2021-11-29 16:20:42 【问题描述】:

我正在开发一个 Xamarin 表单应用程序,用户可以在其中拍摄视频并将其保存到公共外部存储中。我目前正在保存创建的视频的文件名。 我保存视频的方式:

  private readonly string DirectoryName = "KiloFürKilo";

  public async Task<string> CaptureVideoAsync()
        
            var photo = await MediaPicker.CaptureVideoAsync();
            await using var stream = await photo.OpenReadAsync();
            await using var memoryStream = new MemoryStream();
            await stream.CopyToAsync(memoryStream);
            var filename = "KforK" + DateTime.Now + ".mp4";
            SaveVideoFromByte(memoryStream.ToArray(), filename);
            return filename;
        

 private async void SaveVideoFromByte(byte[] imageByte, string filename)
        
            var context = CrossCurrentActivity.Current.AppContext;
            var mediaScanIntent = new Intent(Intent.ActionMediaScannerScanFile);
            //android 10+
            if (Android.OS.Build.VERSION.SdkInt > Android.OS.BuildVersionCodes.P)
            
                using var resolver = context.ContentResolver;
                var contentValues = new ContentValues();
                contentValues.Put(MediaStore.IMediaColumns.DisplayName, filename);
                contentValues.Put(MediaStore.IMediaColumns.MimeType, "video/mp4");
                contentValues.Put(MediaStore.IMediaColumns.RelativePath, "DCIM/" + DirectoryName);


                var uri = resolver.Insert(MediaStore.Video.Media.ExternalContentUri, contentValues);

                using var stream = resolver.OpenOutputStream(uri);
                await stream.WriteAsync(imageByte);
                stream.Close();
                mediaScanIntent.SetData(uri);
            
            else
            
                var rootPath =
                    Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryMovies);
                var storagePath = Path.Combine(rootPath.ToString(), DirectoryName);
                if (!File.Exists(storagePath))
                
                    Directory.CreateDirectory(storagePath);
                

                string path = Path.Combine(storagePath.ToString(), filename);
                File.WriteAllBytes(path, imageByte);

                mediaScanIntent.SetData(Android.Net.Uri.FromFile(new Java.IO.File(path)));
            

            context.SendBroadcast(mediaScanIntent);
        

我现在希望能够打开并播放视频,而无需用户从图库中选择它。 如何通过文件名在外部公共存储中找到视频并检索它的路径? 我想我必须使用 MediaStore 但不知道如何。 感谢任何可以帮助我解决这个问题的人:)

【问题讨论】:

【参考方案1】:

MediaStore insert() 为您提供了写入文件的 uri。

要读取/播放文件,您可以使用相同的 uri。

另外你的相对路径是“DCIM/”+DirectoryName;

如果你需要一条路径,那么完整的路径就是 "/storage/emulated/0/DCIM/"+DirectoryName+"/"+文件名。

【讨论】:

非常感谢您,我可以使用此 uri 播放视频!

以上是关于Xamarin Forms Android 10 及更高版本在公共外部存储中按文件名查找视频并获取路径的主要内容,如果未能解决你的问题,请参考以下文章

构建新的 Xamarin.Forms 项目失败

Xamarin Forms - 如何检查 Android 上 RequestIgnoreBatteryOptimizations 权限的设置

在现有 Xamarin Forms 项目中添加新的 Android 项目[IOS]

是否可以在 Xamarin Forms ContentView 中嵌入 Android.VideoView

Xamarin Forms Android 10 及更高版本在公共外部存储中按文件名查找视频并获取路径

Httpclient Xamarin Forms 调用在 Android 中不起作用