当我尝试读取 Android 11 中的文件时,电容器文件系统出现错误
Capacitor Filesystem error when I try to read a file in Android 11
我尝试使用函数 readFile
of capacitor filesystem 在我的模拟器中读取文件。我尝试操作的文件位于模拟器的下载文件夹中,函数 return 此错误:
Error: File does not exist
我也尝试使用 copy 功能,将此文件复制到我可以操作它的目录,但是这个功能 return 给我这个错误:
Error: The source object does not exist
我还在应用程序中进行了权限测试,我得到了 granted
。
我在网上搜索了这个错误,但没有成功。此外,我在文件系统服务的功能上使用了 Directory
的所有参数,但所有选项 return 都出现了同样的错误。使用相同的参数,可以访问 android 10.
中的文件系统
所有测试都是在模拟器 Pixel 4 中进行的 Android 11 (API30)。
在 android.xml 中,在标签 application
内,我添加了 android:requestLegacyExternalStorage="true"
,在 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" />
homePage.ts
同文
// 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).
});
同读
// file_dir_path = file:///storage/emulated/0/Download/
// file_name = file.kml
return readFile(file_dir_path + file_name).then(fileAs64 => {
console.log(fileAs64);
});
文件系统服务
/** 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;
});
}
我需要知道是否可以从 Android 上的应用程序的范围文件夹中获取文件 11. 我的应用程序需要导入可以存在于设备上任何位置的文件(用户选择从哪里)。
离子信息
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帽医生
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
编辑
尝试将目标SDK更改为28和29,但出现同样的错误。
文档说当我需要访问范围存储之外的文件时添加标签 MANAGE_EXTERNAL_STORAGE
,但是这个参数已经包含在我的清单中,即使这样我也不允许读取范围之外的任何内容分区存储。
在使用 checkPermissions()
and requestPermissions()
测试文件系统权限时,两个函数 returns publicStorage: 'granted'.
如果您在 android/variables.gradle
中放置了正确的目标,它应该可以正常工作,如果不正确,您必须在电容器 GitHub 页面中打开一个问题。
ext {
compileSdkVersion = 29
targetSdkVersion = 29
...
}
而且你不应该使用 MANAGE_EXTERNAL_STORAGE 除非你有很好的理由,它会成为在 Google Play 商店中部署的麻烦,请参阅 Google's support page更多细节。在您的 AndroidManifest 中还保留参数 android:requestLegacyExternalStorage="true"
,并添加用户权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
我尝试使用函数 readFile
of capacitor filesystem 在我的模拟器中读取文件。我尝试操作的文件位于模拟器的下载文件夹中,函数 return 此错误:
Error: File does not exist
我也尝试使用 copy 功能,将此文件复制到我可以操作它的目录,但是这个功能 return 给我这个错误:
Error: The source object does not exist
我还在应用程序中进行了权限测试,我得到了 granted
。
我在网上搜索了这个错误,但没有成功。此外,我在文件系统服务的功能上使用了 Directory
的所有参数,但所有选项 return 都出现了同样的错误。使用相同的参数,可以访问 android 10.
所有测试都是在模拟器 Pixel 4 中进行的 Android 11 (API30)。
在 android.xml 中,在标签 application
内,我添加了 android:requestLegacyExternalStorage="true"
,在 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" />
homePage.ts
同文
// 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).
});
同读
// file_dir_path = file:///storage/emulated/0/Download/
// file_name = file.kml
return readFile(file_dir_path + file_name).then(fileAs64 => {
console.log(fileAs64);
});
文件系统服务
/** 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;
});
}
我需要知道是否可以从 Android 上的应用程序的范围文件夹中获取文件 11. 我的应用程序需要导入可以存在于设备上任何位置的文件(用户选择从哪里)。
离子信息
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帽医生
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
编辑
尝试将目标SDK更改为28和29,但出现同样的错误。
文档说当我需要访问范围存储之外的文件时添加标签 MANAGE_EXTERNAL_STORAGE
,但是这个参数已经包含在我的清单中,即使这样我也不允许读取范围之外的任何内容分区存储。
在使用 checkPermissions()
and requestPermissions()
测试文件系统权限时,两个函数 returns publicStorage: 'granted'.
如果您在 android/variables.gradle
中放置了正确的目标,它应该可以正常工作,如果不正确,您必须在电容器 GitHub 页面中打开一个问题。
ext {
compileSdkVersion = 29
targetSdkVersion = 29
...
}
而且你不应该使用 MANAGE_EXTERNAL_STORAGE 除非你有很好的理由,它会成为在 Google Play 商店中部署的麻烦,请参阅 Google's support page更多细节。在您的 AndroidManifest 中还保留参数 android:requestLegacyExternalStorage="true"
,并添加用户权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />