我正在使用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。 调用FlutterMain.startInitialization(this)的应用程序;在其onCreate方法中。 在大多数情况下,您可以保持原样,但是如果您想提供 其他功能,可以 继承或重新实现FlutterApplication并将自定义类放在此处是可以的。-> <!-“存储”组的权限选项-> <uses-permission android:name =“ android.permission.INTERNET” /> <uses-permission android:name =“ com.android.vending。帐单” <uses-permission android:name =“ android.permission。 android:name =“ io.flutter.app.FlutterApplication” android:label =“ Edith Display” android:icon =“ @ mipmap / ic_launcher”> <activity android:name =“。MainActivity” android:launchMode =“ singleTop” android :theme =“ @ style / LaunchTheme” android:configChanges =“ orientation | keyboardHidden |键盘| screenSize | smallestScreenSize | locale | layoutDirection | fontScale | screenLayout | density | uiMode” android:hardwareAccelerated =“ true” 在Android进程开始后。该主题对用户可见 android:windowSoftInputMode =”AdjustResize“> <!-指定 在Flutter UI初始化时立即将Android主题应用于此活动。之后,此主题将继续 确定Flutter UI背后的Window背景。-> <元数据 android:name =“ io.flutter.embedding.android.NormalTheme” android:resource =“ @ style / NormalTheme” /> <!-显示一个Android视图,该视图继续显示启动屏幕 Drawable,直到Flutter绘制其第一帧,然后此初始 屏幕淡出。初始屏幕有助于避免任何视觉冲击 Android的启动屏幕末端与 Flutter的第一帧绘画之间的差距。-> <元数据 android:name =“ io.flutter.embedding.android.SplashScreenDrawable” android:resource =“ @ drawable / launch_background” /> <intent-filter> <action android:name =“ android.intent。 action.MAIN“ /> <category android:name =” android.intent.category.LAUNCHER“ /> </ intent-filter> </ activity> <!-不要删除下面的元数据。 <元数据 android:name =“ flutterEmbedding” android:value =“ 2” /> </ application> </ manifest>
这是飞镖代码
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);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句