Search code examples
androidandroid-permissions

Write Permission in android Webview


Can anyone help me in asking run time permission for WRITE_EXTERNAL_STORAGE when downloading a file from my application? Using myWebview in android which displays my website that I have PDF files in that, so I require run-time permission to allow storage access in my app.

Here is my sample code:

public class MainActivity extends AppCompatActivity {

    private WebView mywebView;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mywebView = (WebView) findViewById(R.id.webview);
        WebSettings webSettings= mywebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDomStorageEnabled(true);
        mywebView.getSettings().setLoadWithOverviewMode(true);
        mywebView.getSettings().setUseWideViewPort(true);
        mywebView.getSettings().setBuiltInZoomControls(true);
        mywebView.getSettings().setPluginState(WebSettings.PluginState.ON);
        mywebView.setWebChromeClient(new WebChromeClient());
        mywebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        mywebView.loadUrl("https://moh.org.in/");// Line of Code for opening links in app
        mywebView.setWebViewClient(new WebViewClient());
        getSupportActionBar().hide();
        mywebView.setDownloadListener(new DownloadListener() {
            @Override
            public void onDownloadStart(String url, String userAgent, String contentDisposition, 
            String mimeType, long contentLength) {
                DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));

                request.setMimeType(mimeType);
                //------------------------COOKIE!!------------------------
                String cookies = CookieManager.getInstance().getCookie(url);
                request.addRequestHeader("cookie", cookies);
                //------------------------COOKIE!!------------------------
                request.addRequestHeader("User-Agent", userAgent);
                request.setDescription("Downloading file...");
                request.setTitle(URLUtil.guessFileName(url, contentDisposition, mimeType));
                request.allowScanningByMediaScanner();
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                String fileName = URLUtil.guessFileName(url, contentDisposition, mimeType);
                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
                DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                dm.enqueue(request);
                Toast.makeText(getApplicationContext(), "Downloading File", Toast.LENGTH_LONG).show();
            }
        });
    }


    //Code For Back Button
    @Override
    public void onBackPressed() {
        if(mywebView.canGoBack()) {
            mywebView.goBack();
        } else {
            super.onBackPressed();
        }
    }
}

Solution

  • Solution

    Step 1. Add permissions into your AndroidManifest.xml

    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.kotlinapp">
    
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:requestLegacyExternalStorage="true" 
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

    Step 2. Write code logic inside MainActivity

    • If the permission is not granted, show permission dialog, if users allow the permission, then download the file.

    • If the permission is granted, then download the file

    MainActivity.java

    public class MainActivity extends AppCompatActivity {
    
        private static final int WRITE_EXTERNAL_STORAGE_RC = 100;
    
        private WebView mywebView;
        private String url, userAgent, contentDisposition, mimeType;
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mywebView = (WebView) findViewById(R.id.webview);
            WebSettings webSettings = mywebView.getSettings();
            webSettings.setJavaScriptEnabled(true);
            webSettings.setDomStorageEnabled(true);
            mywebView.getSettings().setLoadWithOverviewMode(true);
            mywebView.getSettings().setUseWideViewPort(true);
            mywebView.getSettings().setBuiltInZoomControls(true);
            mywebView.getSettings().setPluginState(WebSettings.PluginState.ON);
            mywebView.setWebChromeClient(new WebChromeClient());
            mywebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
            mywebView.loadUrl("https://moh.org.in/");// Line of Code for opening links in app
            mywebView.setWebViewClient(new WebViewClient());
            getSupportActionBar().hide();
            mywebView.setDownloadListener(new DownloadListener() {
                @Override
                public void onDownloadStart(String url, String userAgent, String contentDisposition,
                                            String mimeType, long contentLength) {
                    MainActivity.this.url = url;
                    MainActivity.this.userAgent = userAgent;
                    MainActivity.this.contentDisposition = contentDisposition;
                    MainActivity.this.mimeType = mimeType;
    
                    String permission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
                    if (ActivityCompat.checkSelfPermission(MainActivity.this, permission)
                            != PackageManager.PERMISSION_GRANTED) {
                        ActivityCompat.requestPermissions(MainActivity.this,
                                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                                WRITE_EXTERNAL_STORAGE_RC);
                    } else {
                        downloadFile();
                    }
                }
            });
        }
    
        private void downloadFile() {
            DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
    
            request.setMimeType(mimeType);
            //------------------------COOKIE!!------------------------
            String cookies = CookieManager.getInstance().getCookie(url);
            request.addRequestHeader("cookie", cookies);
            //------------------------COOKIE!!------------------------
            request.addRequestHeader("User-Agent", userAgent);
            request.setDescription("Downloading file...");
            request.setTitle(URLUtil.guessFileName(url, contentDisposition, mimeType));
            request.allowScanningByMediaScanner();
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            String fileName = URLUtil.guessFileName(url, contentDisposition, mimeType);
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
            DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
            dm.enqueue(request);
    
            Toast.makeText(getApplicationContext(), "Downloading File", Toast.LENGTH_LONG).show();
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                               @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == WRITE_EXTERNAL_STORAGE_RC) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    downloadFile();
                }
            }
        }
    
        //Code For Back Button
        @Override
        public void onBackPressed() {
            if (mywebView.canGoBack()) {
                mywebView.goBack();
            } else {
                super.onBackPressed();
            }
        }
    }