Задать вопрос

Как правильно использовать ContentProvider APEZProvider при реализации библиотеки APK Expansion Files?

Уже четвёртый вопрос из этой серии. Ссылка на библиотеку тут , кто использовал тот сразу поймёт о чём речь. Проект создан в Xamarin PCL профиль №111(без UWP). Все классы находятся в переносимом проекте, а нижеупомянутый класс в проекте Droid.
Вот моя реализация этого провайдера
[assembly: Dependency(typeof(KidsApp.Droid.ZipFileContentProvider))] 
namespace KidsApp.Droid
{
    [ContentProvider(new[] { ContentProviderAuthority }, Exported = false)]
    [MetaData(APEZProvider.MetaData.MainVersion, Value = "9")]
    [MetaData(APEZProvider.MetaData.PatchVersion, Value = "0")]    
    public class ZipFileContentProvider : APEZProvider, IDeviceInfo
    {
        public const string ContentProviderAuthority = "kids.Kids.ZipFileContentProvider";
        public override string Authority => ContentProviderAuthority;

        public string AddAdres(string a)
        {
            var uri = Android.Net.Uri.Parse(string.Format(a, ContentProviderAuthority));
            return uri.ToString();
        }
        public string AddDirect()
        {
            var path = Android.OS.Environment.GetExternalStoragePublicDirectory("Android/obb/kids.Kids");            
            return path.ToString();
        }
    }
}

Функцию AddAdres(string a) с помощью привязки использую в различных классах переносимого проекта для указания имени объектов, находящихся в файле расширении.
public class startLayer : CCLayerColor
    {
        CCSprite DP;
        CCSprite An;
        CCSprite op;
        IDeviceInfo dev;     
        public startLayer() : base(CCColor4B.Black)
        {
            var touchListener = new CCEventListenerTouchAllAtOnce();
            touchListener.OnTouchesEnded = (touches, ccevent) => Director.PushScene(new GameScena(GameView));
            AddEventListener(touchListener, this);
            dev = DependencyService.Get<IDeviceInfo>();
        }
        protected override void AddedToScene()
        {
            base.AddedToScene();
            AddAn();
            Addop();
            AddDP();
            Schedule(RunGameLogic);
        }

        void AddDP()
        {                      
            DP = new CCSprite(dev.AddAdres("DP"));
            DP.AnchorPoint = CCPoint.AnchorMiddle;
            DP.ScaleX = App.Width / DP.TextureRectInPixels.MaxX * 0.4f;
            DP.ScaleY = App.Height / DP.TextureRectInPixels.MaxY * 0.15f;
            DP.PositionX = App.Width / 2; ;
            DP.PositionY = App.Height / 2; ;
            DP.Opacity = 0;
            AddChild(DP);
        }

функцию AddDirect() использую только в одном классе, опять же, с помощью привязки, в переносимом проекте для указания директории в которой находится цифровой контент.
namespace KidsApp
{    
    public class ViewController : ContentView
    {
        IDeviceInfo dev;
        public CocosSharpView GameView;
        public ViewController()
        {
            dev = DependencyService.Get<IDeviceInfo>();
            var GameView = new CocosSharpView
            {
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand
            };           
            if (GameView != null)
            {                
                GameView.ViewCreated += (sender, e) =>
                {
                    CCGameView gameView = sender as CCGameView;
                    if (gameView != null)
                    {
                        gameView.DesignResolution = new CCSizeI(App.Width, App.Height);
                        var contentSearchPaths = new List<string> { dev.AddDirect() };
                        gameView.ContentManager.SearchPaths = contentSearchPaths;
                        CCScene sceneStart = new StartScene(gameView);                                              
                        gameView.Director.RunWithScene(sceneStart);
                        gameView.TouchEnabled = true;
                    }
                };
            }
            Content = GameView;
        }
    }
}

Итого: функция dev.AddDirect() возвращает строку "/storage/emulated/0/Android/obb/kids.Kids", что вроде бы и требуется,
функция AddAdres(string a) возвращает имя передаваемого в параметре файла. Вопрос таков, почему же не работает? Почему не читает фалы находящиеся в несжатом архиве(main.7.kids.Kids.obb)?
  • Вопрос задан
  • 101 просмотр
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы