实现PDF生成,然后从本地通知打开保存下载的Pdf

问题描述 投票:0回答:1

我正在实现 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代码,但没有任何帮助

flutter dart pdf-generation flutter-dependencies android-permissions
1个回答
0
投票
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>
© www.soinside.com 2019 - 2024. All rights reserved.