Уже четвёртый вопрос из этой серии. Ссылка на библиотеку
тут , кто использовал тот сразу поймёт о чём речь. Проект создан в 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)?