我想显示内部和外部存储中存在的所有pdf文件,因此在点击该特定文件时,我想在全屏对话框中打开该文件。
答案 0 :(得分:5)
所以为了做到这一点,你需要:
<external storage>/pdf
。为了做所有想法,我建议你使用那些颤动的包:
使用path_provider,您可以获取Android设备的外部存储目录。
Directory extDir = await getExternalStorageDirectory();
String pdfPath = extDir + "/pdf/";
要访问外部存储空间,您需要在ApplicationManifest.xml
:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
你也可以只使用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;
});
}
});
}
}
获得外部存储访问权限后,我们会列出PDF目录:
List<FileSystemEntity> _files;
_files = dir.listSync(recursive: true, followLinks: false);
并在ListView中显示它们:
return new ListView.builder(
padding: const EdgeInsets.all(16.0),
itemCount: _files.length,
itemBuilder: (context, i) {
return _buildRow(_files.elementAt(i).path);
});
当用户点击它们时,您必须使用查看器打开它们。
要做到这一点,没有一种简单的方法,因为使用Android,我们需要构建一个ContentUri,并将此URI的访问权限提供给exteranl应用程序查看器。
因此我们在Android中执行此操作,并使用flutter platform channels来调用Android本机代码。
<强>落镖:强>
static const platform =
const MethodChannel('it.versionestabile.flutterapp000001/pdfViewer');
var args = {'url': fileName};
platform.invokeMethod('viewPdf', args);
原生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();
}
}
});
}
}
毕竟我们可以拥有我们的PDF列表并可在Android上查看。
你需要学习很多东西。我希望这对你来说是一个有用的游乐场。
这适用于外部存储,但您也可以获取内部和临时目录,其行为与此类似。
如果你想在iOS上做同样的事情,你需要在iOS项目上创建相同的本地代码pdfViewer
。请务必参考flutter platform channels以执行此操作。请记住,iOS设备上不存在外部存储。因此,您只能使用应用程序沙箱文档文件夹或临时文件夹。
快乐的编码。