【问题标题】:Flutter image-picker explicitly ask permissionFlutter 图像选择器明确请求许可
【发布时间】:2021-10-30 23:29:07
【问题描述】:

Imagepicker 包说

无需配置 - 插件应该开箱即用。

不再需要添加 android:requestLegacyExternalStorage="true" 作为属性 AndroidManifest.xml 中的标签,因为 image_picker 已经 更新以使用范围存储。

从图库中读取图像。 所以我想我需要征求用户的一些许可,因为 Playstore 也这么说 新包只是工作,不要求任何许可。 我需要明确询问哪些权限 而且我不想将其保存在任何外部目录中,我只想将图像上传到 Firebase 存储 编辑:图像选择器没有向用户征求任何许可,这是错误的

【问题讨论】:

    标签: android flutter


    【解决方案1】:

    在android中读写文件所需的权限是。
    需要将这些权限添加到您的 AndroidManifest.xml 中

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    

    在你的场景中,你不需要做任何事情,因为这已经由库处理了
    https://pub.dev/packages/image_picker

    上述库不会将图像保存在外部存储中。

    注意:使用相机拍摄的图像和视频会保存到您的 应用程序的本地缓存,因此应该只 暂时左右。如果您需要存储您选择的图像 永久,您有责任将其移至更永久的 位置。

    更多信息可以参考这个链接
    https://guides.codepath.com/android/Accessing-the-Camera-and-Stored-Media#accessing-stored-media

    更新:image_picker for Android 内部如何处理图像拾取

    对于图库 使用 ACTION_GET_CONTENT(about action get content) 选择它在内置文件选择器意图中打开

    使用ACTION_GET_CONTENT 打开文件时 - 因为用户参与选择您的应用可以访问的文件或目录,所以这种机制不需要任何系统权限。你可以阅读更多关于when permission is needed and when not in google docs

    Intent pickImageIntent = new Intent(Intent.ACTION_GET_CONTENT);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
      pickImageIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
    }
    pickImageIntent.setType("image/*");
    
    activity.startActivityForResult(pickImageIntent, REQUEST_CODE_CHOOSE_MULTI_IMAGE_FROM_GALLERY);
    

    并将结果 URI 复制到缓存目录中的临时文件中并返回路径

         String extension = getImageExtension(context, uri);
          inputStream = context.getContentResolver().openInputStream(uri);
          file = File.createTempFile("image_picker", extension, context.getCacheDir());
          file.deleteOnExit();
          outputStream = new FileOutputStream(file);
          if (inputStream != null) {
            copy(inputStream, outputStream);
            success = true;
          }
     
    

    For Camera库向用户请求相机权限android.permission.CAMERA,并将相机图像保存在应用缓存目录中。

    private void handleCaptureImageResult(int resultCode) {
        if (resultCode == Activity.RESULT_OK) {
          fileUriResolver.getFullImagePath(
              pendingCameraMediaUri != null
                  ? pendingCameraMediaUri
                  : Uri.parse(cache.retrievePendingCameraMediaUriPath()),
              new OnPathReadyListener() {
                @Override
                public void onPathReady(String path) {
                  handleImageResult(path, true);
                }
              });
          return;
        }
    
        // User cancelled taking a picture.
        finishWithSuccess(null);
      }
    

    此代码与其 github 页面上存在的版本 image_picker: ^0.8.4+4 代码一致 - image picker code

    【讨论】:

    • 但在我的情况下,图像选择器没有向用户请求任何权限,这是对 Playstore 的策略威胁
    • @Noobdeveloper ,不,这不是对 playstore 政策的威胁,因为在 image_picker 的最新更新中,使用 'Intent pickVideoIntent = new Intent(Intent.ACTION_GET_CONTENT);' 打开内置设备库意图并从结果内容 uri 创建了一个临时文件和路径,并向我们返回图像路径。这方面的代码在他们的 github 页面上 - imagePickerCode
    • 所以这意味着我不需要清单中的任何内容
    • 不,manifest 中没有任何关系
    • 当使用ACTION_GET_CONTENT打开文件时 - 因为用户参与选择您的应用可以访问的文件或目录,所以这种机制不需要任何系统权限..您也可以参考这个答案 - read permission ever required to read uri from intent action
    【解决方案2】:

    您必须将上述权限添加到您的 AndroidManifest.xml 文件中。这仍然是访问用户存储所必需的。

    【讨论】:

    • 添加这两个权限后。尽管如此,我的应用程序并没有在运行时请求许可。甚至我签入了我的应用权限设置它说被拒绝并且我的应用运行良好
    猜你喜欢
    • 2023-01-25
    • 2020-07-10
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2018-08-27
    • 2021-02-11
    • 2020-04-15
    相关资源
    最近更新 更多