我正在使用permission_handler软件包来请求读取许可以存储在我的应用中,以便在调试模式下一切正常,并且当我使用“ flutter run --release”运行代码时,但是当我将代码导出为apk时出现了问题权限对话框不会出现。我不知道我在做什么错,请帮帮我!
这是androidManifest.xml
<manifest xmlns:android =“ http://schemas.android.com/apk/res/android” package =“ com.edithautotech.edithdisplayrelease”> <!-io.flutter.app.FlutterApplication是一个android.app.Application 调用FlutterMain.startInitialization(this); 在其onCreate方法中。 在大多数情况下,你可以保持原样,但如果你想提供 附加功能可以很好地子类化或重新实现 FlutterApplication并将你的自定义类放在这里。-> <!-“存储”组的权限选项-> <uses-permission android:name =“ android.permission.INTERNET” /> <uses-permission android:name =“ com.android.vending.BILLING” /> <uses-permission android:name =“ android.permission.READ_EXTERNAL_STORAGE” /> <申请 android:name =“ io.flutter.app.FlutterApplication” android:label =“ Edith Display” android:icon =“ @ mipmap / ic_launcher”> <活动 android:name =“。MainActivity” android:launchMode =“ singleTop” android:theme =“ @ style / LaunchTheme” android:configChanges =“ orientation | keyboardHidden | keyboard | screenSize | smallestScreenSize | locale | layoutDirection | fontScale | screenLayout | density | uiMode” android:hardwareAccelerated =“ true” android:windowSoftInputMode =“ adjustResize”> <!-指定一个Android主题,尽快将其应用于此活动 Android进程已开始。该主题对用户可见 当Flutter UI初始化时。之后,这个主题继续 确定Flutter UI背后的Window背景。-> <元数据 android:name =“ io.flutter.embedding.android.NormalTheme” android:resource =“ @ style / NormalTheme” /> <!-显示Android View,并继续显示启动屏幕 可绘制,直到Flutter绘制其第一帧,然后绘制此飞溅 屏幕淡出。初始屏幕有助于避免任何视觉冲击 Android的启动屏幕结束与 颤振的第一帧。-> <元数据 android:name =“ io.flutter.embedding.android.SplashScreenDrawable” android:resource =“ @ drawable / launch_background” /> <意图过滤器> <action android:name =“ android.intent.action.MAIN” /> <category android:name =“ android.intent.category.LAUNCHER” /> </ intent-filter> </ activity> <!-不要删除下面的元数据。 Flutter工具使用它来生成GeneratedPluginRegistrant.java-> <元数据 android:name =“ flutterEmbedding” android:value =“ 2” /> </ application> </ manifest>
这是 dart 代码
import 'package:fluttertoast/fluttertoast.dart';
import 'package:permission_handler/permission_handler.dart';
class HomeScreen extends StatefulWidget {
static const routeName = "/gallery";
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen>
with SingleTickerProviderStateMixin {
PermissionStatus _storageStatus = PermissionStatus.restricted;
@override
void initState() {
super.initState();
_initPermission();
}
void _initPermission() async {
final PermissionStatus status = await _permission.request();
setState(() {
_storageStatus = status;
});
}
void _checkPermission({Function handler}) async {
switch (_storageStatus) {
case PermissionStatus.granted:
handler();
break;
case PermissionStatus.denied:
Fluttertoast.showToast(msg: "Storage permission denied");
break;
case PermissionStatus.restricted:
Fluttertoast.showToast(msg: "Storage permission restricted");
break;
case PermissionStatus.permanentlyDenied:
Fluttertoast.showToast(msg: "Storage permission permanently denied");
break;
case PermissionStatus.undetermined:
Fluttertoast.showToast(msg: "Storage permission undermined");
break;
}
}
Void onUploadButtonClick(){
// showing media from device here
}
@override
Widget build(BuildContext context) {
final ThemeData theme = Theme.of(context);
return Scaffold(
appBar: AppBar(
title: Text(
widget.restaurantName,
style: theme.appBarTheme.textTheme.headline1,
),),
body: Container(color: Colors.Green),
floatingActionButton: FloatingActionButton.extended(
onPressed: () {
Fluttertoast.showToast(msg: "Upload Pressed");
_checkPermission(
handler: () =>
onUploadButtonClick(context, user: widget.user),
);
},
label: Text(
'Upload',
style: theme.textTheme.button,
),
icon: Icon(
Icons.cloud_upload,
size: 30,
),
)
);
}
}
我很确定我已经解决了这个问题:https : //stackoverflow.com/a/64235930/2025941
我用几种不同的方法解决了这个问题:
#Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.** { *; }
-keep class io.flutter.util.** { *; }
-keep class io.flutter.view.** { *; }
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
-keep class androidx.lifecycle.** { *; } #https://github.com/flutter/flutter/issues/58479
#https://medium.com/@swav.kulinski/flutter-and-android-obfuscation-8768ac544421
buildTypes {
release {
profile {
matchingFallbacks = ['debug', 'release']
}
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
lintOptions {
disable 'InvalidPackage'
checkReleaseBuilds false
}
flutter channel master
我还通过导航到SDK管理器-> SDK工具->检查和下载Google Play服务,将android迁移到Android Studio中的AndroidX。
我还确保编译SDK和目标SDK为29;目前,SDK 30的Permission_handler程序包存在问题。
我还编辑了kotlin主要活动文件:
package yourpackage
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
}
}
我试图解决这个问题,但是由于时间的限制,我只通过创建一个新项目并在其中复制我的代码来解决了这个问题!但这似乎是一个有前途的解决方案。感谢您的努力!
毕竟,Flutter clean为我解决了这个问题。谢谢你。
只是为了清楚起见,您曾说过单独切换到通道主设备也应该可以解决问题?
不,仅切换到通道主控器并不能解决问题.........尝试我提到的其他方法...
在prograurdrules.pro中添加“ -keep class androidx.lifecycle。** {*;}”对我来说很有效,但是我没有执行任何其他提到的步骤。