Flutter应用程序不会在发布模式下请求存储许可 [英] Flutter app wont ask for Storage permission in release mode

查看:93
本文介绍了Flutter应用程序不会在发布模式下请求存储许可的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用permission_handler软件包来请求读取许可以存储在我的应用程序中,并且在调试模式下一切正常,并且当我使用"flutter run --release"运行代码时,但是当我将我的代码导出为apk时,出现了问题,权限对话框没有出现. 我不知道我在做什么错,请帮帮我!

I'm using permission_handler package to ask for read permissions for storage in my app everything is working fine in debug mode and when i run my code with "flutter run --release" but the problem arises when i export my code as an apk the permissions dialog doesn't appear. i have no idea what I'm doing wrong here please help me out!!

这是androidManifest.xml

here is the 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>

这是飞镖代码

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

I'm pretty sure I figured out this problem: https://stackoverflow.com/a/64235930/2025941

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

I solved it with a couple different ways:

  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

  1. I also migrated android to AndroidX in Android Studio by navigating to SDK manager->SDK tools->checking and downloading Google Play services

我还确保编译SDK和目标SDK为29;目前,SDK 30的permission_handler软件包存在问题.

I also made sure that compile SDK and target SDK is 29; there are issues with permission_handler package with SDK 30 at the moment.

我还编辑了kotlin主要活动文件:

I also edited the kotlin main activity file:

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应用程序不会在发布模式下请求存储许可的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆