如何从Flutter的内部和外部存储中获取所有PDF文件?

Tus*_*Pol 0 dart flutter

我想显示内部和外部存储中存在的所有pdf文件,因此在点击该特定文件时,我想在全屏对话框中打开该文件。

sha*_*eep 5

因此,为了做到这一点,您需要:

  • 授予对您的PDF文件所在目录中的外部存储的访问权限。我们将该文件夹称为<external storage>/pdf
  • 列出该目录的所有文件,并显示给用户。
  • 使用可以可视化PDF的应用程序打开所选文件。

为了做到所有这些,我建议您使用那些flutter软件包:

使用path_provider,您可以获取Android设备的外部存储目录。

Directory extDir = await getExternalStorageDirectory();
String pdfPath = extDir + "/pdf/";
Run Code Online (Sandbox Code Playgroud)

为了访问外部存储,您需要在以下位置设置此权限请求ApplicationManifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

您也可以只使用,READ_EXTERNAL_STORAGE但是simple_permission插件将不起作用。

使用simple_permission插件,您可以要求用户授予外部存储访问权限:

  bool externalStoragePermissionOkay = false;

  _checkPermissions() async {
    if (Platform.isAndroid) {
      SimplePermissions
          .checkPermission(Permission.WriteExternalStorage)
          .then((checkOkay) {
        if (!checkOkay) {
          SimplePermissions
              .requestPermission(Permission.WriteExternalStorage)
              .then((okDone) {
            if (okDone) {
              debugPrint("${okDone}");
              setState(() {
                externalStoragePermissionOkay = okDone;
                debugPrint('Refresh UI');
              });
            }
          });
        } else {
          setState(() {
            externalStoragePermissionOkay = checkOkay;
          });
        }
      });
    }
  }
Run Code Online (Sandbox Code Playgroud)

授予我们外部存储访问权限后,我们将列出我们的PDF目录:

List<FileSystemEntity> _files;
_files = dir.listSync(recursive: true, followLinks: false);
Run Code Online (Sandbox Code Playgroud)

并在ListView中显示它们:

return new ListView.builder(
      padding: const EdgeInsets.all(16.0),
      itemCount: _files.length,
      itemBuilder: (context, i) {
        return _buildRow(_files.elementAt(i).path);
      });
Run Code Online (Sandbox Code Playgroud)

当用户点击它们时,您不必使用查看器将它们打开。

要做到这一点,没有一个简单的方法,因为使用Android,我们需要构建一个ContentUri,并将对该URI的访问权限提供给外部应用程序查看器。

因此,我们在Android中执行此操作,并使用Flutter平台通道调用Android本机代码。

镖:

static const platform =
      const MethodChannel('it.versionestabile.flutterapp000001/pdfViewer');
var args = {'url': fileName};
          platform.invokeMethod('viewPdf', args);
Run Code Online (Sandbox Code Playgroud)

本机Java代码:

public class MainActivity extends FlutterActivity {
  private static final String CHANNEL = "it.versionestabile.flutterapp000001/pdfViewer";
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);

    new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
            new MethodChannel.MethodCallHandler() {
              @Override
              public void onMethodCall(MethodCall call, MethodChannel.Result result) {
                if (call.method.equals("viewPdf")) {
                  if (call.hasArgument("url")) {
                    String url = call.argument("url");
                    File file = new File(url);
                    //*
                    Uri photoURI = FileProvider.getUriForFile(MainActivity.this,
                            BuildConfig.APPLICATION_ID + ".provider",
                            file);
                            //*/
                    Intent target = new Intent(Intent.ACTION_VIEW);
                    target.setDataAndType(photoURI,"application/pdf");
                    target.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                    target.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    startActivity(target);
                    result.success(null);
                  }
                } else {
                  result.notImplemented();
                }
              }
            });
  }
}
Run Code Online (Sandbox Code Playgroud)

毕竟,我们可以拥有PDF列表,并且可以在Android上查看。

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

你有很多东西要学习。我希望这对您来说是一个有用的游乐场。

这是用于外部存储的,但是您还可以获取Internal和Temporary目录,其行为与此处类似。

如果要在iOS上执行相同的操作,则需要pdfViewer在iOS项目上也创建相同的本机代码。始终参考颤动平台通道以进行操作。请记住,iOS设备上不存在外部存储。因此,您只能使用应用程序沙箱文档文件夹或临时文件夹。

GitHub库

快乐的编码。