gpt4 book ai didi

Flutter 应用程序不会在 Release模式下请求存储权限

转载 作者:行者123 更新时间:2023-12-04 13:35:06 27 4
gpt4 key购买 nike

我正在使用permission_handler 包来请求我的应用程序中存储的读取权限,在 Debug模式下一切正常,当我使用“flutter run --release”运行我的代码时,但是当我将代码导出为 apk 时出现问题没有出现权限对话框。
我不知道我在这里做错了什么,请帮帮我!!
这是 androidManifest.xml

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

here is the dart code

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
我用几种不同的方法解决了它:

  • 将 proguard-rules.pro 添加到 android/app/proguard-rules.pro
  • #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
  • 将 proguard 添加到应用级别 build.gradle 中的 buildTypes
  • 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
    }
  • 您也可以尝试在终端中运行主 channel :
  • flutter channel master
  • 我还通过导航到 SDK 管理器-> SDK 工具-> 检查和下载 Google Play 服务,在 Android Studio 中将 android 迁移到 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 应用程序不会在 Release模式下请求存储权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62606486/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com