Spanish Crear directorios en DirDefaultExternal nuevos Android

EcoGus

Member
Licensed User
Longtime User
Hola, buenas...

Acabo de cambiar de movil y tengo unos programas que voy pasando de un teléfono a otro desde hace años. Resulta que con las nuevas versiones de Android, en este caso 11, al ejecutar el programa, no se crea por defecto el directorio de trabajo "DirDefaultExternal", como es la carpeta que utilizo por defecto, el programa da error y no funciona. Con el comando "file.MakeDir" he intentado crear los directorios y aunque no da error al ejecutarlo, los directorios no se crean.... he intentado todos los permisos, actualizado B4A, actualizar JAVA, JDK....no encuentro la manera de hacerlo funcionar. También he añadido al MANIFEST la linea AddManifestText(<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>) pero sigue sin funcionar.

He hecho un programa de ejemplo, sólo para crear los directorios, pongo aquí el código.

Crear Directorio:
Sub Globals
    Dim Rp As RuntimePermissions
    Dim DirTra As String
End Sub

Sub Activity_Create(FirstTime As Boolean)
    If File.ExternalWritable Then
        Msgbox("Tiene permisos para escribir en la memoria externa", "¡¡¡ Atención !!!")
    Else
        Msgbox("NO hay permisos para escribir en la memoria externa","¡¡¡ Atención !!!")
    End If
   
    Rp.CheckAndRequest(Rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
   
    If File.ExternalWritable Then
        Msgbox("Tiene permisos para escribir en la memoria externa", "¡¡¡ Atención !!!")
    Else
        Msgbox("NO hay permisos para escribir en la memoria externa","¡¡¡ Atención !!!")
    End If
   
    If Not(File.ExternalWritable) Then
        Msgbox("No se puede grabar en la memoria externa...","¡¡¡ Atención !!!")
    End If

    DirTra=File.DirDefaultExternal
    Dim paths() As Object = GetContext.RunMethod("getExternalFilesDirs", Array(Null))
    For Each p As Object In paths
        Log(p)
        Dim str As String =    p
        If Not(str.Contains("emulated")) Then
            DirTra=p
        End If
    Next
   
    Dim nDir, dDir As String=""
    For i=2 To DirTra.Length -2
        If DirTra.SubString2(i,i+1)="/" Then
            dDir=DirTra.SubString2(0,i)
            Try
                nDir=DirTra.SubString2(i+1,DirTra.IndexOf2("/",i+2))
            Catch
                nDir=DirTra.SubString(i+1)
            End Try
            If Not(File.Exists(dDir,nDir)) Then
                Try
                    File.MakeDir(dDir,nDir)
                Catch
                    File.MakeDir(dDir,nDir)
                End Try
            End If
        End If
    Next

End Sub
 
Last edited:

EcoGus

Member
Licensed User
Longtime User
Gracias Rubsanpe.

Perfecto, haciendo la modificacion del MANIFEST, este crea automaticamente la carpeta DEFAULTEXTERNALDIR y se puede trabajar con ella con normalidad... pego aqui el código que he puesto en el Manifest, por si alguien quiere usarlo así. En la versión del enlace la vesión de android:targetSdkVersion era la 30, pero así no me lo instalaba en el movil.


Manifest:
AddManifestText(
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="29"/>
<supports-screens android:largeScreens="true"
    android:normalScreens="true"
    android:smallScreens="true"
    android:anyDensity="true"/>)
AddManifestText(
<uses-permission
  android:name="android.permission.WRITE_EXTERNAL_STORAGE"
  android:maxSdkVersion="19" />)  
SetApplicationAttribute(android:icon, "@drawable/icon")
SetApplicationAttribute(android:label, "$LABEL$")
'End of default text.
AddApplicationText(
  <provider
  android:name="android.support.v4.content.FileProvider"
  android:authorities="$PACKAGE$.provider"
  android:exported="false"
  android:grantUriPermissions="true">
  <meta-data
  android:name="android.support.FILE_PROVIDER_PATHS"
  android:resource="@xml/provider_paths"/>
  </provider>
)
CreateResource(xml, provider_paths,
   <external-files-path name="name" path="" />
)
 
Top