PDF 文件无法在 android 的发行版中打开

PDF file not opening in release version of android in flutter

在 Android Studio Emulator 中,pdf 文件正在打开,但是当我释放它的 .apk 文件并将其安装到我的 phone 上时,pdf 文件无法打开。我使用 flutter_pdfview 包来加载 pdf 文件。

这是显示页面的地方。

import 'package:darpandentalhome/services/api_for_report.dart';
import 'package:darpandentalhome/shared/loading.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_pdfview/flutter_pdfview.dart';
import 'package:google_fonts/google_fonts.dart';

class Report extends StatefulWidget {

  final String url;

  Report({this.url});

  @override
  _ReportState createState() => _ReportState();
}

class _ReportState extends State<Report> {

  String path;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    ApiService(pdfURL: widget.url).loadPDF().then((value){
      setState(() {
        path=value;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        elevation: 0,
        centerTitle: true,
        title: Text(
            'Report',
          style: GoogleFonts.rubik(
            textStyle: TextStyle(
              color: Colors.black,
              fontWeight: FontWeight.w500
            )
          ),
        ),
        leading: IconButton(
            icon: Icon(Icons.arrow_back_ios,color: Colors.black,),
          onPressed: () {
              Navigator.pop(context);
          },
        ),
        backgroundColor: Color(0xfff9f9f9),
      ),
      backgroundColor: Color(0xfff9f9f9),
      body: path != null ? Container(
        child: PDFView(
          filePath: path,
        ),
      ) : Loading(),
      floatingActionButton: IconButton(
        icon: Icon(Icons.refresh,size: 30,),
        onPressed: () {
          setState(() {
            path = null;
            ApiService(pdfURL: widget.url).loadPDF().then((value){
              setState(() {
                path=value;
              });
            });
          });
        },
      ),
    );
  }
}

这是用于从 HTTP URL 获取 pdf 文件的 HTTP API 服务。

import 'dart:io';

import 'package:http/http.dart' as http;
import 'package:path_provider/path_provider.dart';

class ApiService{

  final String pdfURL;

  ApiService({this.pdfURL});

  Future<String> loadPDF() async {
    var response = await http.get(pdfURL);
    var dir = await getExternalStorageDirectory();
    File file = File(dir.path + "/data.pdf");
    await file.writeAsBytes(response.bodyBytes, flush: true);
    return file.path;
  }

}

我认为这是 phone 的权限问题,然后我在 AndroidManifest 文件中使用了存储权限,然后在我的 phone 上手动允许了此权限,但它也没有工作。 这里有什么问题?

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

因为android版本不同 如果您的 android 版本是 29,请在清单中使用此代码 android:requestLegacyExternalStorage="true"

由于 http api 需要从互联网获取数据,因此向应用程序授予互联网权限后,此问题已解决。

修复步骤如下:

    1. Add proguard-rules.pro in android/app folder file if its not already there

    2. Inside of the proguard-rules.pro file put this:
        -keep class com.shockwave.**
        -keepclassmembers class com.shockwave.** { *; }
        
    3.In app/build.gradle add this:

       buildTypes{
             release{
                shrinkResources true
                minifyEnabled true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'