How to reliably identify an Android Tablet microSD Card

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

How to reliably identify an Android Tablet microSD Card

hh via use-livecode
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
[hidden email]
Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode
Reply | Threaded
Open this post in threaded view
|

FYI: How to reliably identify an Android Tablet microSD Card

hh via use-livecode
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 <[hidden email]> 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
[hidden email]
Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode
Reply | Threaded
Open this post in threaded view
|

Re: FYI: How to reliably identify an Android Tablet microSD Card

hh via use-livecode
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 <[hidden email]> 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 <[hidden email]> 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
> [hidden email]
> Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode

_______________________________________________
use-livecode mailing list
[hidden email]
Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode