我正在使用permission_handler包请求对应用程序中存储的读取权限,在调试模式下一切工作正常,当我以“flutter run-release”运行代码时,问题就出现了,但当我将代码导出为apk时,权限对话框不会出现。我不知道我做错了什么请帮帮我!!
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.edithautotech.edithdisplayrelease"> <!-- io.flutter.app.FlutterApplication is an android.app.Application that calls FlutterMain.startInitialization(this); in its onCreate method. In most cases you can leave this as-is, but you if you want to provide additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> <!-- Permissions options for the 'storage' group--> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="com.android.vending.BILLING" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <application 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|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> <!-- Specifies an Android theme to apply to this Activity as soon as the Android process has started. This theme is visible to the user while the Flutter UI initializes. After that, this theme continues to determine the Window background behind the Flutter UI. --> <meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" /> <!-- Displays an Android View that continues showing the launch screen Drawable until Flutter paints its first frame, then this splash screen fades out. A splash screen is useful to avoid any visual gap between the end of Android's launch screen and the painting of Flutter's first frame. --> <meta-data 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> <!-- Don't delete the meta-data below. This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> <meta-data 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是29;目前SDK30中的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);
}
}
我有Android Studio与Flutter插件安装。Flutter SDK也通过Android Studio安装在我的Mac上,我知道它的路径。 我想这是因为我已经安装了Flutter SDK从Android Studio和我应该更新一些pathes。那么使用Xcode在发布模式下构建flutter应用程序的步骤是什么呢?
我有一个应用程序,现在我要发布它。我已经创建了一个apk文件,并且安装了它,但是当我向服务器发送登录请求时,它返回NULL。 奇怪的是,当我用调试构建启动应用程序时,它工作得很好。该问题仅发生在释放模式。所以看了这篇文章后我认为问题出在proguard 这是我目前所做的。 null 这是我的proguard-rules.pro文件。
默认情况下,Android Pie会要求应用程序使用HTTPS连接而不是HTTP。因此无法在HTTP中命中restful API
我需要捕获设备的IMEI和IMSI以及您已经知道的信息,这需要一个权限。当这个对话框窗口向用户请求这个权限时,我的应用程序被停止了。怎么解决? 更新2(AndroidManifest.xml文件):
要修补三星和wiko设备上的一些崩溃,我必须在发布模式下在设备上运行我的应用程序。但我想看到。 我该怎么办?
我正在使用jQuery mobile和Spring MVC开发一个包含多页模板的移动应用程序。我有一个包含锚链接的jsp;每当我单击链接时,就会调用事件并执行jQuery函数。我从函数中的链接获得了一个id,并将其存储在jQuery变量中。现在我想重用jstltag中jQuery变量的值,该值在核心标记库中可用。如何使用该值?这是我的jsp: