flutter_inappwebview icon indicating copy to clipboard operation
flutter_inappwebview copied to clipboard

inappwebview shutdown trying to access files on device only on android

Open wanoghoco opened this issue 3 years ago • 4 comments

  • [x] I have read the Getting Started section
  • [x] I have already searched for the same problem

Environment

Technology Version
Flutter version 3.3.7
Plugin version 5.7.1
Android version 12 and 7.0

Device information:

Description

Expected behavior:

Current behavior:

Steps to reproduce

  1. This
  2. Than that
  3. Then

Images

Stacktrace/Logcat

wanoghoco avatar Nov 15 '22 07:11 wanoghoco

đź‘‹ @wanoghoco

NOTE: This comment is auto-generated.

Are you sure you have already searched for the same problem?

Some people open new issues but they didn't search for something similar or for the same issue. Please, search for it using the GitHub issue search box or on the official inappwebview.dev website, or, also, using Google, StackOverflow, etc. before posting a new one. You may already find an answer to your problem!

If this is really a new issue, then thank you for raising it. I will investigate it and get back to you as soon as possible. Please, make sure you have given me as much context as possible! Also, if you didn't already, post a code example that can replicate this issue.

In the meantime, you can already search for some possible solutions online! Because this plugin uses native WebView, you can search online for the same issue adding android WebView [MY ERROR HERE] or ios WKWebView [MY ERROR HERE] keywords.

Following these steps can save you, me, and other people a lot of time, thanks!

github-actions[bot] avatar Nov 15 '22 07:11 github-actions[bot]

I had the same problem and solved it

in manifest add

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

and before activity tag add

 <provider
  android:name="com.pichillilorenzo.flutter_inappwebview.InAppWebViewFileProvider"
  android:authorities="${applicationId}.flutter_inappwebview.fileprovider"
  android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths" />
</provider>

add inside application tag

android:requestLegacyExternalStorage="true"

finally in the widget add

InAppWebView(
  androidOnPermissionRequest: (_, __, resources) async {
    return PermissionRequestResponse(
      resources: resources,
      action: PermissionRequestResponseAction.GRANT,
    );
  },
  ...

remove the app and then

flutter clean
flutter pub get
flutter run

edex96 avatar Nov 18 '22 08:11 edex96

I had the same problem and solved it

in manifest add

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

and before activity tag add

 <provider
  android:name="com.pichillilorenzo.flutter_inappwebview.InAppWebViewFileProvider"
  android:authorities="${applicationId}.flutter_inappwebview.fileprovider"
  android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths" />
</provider>

add inside application tag

android:requestLegacyExternalStorage="true"

finally in the widget add

InAppWebView(
  androidOnPermissionRequest: (_, __, resources) async {
    return PermissionRequestResponse(
      resources: resources,
      action: PermissionRequestResponseAction.GRANT,
    );
  },
  ...

remove the app and then

flutter clean
flutter pub get
flutter run

You saved my day, thanks.

aabughazaleh avatar Nov 20 '22 09:11 aabughazaleh

Update on this ticket : Using the latest version 6.0.0, I have now to remove this patch in the manifest to have it working again.

paulVulog avatar May 22 '24 09:05 paulVulog

Hi everyone,

I'm experiencing a similar issue using flutter_inappwebview version 6.1.4. Below is my manifest configuration:

In /android/app/src/profile/AndroidManifest.xml

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

In /android/app/src/main/AndroidManifest.xml

<application
    android:usesCleartextTraffic="true"
    android:requestLegacyExternalStorage="true">
    <provider
        android:name="com.pichillilorenzo.flutter_inappwebview_android.InAppWebViewFileProvider"
        android:authorities="${applicationId}.flutter_inappwebview_android.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>
</application>

In /android/app/src/main/res/xml/provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="." />
    <external-files-path name="images" path="Pictures/" />
</paths>

In /android/app/src/main/res/xml/file_paths.xml

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="images" path="Pictures/" />
</paths>

Everything works as expected on newer Android versions (e.g., Android 14), but on another device with Android 11 I am unable to upload images—whether from the gallery or directly from the camera, I can select them from the gallery or take a photo but after validation I go nothing left (no file name) in the file field. (The permission requests work fine) and for Android 11 I get both permission windows, one for file access and one for the phone's camera.

  Future<void> requestPermissions() async {
    Map<Permission, PermissionStatus> statuses = await [
      Permission.camera,
      Permission.storage,
    ].request();

    if (statuses[Permission.camera] != PermissionStatus.granted ||
        statuses[Permission.storage] != PermissionStatus.granted) {
      throw Exception('Permissions not granted');
    }
  }

  // Calling this function before using InAppWebView
  await requestPermissions();

Any help or suggestions to resolve this issue would be greatly appreciated.

Thanks in advance!

didiramzi avatar Feb 08 '25 20:02 didiramzi