typescript - Capacitor Filesystem-feil når jeg prøver å lese en fil i Android 11


Jeg prøvde å lese en fil i emulatoren min ved å bruke funksjonen readFile fra capacitor filesystem. Filen jeg prøver å manipulere ligger i emulatorens Nedlastinger-mappe, og funksjonen returnerer denne feilen:

Feil: Filen eksisterer ikke

Jeg prøvde også å bruke kopieringsfunksjonen for å kopiere denne filen til en katalog hvor jeg kan manipulere den, men denne funksjonen gir meg denne feilen:

Feil: Kildeobjektet eksisterer ikke

Jeg gjorde også tester av tillatelser i applikasjonen, hvor jeg fikk tillatt.

Jeg søkte etter disse feilene på nettet, men uten hell. Jeg brukte også alle parameterne til Directory på funksjonene i filsystemtjenesten min, men alle alternativene gir meg de samme feilene. Med de samme parameterne var det mulig å få tilgang til filsystemet i Android 10.

Alle testene er gjort i en emulator Pixel 4 med Android 11 (API30).

I android.xml, inne i application-taggen, la jeg til android:requestLegacyExternalStorage="true", og i user-permissions:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

hjemSide.ts

med kopi

// file_dir_path = file:///storage/emulated/0/Download/
// file_name = file.kml
// path = 'MyApp/project' + this.projectId + '/temp'
return this.filesystem.copyFileToManegeDirectory(file_dir_path + file_name, path + '/teste').then(fileAs64 => {
    console.log(fileAs64).
});

med lese

// file_dir_path = file:///storage/emulated/0/Download/
// file_name = file.kml
return readFile(file_dir_path + file_name).then(fileAs64 => {
    console.log(fileAs64);
});

Filsystemtjeneste

/** Copy Files */
// fileToCopy = file:///storage/emulated/0/Download/file.kml
copyFileToManegeDirectory(fileToCopy: string, directoryToGo: string): Promise<any> {
    return Filesystem.checkPermissions().then(permission => {
        console.log(permission)
        return Filesystem.copy({
            from: fileToCopy,
            directory: Directory.ExternalStorage,
            to: directoryToGo,
            toDirectory: Directory.External
        }).then(result => {
            console.log(result);
        })
    });
}

/** Read a file and returns a string base 64 */
readFile(path: string): Promise<string> {
    return Filesystem.readFile({
        path: path
    }).then(result => {
        return result.data;
    });
}

Jeg trenger å vite om det er mulig å få filer ut av appens begrensede mappe på Android 11. Appen min trenger å importere filer som kan eksistere hvor som helst på enheten (brukeren velger hvorfra).

Ionic informasjon

   Ionic CLI                     : 6.15.1-testing.0 (C:\Users\Gabriel Vieira\AppData\Roaming\npm\node_modules\@ionic\cli)
   Ionic Framework               : @ionic/angular 5.6.8
   @angular-devkit/build-angular : 12.0.2
   @angular-devkit/schematics    : 12.0.2
   @angular/cli                  : 12.0.2
   @ionic/angular-toolkit        : 4.0.0

Capacitor:

   Capacitor CLI      : 3.0.0
   @capacitor/android : 3.0.0
   @capacitor/core    : 3.0.0
   @capacitor/ios     : not installed

Utility:

   cordova-res : 0.15.3
   native-run  : 1.4.0

System:

   NodeJS : v14.16.1 (C:\Program Files (x86)\nodejs\node.exe)
   npm    : 6.14.12
   OS     : Windows 10

npx cap doctor

Latest Dependencies:

  @capacitor/cli: 3.0.1
  @capacitor/core: 3.0.1
  @capacitor/android: 3.0.1
  @capacitor/ios: 3.0.1

Installed Dependencies:

  @capacitor/ios: not installed
  @capacitor/cli: 3.0.0
  @capacitor/android: 3.0.0
  @capacitor/core: 3.0.0

REDIGER

Prøvde å endre målsdk til 28 og 29, men den samme feilen oppstod.

Dokumentasjonen sier at man skal legge til taggen MANAGE_EXTERNAL_STORAGE når jeg trenger å få tilgang til filer utenfor omfangsbegrenset lagring, men denne parameteren er allerede inkludert i manifestet mitt, og selv da får jeg ikke lov til å lese noe utenfor omfangsbegrenset lagring.

Mens man tester for filsystemtillatelser ved bruk av checkPermissions() og requestPermissions(), returnerer begge funksjonene publicStorage: 'granted'.

Svar #1

Hvis du setter riktig mål i android/variables.gradle bør det fungere normalt, hvis det ikke gjør det må du åpne en sak på Capacitor GitHub-siden.

ext {
    compileSdkVersion = 29
    targetSdkVersion = 29
    ...
}

Og du bør ikke bruke MANAGE_EXTERNAL_STORAGE med mindre du har en veldig god grunn til det, det kan bli en brysomhet å distribuere i Google Play Store, se Googles supportsider for mer informasjon. I din AndroidManifest beholder du også parameteren android:requestLegacyExternalStorage="true", og legg til bruker-tillatelsene:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Relaterte artikler