【问题标题】:Run time permission for WRITE_External_STORAGE when Downloading a file from application.?从应用程序下载文件时 WRITE_External_STORAGE 的运行时权限。?
【发布时间】:2017-09-20 09:54:03
【问题描述】:

当我从我的应用程序下载文件时,任何人都可以帮助我询问WRITE_External_STORAGE 的运行时权限吗?在 android 中使用我的Webview,它显示我的网站我有 PDF 文件,所以我需要运行时权限才能允许在我的应用程序中进行存储访问..

这是我的示例代码:

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);
    myWebView.loadUrl("https://learntatatrusts.org/");
    myWebView.setWebViewClient(new WebViewClient());
    myWebView.setDownloadListener(new DownloadListener() {

        public void onDownloadStart(String url, String userAgent, String 
        contentDisposition, String mimetype, long contentLength) {


            DownloadManager.Request request = new 
            DownloadManager.Request(Uri.parse(url));

            CookieManager cookieManager = CookieManager.getInstance();
            String cookie = 
            cookieManager.getCookie("https://learntatatrusts.org/");
            request.addRequestHeader("Cookie", cookie);
            request.allowScanningByMediaScanner();
            Environment.getExternalStorageDirectory();
            getApplicationContext().getFilesDir().getPath(); //which returns 
            the internal app files directory path

            request.setNotificationVisibility(DownloadManager.Request.
            VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            request.setDestinationInExternalPublicDir(Environment.
            DIRECTORY_DOWNLOADS, "download");
            DownloadManager dm = (DownloadManager) 
            getSystemService(DOWNLOAD_SERVICE);
            dm.enqueue(request);
        }

        });
    }

    @Override
    public void onBackPressed() {
        if (myWebView.canGoBack()) {
            myWebView.goBack();
        } else {
            super.onBackPressed();
        }
    }
}

【问题讨论】:

    标签: android webview android-permissions


    【解决方案1】:

    首先将此行添加到您的清单文件中

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

    检查创建权限是否已授予,如果已授予,则只需加载您的网址,如果没有,则请求权限。

    public class MainActivity extends AppCompatActivity {
        private WebView myWebView;
    
     // Function for check permission already granted or not 
        public static boolean hasPermissions(Context context, String... permissions) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
                for (String permission : permissions) {
                    if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                        return false;
                    }
                }
            }
            return true;
        }
    
        @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);
    
     //  Permission check
            if (!hasPermissions(context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE})) {
            // Permission ask
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 111);
            } else {
    // if permission is already granted than load url
                loadUrl();
            }
    
        }
    
        @Override
        public void onBackPressed() {
            if (myWebView.canGoBack()) {
                myWebView.goBack();
            } else {
                super.onBackPressed();
            }
        }
    
        public void loadUrl() {
            myWebView.loadUrl("https://learntatatrusts.org/");
            myWebView.setWebViewClient(new WebViewClient());
            myWebView.setDownloadListener(new DownloadListener() {
    
                public void onDownloadStart(String url, String userAgent, String
                        contentDisposition, String mimetype, long contentLength) {
    
    
                    DownloadManager.Request request = new
                            DownloadManager.Request(Uri.parse(url));
    
                    CookieManager cookieManager = CookieManager.getInstance();
                    String cookie =
                            cookieManager.getCookie("https://learntatatrusts.org/");
                    request.addRequestHeader("Cookie", cookie);
                    request.allowScanningByMediaScanner();
                    Environment.getExternalStorageDirectory();
                    getApplicationContext().getFilesDir().getPath(); //which returns the internal app files directory path
    
                    request.setNotificationVisibility(DownloadManager.Request.
                            VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                    request.setDestinationInExternalPublicDir(Environment.
                            DIRECTORY_DOWNLOADS, "download");
                    DownloadManager dm = (DownloadManager)
                            getSystemService(DOWNLOAD_SERVICE);
                    dm.enqueue(request);
                }
    
            });
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    
            if (requestCode == 111) {
                if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    loadUrl();
                }
            }
        }
    
    }
    

    【讨论】:

    • 嘿,谢谢你的帮助,但是如果 (!hasPermissions(context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}))),我在这个地方的上下文中得到了红色标记
    • 请帮我解决这个问题。?
    • 嘿,代码运行良好,感谢您的帮助..!!
    • 红标解决了吗??如果不是阅读这些评论stackoverflow.com/questions/45940023/password-text-field/…
    • 是的,我已经解决了所有的问题,感谢你的帮助..!!
    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 2020-06-11
    • 2013-04-09
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    相关资源
    最近更新 更多