Warm tip: This article is reproduced from serverfault.com, please click

其他-Flutter应用程序不会在发布模式下请求存储许可

(其他 - Flutter app wont ask for Storage permission in release mode)

发布于 2020-06-27 05:57:02

我正在使用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,
              ),
            )
          );
  }

}
Questioner
Omkar Tralsawala
Viewed
11
Alex 2020-10-07 10:04:55

我很确定我已经解决了这个问题:https : //stackoverflow.com/a/64235930/2025941

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

  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
  1. 在应用程序级别build.gradle中将proguard添加到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
}
  1. 你也可以尝试在终端中运行主频道:
flutter channel master
  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);
    }
}