Android-下载侦听器或异步任务
我试图从网页上下载一些文件,通过点击网址,webview处理下载,而不是浏览器 如果我使用DownloadListener,它可以完美地解决一个问题,我看不到progressbar 如果我使用AsyncTask,我必须将url放在代码中才能下载它,我只需单击url并开始下载 我的问题是,如何让AsyncTask从web下载任何url而不必坐在 执行(“要下载的文件的url”) 或者如何为DownloadListener创建progressbarAndroid-下载侦听器或异步任务,android,webview,android-asynctask,Android,Webview,Android Asynctask,我试图从网页上下载一些文件,通过点击网址,webview处理下载,而不是浏览器 如果我使用DownloadListener,它可以完美地解决一个问题,我看不到progressbar 如果我使用AsyncTask,我必须将url放在代码中才能下载它,我只需单击url并开始下载 我的问题是,如何让AsyncTask从web下载任何url而不必坐在 执行(“要下载的文件的url”) 或者如何为DownloadListener创建progressbar @覆盖 创建时的公共void(Bundle sa
@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webview=(webview)findviewbyd(R.id.webview);
myProgressBar=(ProgressBar)findViewById(R.id.ProgressBar_水平);
新线程(myThread.start();
setWebViewClient(新的HelloWebViewClient());
webview.getSettings().setJavaScriptEnabled(true);
webview.setInitialScale(50);
webview.getSettings().setUseWideViewPort(true);
webview.setVerticalScrollBarEnabled(false);
webview.setHorizontalScrollBarEnabled(false);
webview.loadUrl(“http://localhost/index.php");
setWebViewClient(新下载的WebViewClient());
setDownloadListener(新的DownloadListener(){
@凌驾
public void onDownloadStart(字符串url、字符串userAgent、,
字符串contentDisposition,字符串mimetype,
长(长){
输入流为;
试一试{
URL u=新的URL(URL);
HttpURLConnection con=(HttpURLConnection)u.openConnection();
con.setRequestMethod(“GET”);
con.设置输出(真);
con.connect();
is=con.getInputStream();
//下载APK的路径和文件
String path=Environment.getExternalStorageDirectory()+“/apdroid/”;
字符串文件名=url.substring(url.lastIndexOf('/')+1);
文件目录=新文件(路径);
dir.mkdirs();//如果不存在,则创建下载目录
文件输出文件=新文件(目录,文件名);
FileOutputStream fos=新的FileOutputStream(outputFile);
//将文件从URL保存到外部存储器上的下载目录
字节[]缓冲区=新字节[1024];
int len=0;
而((len=is.read(buffer))!=-1){
fos.写入(缓冲区,0,len);
}
fos.close();
is.close();
意向意向=新意向(意向.行动\视图);
String name=Environment.getExternalStorageDirectory()+“/apdroid/”+url.substring(url.lastIndexOf(“/”)+1);
setDataAndType(Uri.fromFile(新文件(名称)),“application/vnd.android.package archive”);
星触觉(意向);
}捕获(IOE异常){
e、 printStackTrace();
}
}
});
}
受保护的void安装(字符串文件名){
//TODO自动生成的方法存根
}
private Runnable myThread=new Runnable(){
@凌驾
公开募捐{
而(我的进度<100){
试一试{
myHandle.sendMessage(myHandle.obtainMessage());
睡眠(1000);
}捕获(可丢弃的t){
}
}
}
Handler myHandle=新处理程序(){
@凌驾
公共无效handleMessage(消息消息消息){
myProgress++;
myProgressBar.setProgress(myProgress);
}
};
};
私有类HelloWebViewClient扩展了WebViewClient{
@凌驾
public void onReceivedError(WebView视图、int错误代码、字符串描述、字符串失败URL){
请尝试{view.stopLoading();}捕获(异常e){}
尝试{view.clearView();}catch(异常e){}
view.loadUrl(“file:///android_asset/wifi.html");
}
}
当我从我的页面下载任何文件时,我只想要ProgressBar
我不能使用asyncTask,因为我必须将文件放在代码中,而不是通过单击它们您可能应该
覆盖URL加载
过程,并通过某种方式识别是否加载了您想要下载其资源的URL。一旦检测到此问题,请停止加载页面并使用此URL启动AsyncTask。很难从问题中提取您的需求…?如果我不够清楚,请原谅
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webview = (WebView) findViewById(R.id.webview);
myProgressBar = (ProgressBar) findViewById(R.id.progressbar_Horizontal);
new Thread(myThread).start();
webview.setWebViewClient(new HelloWebViewClient());
webview.getSettings().setJavaScriptEnabled(true);
webview.setInitialScale(50);
webview.getSettings().setUseWideViewPort(true);
webview.setVerticalScrollBarEnabled(false);
webview.setHorizontalScrollBarEnabled(false);
webview.loadUrl("http://localhost/index.php");
webview.setWebViewClient(new DownloadWebViewClient());
webview.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(String url, String userAgent,
String contentDisposition, String mimetype,
long contentLength) {
InputStream is;
try {
URL u = new URL(url);
HttpURLConnection con = (HttpURLConnection) u.openConnection();
con.setRequestMethod("GET");
con.setDoOutput(true);
con.connect();
is = con.getInputStream();
// Path and File where to download the APK
String path = Environment.getExternalStorageDirectory() + "/apdroid/";
String fileName = url.substring(url.lastIndexOf('/') + 1);
File dir = new File(path);
dir.mkdirs(); // creates the download directory if not exist
File outputFile = new File(dir, fileName);
FileOutputStream fos = new FileOutputStream(outputFile);
// Save file from URL to download directory on external storage
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fos.close();
is.close();
Intent intent = new Intent(Intent.ACTION_VIEW);
String name = Environment.getExternalStorageDirectory() + "/apdroid/" + url.substring(url.lastIndexOf('/') + 1);
intent.setDataAndType(Uri.fromFile(new File(name)), "application/vnd.android.package-archive");
startActivity(intent);
}catch (IOException e) {
e.printStackTrace();
}
}
});
}
protected void install(String fileName) {
// TODO Auto-generated method stub
}
private Runnable myThread = new Runnable() {
@Override
public void run() {
while (myProgress < 100) {
try {
myHandle.sendMessage(myHandle.obtainMessage());
Thread.sleep(1000);
} catch (Throwable t) {
}
}
}
Handler myHandle = new Handler() {
@Override
public void handleMessage(Message msg) {
myProgress++;
myProgressBar.setProgress(myProgress);
}
};
};
private class HelloWebViewClient extends WebViewClient {
@Override
public void onReceivedError(WebView view,int errorCode,String description,String failingUrl) {
try {view.stopLoading();} catch(Exception e){}
try {view.clearView();} catch(Exception e){}
view.loadUrl("file:///android_asset/wifi.html");
}
}