Xamarin Android - запись в файл - доступ запрещен - PullRequest
0 голосов
/ 29 мая 2018

Я получаю путь для сохранения видео .mp4 файла, используя следующий код в PCL проекте, который возвращает « / storage / emulated / 0 / DCIM / »:

 #if __ANDROID__
   var dir = Android.OS.Environment
   .GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDcim);
   var publicPath= dir.AbsolutePath;
   var newFilepath = System.IO.Path.Combine(publicPath, fileName); 
   video.path = newFilepath;
 #endif

Я добавил разрешения для Android.Manifest , как показано ниже:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

И эта функция будет получать файл .mp4 из Интернета и сохранять впуть:

 public void downloadVideo(VideoInfor video, bool isRetried)
    {
        if (!video.downloadUrl.Contains(HLS) && !video.downloadUrl.Contains(HLS_1))
        {
            string filepath = video.path;

            if (Uri.IsWellFormedUriString(video.downloadUrl, UriKind.RelativeOrAbsolute) && !video.downloadUrl.Contains("https://v.vnecdn.net/vnexpress/video/video_default.mp4"))
            {
                video.downloadUrl = video.downloadUrl.Replace("&amp;", "&");
                Console.WriteLine("Downloading url:  " + video.downloadUrl);
                try
                {
                    if (!video.downloadUrl.Contains(".m3u8"))
                    {
                        Console.WriteLine("Downloading.....");

                        var request = (HttpWebRequest)WebRequest.Create(video.downloadUrl);
                        if (isRetried)
                        {
                            request.Timeout = 120000;
                        }
                        using (WebResponse response = request.GetResponse())
                        {
                            using (Stream source = response.GetResponseStream())
                            {
                                using (FileStream target = File.Open(filepath, FileMode.Create, System.IO.FileAccess.Write))
                                {
                                    var buffer = new byte[1024];
                                    bool cancel = false;
                                    int bytes;
                                    int copiedBytes = 0;

                                    while (!cancel && (bytes = source.Read(buffer, 0, buffer.Length)) > 0)
                                    {
                                        target.Write(buffer, 0, bytes);

                                        copiedBytes += bytes;
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception download url = " + video.downloadUrl);
                    Console.WriteLine("Exception download url Exception = " + ex.ToString());
                    if (!isRetried)
                    {
                        downloadVideo(video, true);
                    }

                }
            }
        }
    }

Когда программа работает с "t arget.Write (буфер, 0, байты); " Я получаю исключение "Доступ к пути запрещен",так что кто-нибудь plesae скажите мне, почему происходит эта ошибка?

Я уже пробовал Plugin.permissions :

 Dictionary<Permission, PermissionStatus> results = 
 await CrossPermissions.Current.RequestPermissionsAsync(Permission.Storage);
 PermissionStatus status = results[Permission.Storage];

но я получил " status = Permission.Unknow"

Я уже пытался сохранить видео в частном пути, к которому только мое приложение может получить доступ к следующему коду, который возвращает" / data / user / 0 / com.companyname.VideoDownloader /files /":

 var dir = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
     video.path = System.IO.Path.Combine(dir, filename);

И функция downloadVideo может записывать все байтовые данные в путь без ошибок, но я не вижуny файлы при переходе по этому пути.

Вот моя конфигурация SDK:

<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="25" />

1 Ответ

0 голосов
/ 12 июня 2018

Поскольку ваш целевой SDK равен 25, вы должны запрашивать разрешения во время выполнения .Вы можете обратиться к этому блогу , чтобы узнать, как это сделать в xamarin.

...