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

Omk*_*ala 5 permissions flutter

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

这是 androidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    包=“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="编辑显示"
        android:icon="@mipmap/ic_launcher">
        <活动
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:主题=“@style/LaunchTheme”
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|密度|uiMode"
            机器人:硬件加速=“真”
            android:windowSoftInputMode="调整调整大小">
            <!-- 指定一个 Android 主题,一旦
                 Android 进程已启动。该主题对用户可见
                 Flutter UI 初始化时。之后这个主题继续
                 确定 Flutter UI 后面的窗口背景。-->
            <元数据
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <!-- 显示继续显示启动屏幕的 Android 视图
                 可绘制,直到 Flutter 绘制其第一帧,然后是这个splash
                 屏幕淡出。启动画面有助于避免任何视觉效果
                 Android 启动屏幕末尾与绘制之间的间隙
                 Flutter 的第一帧。-->
            <元数据
              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"/>
            </意图过滤器>
        </活动>
        <!-- 不要删除下面的元数据。
             Flutter工具使用它来生成GeneratePluginRegistrant.java -->
        <元数据
            android:name="flutterEmbedding"
            安卓:值=“2”/>
    </应用程序>
</清单>

这是飞镖代码

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

Ale*_*lex 1

我很确定我已经解决了这个问题:/sf/answers/4496515131/

我用几种不同的方法解决了这个问题:

  1. 将 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
Run Code Online (Sandbox Code Playgroud)
  1. 将 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
}
Run Code Online (Sandbox Code Playgroud)
  1. 您还可以尝试在终端中运行主通道:
flutter channel master
Run Code Online (Sandbox Code Playgroud)
  1. 我还通过导航到 SDK 管理器 -> SDK 工具 -> 检查和下载 Google Play 服务,将 android 迁移到了 Android Studio 中的 AndroidX

  2. 我还确保编译SDK和目标SDK是29;目前,SDK 30 的permission_handler 包存在问题。

  3. 我还编辑了 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);
    }
}
Run Code Online (Sandbox Code Playgroud)