【问题标题】:Android Webview not triggering a href download fileAndroid Webview 未触发 href 下载文件
【发布时间】:2017-07-08 17:01:42
【问题描述】:

我已经添加了下载管理器,但它没有触发下载事件,任何人都可以帮忙。当用户转到 webview 下载选项并单击链接以下载文件时,没有任何反应。我已经浏览了 stackoverflow 中的许多帖子,但对我没有任何帮助。

 public class MainActivity extends AppCompatActivity {

    private WebView mWebView;

    // boolean thread_running = true;
    private static final String TAG = "MainActivity";
    // flag for Internet connection status
    Boolean isInternetPresent = false;

    // Connection detector class
    ConnectionDetector cd;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        mWebView = (WebView) findViewById(R.id.webView);
        mWebView.setWebViewClient(new MyAppWebViewClient(this));

        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setSupportZoom(false);
        webSettings.setDomStorageEnabled(true);


        // creating connection detector class instance
        cd = new ConnectionDetector(getApplicationContext());
        /**
         * Check Internet status button click event
         * */
        isInternetPresent = cd.isConnectingToInternet();
        // check for Internet status
        if (isInternetPresent) {
            // Internet Connection is Present
            // make HTTP requests
            mWebView.loadUrl("http://url");
        } else {
            // Internet connection is not present
            // Ask user to connect to Internet
            //showAlertDialog(MainActivity.this, "No Internet Connection",
            //"You don't have internet connection.", false);
            Toast.makeText(this, "No Internet connection, Please SwitchOn Connection", Toast.LENGTH_LONG).show();
            finish();
        }

    }

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


    public class MyAppWebViewClient extends WebViewClient {

        private Context context;

        public MyAppWebViewClient(Context context) {
            this.context = context;
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            if (!cd.isConnectingToInternet()) {

                //internet is not present
                Toast.makeText(getApplicationContext(), "Internet Stopped Working", Toast.LENGTH_SHORT).show();
                finish();
            }

            if(url.contains(".JPG")){

                DownloadManager mdDownloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
                DownloadManager.Request request = new DownloadManager.Request(
                        Uri.parse(url));
                File destinationFile = new File(Environment.getExternalStorageDirectory(),getFileName(url));
                request.setDescription("Downloading ...");
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                request.setDestinationUri(Uri.fromFile(destinationFile));
                mdDownloadManager.enqueue(request);


                return true;

            }

            view.loadUrl(url);
            return true;
        }

        public String getFileName(String url) {
            String filenameWithoutExtension = "";
            filenameWithoutExtension = String.valueOf(System.currentTimeMillis()
                    + ".jpg");
            return filenameWithoutExtension;
        }

    }
    }

有人可以帮我吗?页面加载没有问题,但 HTML 页面中图像文件的链接不起作用...

点击链接时出现以下错误

 Writing exception to parcel
                                                                java.lang.SecurityException: No permission to write to /storage/emulated/0/1499148267411.jpg: Neither user 10109 nor current process has android.permission.WRITE_EXTERNAL_STORAGE.
                                                                    at android.app.ContextImpl.enforce(ContextImpl.java:1438)
                                                                    at android.app.ContextImpl.enforceCallingOrSelfPermission(ContextImpl.java:1470)
                                                                    at com.android.providers.downloads.DownloadProvider.checkFileUriDestination(DownloadProvider.java:724)
                                                                    at com.android.providers.downloads.DownloadProvider.insert(DownloadProvider.java:558)
                                                                    at android.content.ContentProvider$Transport.insert(ContentProvider.java:263)
                                                                    at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:163)
                                                                    at android.os.Binder.execTransact(Binder.java:453)

【问题讨论】:

    标签: android android-webview


    【解决方案1】:

    最后在搜索了很多并阅读了here 关于 Marshmallow API 23 >= 中的权限之后,我们需要在运行时给予权限。我用这段代码解决了我的问题,

    MainActivity 中的 Oncreate 方法

       int permissionCheck = ActivityCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
            //requesting permission
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        } else {
            Log.i(TAG , "Permission Granted");
        }
    

    并覆盖此方法

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
            //you have the permission now.
                Log.i(TAG , "Permission Already Granted");
        }
    
    
    }
    

    【讨论】:

      【解决方案2】:

      在你的 mainfest 文件中添加这两行

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

      【讨论】:

      • 我已经在 manifest 中添加了这两行,然后也显示同样的错误
      • 在哪个操作系统版本上运行?如果是Api level 23或以上需要实现android运行时权限模型
      • 你使用API​​ 23,如何实现android运行时权限
      • 你能指导我吗,我应该在代码中的什么地方实现
      【解决方案3】:

      您能否在 html 中显示该行(您下载的链接) 喜欢:

      <a href='something'></a>
      

      还是用js触发?

      因为如果你愿意,你可以使用这个:

      例子

      点击链接时下载文件(而不是导航到 文件):

      &lt;a href="/images/myw3schoolsimage.jpg" download&gt;

      see this link for more info

      更新

      将此添加到您的 AndroidManifest.xml

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

      编辑

      <?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="********">
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
      

      【讨论】:

      • 是的,我写过类似的链接
      • 我收到此错误 java.lang.SecurityException: 没有写入 /storage/emulated/0/1499148267411.jpg 的权限:用户 10109 和当前进程都没有 android.permission.WRITE_EXTERNAL_STORAGE。在 android.app.ContextImpl.enforce(ContextImpl.java:1438) 在 android.app.ContextImpl.enforceCallingOrSelfPermission(ContextImpl.java:1470)
      猜你喜欢
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2015-07-25
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多