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'
在 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'