2017-07-03 149 views
0

我已经添加了下载管理器,但它没有触发下载事件,可以任何身体帮助。当用户转到webview下载选项并点击链接下载文件时,什么都不会发生。我已经通过了很多帖子在stackoverflow但没有为我工作。Android Webview不触发href下载文件

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) 

回答

1

最后在搜索批次并阅读here关于Marshmallow API 23> =的许可后,我们需要在运行时授予许可。我解决我的问题与此代码,

onCreate方法在MainActivity

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"); 
    } 


} 
-1

你能显示一行在我得到这个下面的错误HTML(从你那里下载链接) ,如:

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

或者你用js来触发它?

因为如果你愿意,你可以使用这样的:点击链接(而不是导航到 文件)时

下载文件:

<a href="/images/myw3schoolsimage.jpg" download>

see this link for more info

UPDATE

添加到您的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" /> 
-1

在mainfest文件中添加以下两行

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

我已经在清单中添加了这两行,那么太ti显示同样的错误 –

+0

在哪个操作系统版本上运行?如果它是Api级别23或以上,你需要实现Android运行时权限模型 –

+0

雅使用API​​ 23,如何实现Android运行时权限 –