我正在实现 pdf 生成,然后当我在 android 7 设备中点击“保存”时,它工作正常,但是一旦我移动到任何更高版本,我就会收到此错误“无法打开文件,路径 = '/storage/emulated/0/Download/BitesVilla” -invoice.pdf'(操作系统错误:权限被拒绝,errno = 13) 已尝试使用权限处理程序,该处理程序也不起作用,就像在 android 13 设备中进行测试一样。权限状态始终为“拒绝”。 尝试更改manifest.xml也没有帮助。我附上我的代码片段和清单设置。请有人帮我解决这个问题。
这是我发生问题的保存文件片段
Future<void> _saveAsFile(
BuildContext context,
LayoutCallback build,
PdfPageFormat pageFormat,
) async {
// DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
// AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
// try {
final bytes = await build(pageFormat);
Directory dir = Directory('/storage/emulated/0/Download');
logger.w("Executing");
File savepath = File("${dir.path}/BitesVilla-invoice.pdf");
logger.w("Executing this much ");
await savepath.writeAsBytes(bytes);
logger.w("Failure");
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('PDF saved to Downloads'),
duration: Duration(seconds: 2),
),
);
await showNotification(context, savepath);
// } catch (e) {
// logger.e(e);
// print("error in this: $e");
// }
}
这是我的清单
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
这是我的appLevel Build.gradle
android {
compileSdkVersion 33
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
defaultConfig {
applicationId "appID"
minSdkVersion 20
targetSdkVersion 33
versionCode 9
versionName '2.0.0'
multiDexEnabled true
}
pdf 未保存。请帮忙
我尝试过使用权限处理程序 通过此代码,它也不允许我启用存储权限,但根据 android 13,它不应该询问我存储权限,因为我指定了下载目录
// final value = await Permission.manageExternalStorage.request();
// logger.w("External Storage Value: $value");
// final status = await Permission.storage.status;
// logger.w("Permission: $status");
// if (Platform.isAndroid && androidInfo.version.sdkInt > 29) {
// final val = await Permission.manageExternalStorage.request();
// logger.w("Above 11: $val");
// } else {
// final val = await Permission.storage.request();
// logger.w("Below 11: $val");
// }
我已经修改了各种堆栈溢出解决方案中的一些manifest.xml代码,但没有任何帮助
For Android 12 use the normal:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="">
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
For Android 13 or Higher use:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="https" />
</intent>
<intent>
<action android:name="android.intent.action.DIAL" />
<data android:scheme="tel" />
</intent>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="*/*" />
</intent>
</queries>