diff options
| author | Ray <[email protected]> | 2020-03-05 18:12:41 +0100 |
|---|---|---|
| committer | Ray <[email protected]> | 2020-03-05 18:12:41 +0100 |
| commit | fb2ed693e4ad6cd183d8a4135608c813d8f29358 (patch) | |
| tree | 344b28d84049ff02408f3df7eb972d6f7b7c2a75 /src | |
| parent | 966e8adcf9639c8f524fa99d2edfd348306f45f1 (diff) | |
| download | raylib-fb2ed693e4ad6cd183d8a4135608c813d8f29358.tar.gz raylib-fb2ed693e4ad6cd183d8a4135608c813d8f29358.zip | |
Android: Support file saving to internal data storage
Diffstat (limited to 'src')
| -rw-r--r-- | src/core.c | 2 | ||||
| -rw-r--r-- | src/utils.c | 28 | ||||
| -rw-r--r-- | src/utils.h | 4 |
3 files changed, 24 insertions, 10 deletions
@@ -650,7 +650,7 @@ void InitWindow(int width, int height, const char *title) CORE.Android.app->onAppCmd = AndroidCommandCallback; CORE.Android.app->onInputEvent = AndroidInputCallback; - InitAssetManager(CORE.Android.app->activity->assetManager); + InitAssetManager(CORE.Android.app->activity->assetManager, CORE.Android.app->activity->internalDataPath); TRACELOG(LOG_INFO, "Android app initialized successfully"); diff --git a/src/utils.c b/src/utils.c index 34369744..f26be95d 100644 --- a/src/utils.c +++ b/src/utils.c @@ -65,6 +65,7 @@ static TraceLogCallback logCallback = NULL; // Log callback function #if defined(PLATFORM_ANDROID) static AAssetManager *assetManager = NULL; // Android assets manager pointer +static const char *internalDataPath = NULL; // Android internal data path #endif #if defined(PLATFORM_UWP) @@ -292,21 +293,34 @@ void SaveFileText(const char *fileName, char *text) #if defined(PLATFORM_ANDROID) // Initialize asset manager from android app -void InitAssetManager(AAssetManager *manager) +void InitAssetManager(AAssetManager *manager, const char *dataPath) { assetManager = manager; + internalDataPath = dataPath; } // Replacement for fopen +// Ref: https://developer.android.com/ndk/reference/group/asset FILE *android_fopen(const char *fileName, const char *mode) { - if (mode[0] == 'w') return NULL; - - AAsset *asset = AAssetManager_open(assetManager, fileName, 0); - - if (!asset) return NULL; + if (mode[0] == 'w') // TODO: Test! + { + // TODO: fopen() is mapped to android_fopen() that only grants read access + // to assets directory through AAssetManager but we want to also be able to + // write data when required using the standard stdio FILE access functions + // Ref: https://stackoverflow.com/questions/11294487/android-writing-saving-files-from-native-code-only + #undef fopen + return fopen(TextFormat("%s/%s", internalDataPath, fileName), mode); + #define fopen(name, mode) android_fopen(name, mode) + } + else + { + // NOTE: AAsset provides access to read-only asset + AAsset *asset = AAssetManager_open(assetManager, fileName, AASSET_MODE_UNKNOWN); - return funopen(asset, android_read, android_write, android_seek, android_close); + if (asset != NULL) return funopen(asset, android_read, android_write, android_seek, android_close); + else return NULL; + } } #endif // PLATFORM_ANDROID diff --git a/src/utils.h b/src/utils.h index 1c399b68..675f43b8 100644 --- a/src/utils.h +++ b/src/utils.h @@ -68,8 +68,8 @@ extern "C" { // Prevents name mangling of functions // Module Functions Declaration //---------------------------------------------------------------------------------- #if defined(PLATFORM_ANDROID) -void InitAssetManager(AAssetManager *manager); // Initialize asset manager from android app -FILE *android_fopen(const char *fileName, const char *mode); // Replacement for fopen() +void InitAssetManager(AAssetManager *manager, const char *dataPath); // Initialize asset manager from android app +FILE *android_fopen(const char *fileName, const char *mode); // Replacement for fopen() -> Read-only! #endif #if defined(PLATFORM_UWP) |
