Interesting approach. Of course, the downside is that if anything changes, the method becomes ineffective for that new device or for all andriods if the change is fundamental enough.
Bob S > On Dec 19, 2018, at 03:37 , Peter Reid via use-livecode > <firstname.lastname@example.org> wrote: > > FYI > > I've managed to put together some code that reliably locates the microSD card > in 4 very different Android-based tablets. The approach involves 3 different > methods: > > 1. Search for a known folder on the SD card starting in the standard "/mnt" > folder using a breadth-first search strategy. > > 2. Search for a known folder on the SD card starting in the less standard > "/storage" folder using a breadth-first search strategy. > > 3. Search for a known folder using full paths that are used by specific > manufacturers. These look as though they should be located by method 1. (they > are all paths from "/mnt") but sometimes fail 1. however they work if the > full path is specified! > > Here's my code for "findSDcard"... > > ---------------- > > on findSDcard > constant \ > cSDcardRoot1 = "/mnt/ext_sdcard/Android/data/com.myorg.myapp/files", \ > cSDcardRoot2 = "/mnt/sdcard2/Android/data/com.myorg.myapp/files", \ > cSDcardRoot3 = "/mnt/m_external_sd/Android/data/com.myorg.myapp/files", \ > cSDcardRoot4 = "/mnt/sdcard/Android/data/com.myorg.myapp/files", \ > cSDcardRoot5 = "/mnt/extSdCard/Android/data/com.myorg.myapp/files", \ > cSDcardRoot6 = "/mnt/external_sd/Android/data/com.myorg.myapp/files", \ > cSDcardRoot7 = "/mnt/SDCard/Android/data/com.myorg.myapp/files" > > global gDataPath -- /myapp-data > global gSDcard -- path to app's data folder > > set wholeMatches to true > put empty into gSDcard > put (char 2 to -1 of gDataPath) into tTargetFolderName > if the platform is "android" then > put "/mnt" into tDeviceRoot > if there is a folder tDeviceRoot then > -- search in standard /mnt folders: > put empty into tFoundPath > folderExists tTargetFolderName, tDeviceRoot, tFoundPath > if tFoundPath is not empty then > put tFoundPath into gSDcard > end if > end if > if gSDcard is empty then > -- try non-standard /storage folders: > if there is a folder "/storage" then > -- search in non-standard /storage folders: > put "/storage" into tDeviceRoot > put empty into tFoundPath > folderExists tTargetFolderName, tDeviceRoot, tFoundPath > if tFoundPath is not empty then > put tFoundPath into gSDcard > end if > end if > end if > if gSDcard is empty then > -- try bespoke SD locations: > if there is a folder cSDcardRoot1 then > put cSDcardRoot1 into gSDcard -- Huawei > else if there is a folder cSDcardRoot2 then > put cSDcardRoot2 into gSDcard -- Amazon > else if there is a folder cSDcardRoot3 then > put cSDcardRoot3 into gSDcard -- Lenovo > else if there is a folder cSDcardRoot4 then > put cSDcardRoot4 into gSDcard -- Fusion > else if there is a folder cSDcardRoot5 then > put cSDcardRoot5 into gSDcard -- ?? > else if there is a folder cSDcardRoot6 then > put cSDcardRoot6 into gSDcard -- ?? > else if there is a folder cSDcardRoot7 then > put cSDcardRoot7 into gSDcard -- Hudl? > end if > end if > end if > end findSDcard > > on folderExists pFolderName, pRootPath, @pFoundPath > constant cNoDotsRegex = "^\..*" > > -- breadth-first search for a given folder > put empty into pPath > if there is a folder pRootPath then > put empty into tSubFolders > put folders(pRootPath) into tFolderList > filter lines of tFolderList without regex cNoDotsRegex > repeat for each line tFolder in tFolderList > if tFolder = pFolderName then > -- found it: > put pRootPath into pFoundPath > exit folderExists > else > -- add sub-folder to list for checking: > put pRootPath & "/" & tFolder & return after tSubFolders > end if > end repeat > if tSubFolders is empty then > exit folderExists > end if > repeat for each line tSubFolder in tSubFolders > folderExists pFolderName, tSubFolder, pFoundPath > if pFoundPath is not empty then > exit folderExists > end if > end repeat > end if > end folderExists > > ---------------- > > Note that the above was necessary because specialFolderPath("external > documents") doesn't work reliably across the 4 Android-based tablets I'm > trying to support. > > If anyone has a more elegant or succinct method, please let me know. In the > meantime you're welcome to use the above code. > > Peter > -- > Peter Reid > Loughborough, UK > >> On 28 Nov 2018, at 11:49am, Peter Reid <pr...@reidit.co.uk> wrote: >> >> I've got an app running on an Android 8.1 7in tablet which uses a microSD >> card for its RW data storage. I've tried using: >> >> specialFolderPath("external documents") >> >> which the docs describe as follows: >> >> • "external documents": The folder on the primary shared/external >> storage device where application-specific data can be placed >> but this doesn't point to the microSD. >> >> Instead I'm having to try to pause the app and then search around for the >> microSD. So far I've found 7 different locations for the microSD, depending >> on the model of tablet: >> >> 1. /mnt/ext_sdcard/Android/data/com.reidit.myapp/files >> >> 2. /mnt/sdcard2/Android/data/com.reidit.myapp/files >> >> 3. /mnt/m_external_sd/Android/data/com.reidit.myapp/files >> >> 4. /mnt/sdcard/Android/data/com.reidit.myapp/files >> >> 5. /mnt/extSdCard/Android/data/com.reidit.myapp/files >> >> 6. /mnt/external_sd/Android/data/com.reidit.myapp/files >> >> 7. /mnt/SDCard/Android/data/com.reidit.myapp/files >> >> where the ../files folder is located in the microSD filing system as follows: >> >> /Android >> /data >> /com.reidit.myapp >> /files >> >> Whenever I try to install my app on a different Android tablet, I have to go >> hunting for the exact filing system for the 1st part of the microSD: >> >> /mnt/<unknown>/ >> >> The tail of /Android/data/com.reidit.myapp/files seems to be consistent. It >> seems that the only variable is the <unknown> part. >> >> However, I have 2 tablets (Android 5.1 and Android 8.1) where I haven't been >> able to locate the microSD card at all! >> >> Any suggestions about how to reliably locate the microSD card in an Android >> tablet? >> >> Peter >> -- >> Peter Reid >> Loughborough, UK >> > > > _______________________________________________ > use-livecode mailing list > email@example.com > Please visit this url to subscribe, unsubscribe and manage your subscription > preferences: > http://lists.runrev.com/mailman/listinfo/use-livecode _______________________________________________ use-livecode mailing list firstname.lastname@example.org Please visit this url to subscribe, unsubscribe and manage your subscription preferences: http://lists.runrev.com/mailman/listinfo/use-livecode