下次读取流时出现隔离存储异常

本文关键字:隔离 存储 异常 读取 下次 | 更新日期: 2023-09-27 18:37:28

我正在使用Phonegap为WP7.1创建一个应用程序,我必须在其中下载视频并将其保存在独立存储中。现在,在阅读该视频时,我第一次可以正确阅读它,但之后我无法阅读流。每次我读过一次视频后尝试阅读该视频时都会发生此异常:不允许在隔离存储文件流上操作。

代码取自: 如何在WP7中播放嵌入式视频 - Phonegap?并添加了暂停和停止功能。

using System;
using System.IO;
using System.IO.IsolatedStorage;
using System.Runtime.Serialization;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Phone.Controls;
using WP7CordovaClassLib.Cordova.JSON;
namespace WP7CordovaClassLib.Cordova.Commands
{
    public class Video : BaseCommand
    {
        /// <summary>
        /// Video player object
        /// </summary>
        private MediaElement _player;
        Grid grid;

        [DataContract]
        public class VideoOptions
        {
            /// <summary>
            /// Path to video file
            /// </summary>
            [DataMember(Name = "src")]
            public string Src { get; set; }
        }
        public void Play(string args)
        {
            VideoOptions options = JsonHelper.Deserialize<VideoOptions>(args);
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                try
                {
                    _Play(options.Src);
                    DispatchCommandResult(new PluginResult(PluginResult.Status.OK));
                }
                catch (Exception e)
                {
                    DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
                    GoBack();
                }
            });

        }
        private void _Play(string filePath)
        {
            if (_player != null)
            {
                if (_player.CurrentState == System.Windows.Media.MediaElementState.Paused)
                {
                    _player.Play();
                }
            }
            else
            {
                // this.player is a MediaElement, it must be added to the visual tree in order to play
                PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame;
                if (frame != null)
                {
                    PhoneApplicationPage page = frame.Content as PhoneApplicationPage;
                    if (page != null)
                    {
                        grid = page.FindName("VideoPanel") as Grid;
                        if (grid != null && _player == null)
                        {
                            _player = new MediaElement();
                            grid.Children.Add(this._player);
                            grid.Visibility = Visibility.Visible;
                            _player.Visibility = Visibility.Visible;
                            _player.MediaEnded += new RoutedEventHandler(_player_MediaEnded);
                        }
                    }
                }
                Uri uri = new Uri(filePath, UriKind.RelativeOrAbsolute);
                if (uri.IsAbsoluteUri)
                {
                    _player.Source = uri;
                }
                else
                {
                    using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication())
                    {
                        if (isoFile.FileExists(filePath))
                        {
                            **using (IsolatedStorageFileStream stream =
                                new IsolatedStorageFileStream(filePath, FileMode.Open, isoFile))
                            {
                                _player.SetSource(stream);
                                stream.Close();
                            }
                        }
                        else
                        {
                            throw new ArgumentException("Source doesn't exist");
                        }
                    }
                }
                _player.Play();
            }
        }
        void _player_MediaEnded(object sender, RoutedEventArgs e)
        {
            GoBack();
        }
        public void Pause(string args)
        {
            Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    try
                    {
                        _Pause(args);
                        DispatchCommandResult(new PluginResult(PluginResult.Status.OK));
                    }
                    catch (Exception e)
                    {
                        DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
                    }
                });
        }
        private void _Pause(string filePath)
        {
            if (_player != null)
            {
                if (_player.CurrentState == System.Windows.Media.MediaElementState.Playing)
                {
                    _player.Pause();
                }
            }
        }
        public void Stop(string args)
        {
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                try
                {
                    _Stop(args);
                    DispatchCommandResult(new PluginResult(PluginResult.Status.OK));
                }
                catch (Exception e)
                {
                    DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
                }
            });
        }
        private void _Stop(string filePath)
        {
            GoBack();
        }
        private void GoBack()
        {
            if (_player != null)
            {
                if (_player.CurrentState == System.Windows.Media.MediaElementState.Playing
                    || _player.CurrentState == System.Windows.Media.MediaElementState.Paused)
                {
                    _player.Stop();
                }
                _player.Visibility = Visibility.Collapsed;
                _player = null;
            }
            if (grid != null)
            {
                grid.Visibility = Visibility.Collapsed;
            }
        }
    }
}

** 异常(IsolatedStorageFileStream上不允许的操作)在读取文件时_Play函数发生(请参阅上面代码中的**)。第一次它运行良好,当我第二次读取文件时,它给出了异常。

可能有什么问题?我做错了什么吗?

下次读取流时出现隔离存储异常

听起来该文件在上次读取时仍然处于打开状态。如果是这种情况,则需要指定 fileAccess 和 fileShare 以允许另一个线程打开它:

using (IsolatedStorageFileStream

stream = new IsolatedStorageFileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, isoFile)

我通过在导航之前将 MediaElement 的源属性设置为 null 来解决此问题。因此,当我回来播放相同的视频时,MediaElement源是免费的。

将 GoBack 函数编辑为:

private void GoBack()
        {
            // see whole code from original question.................
                _player.Visibility = Visibility.Collapsed;
                _player.Source = null; // added this line
                _player = null;
           //..................
        }

谢谢大家。