(来自慕课网的和网上资源的整合笔记)
nate老师讲课内容:
http://www.imooc.com/learn/268
smile浅笑老师讲课内容:
http://www.imooc.com/video/2269
Android获取手机中外置内存卡、内置内存卡、手机内存路径:
http://www.open-open.com/code/view/1433585940578
android的Environment类 :
http://niufc.iteye.com/blog/1562079
android 获取手机内部存储空间和外部存储空间 :
http://blog.163.com/hero_213/blog/static/39891214201162123236660/
一、WebView的概念
在 Android 手机中内置了一款高性能 webkit 内核浏览器,在 SDK 中封装为一个叫做 WebView 组件,用来显示网页。
二、WebView的使用
布局文件:
<WebView
android:id="@+id/wv_web"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/rl_title">
</WebView>
代码中调用:
(调用系统浏览器)
public static String WEBURL = "http://baidu.com";
mWebView.loadUrl(WEBURL);
加载本地资源:
mWebView.loadUrl("file:///android_asset/error.html");
不打开系统浏览器:
// 加载网页
private void loadWebView() {
mWebView.loadUrl(WEBURL);
//启用支持javascript,这个一定要设置。
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
// 设置标题
mText.setText(title);
}
});
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 在当前页面加载url
view.loadUrl(url);
return true;
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
// 加载本地文件(404 not fount)
view.loadUrl("file:///android_asset/error.html");
}
});
}
三、使用WebView下载文件
首先实现DownloadListener接口,然后创建一个下载线程:
import android.os.Environment;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* 下载线程
*/
public class HttpThrad extends Thread {
private String mUrl;
public HttpThrad(String url) {
this.mUrl = url;
}
@Override
public void run() {
try {
System.out.print("开始下载......");
URL httpUrl = new URL(mUrl);
HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
// 设置是否读写
connection.setDoInput(true);
connection.setDoOutput(true);
InputStream in = connection.getInputStream();
FileOutputStream out;
File downloadFile;
File file;
// 检查SD卡是否挂载
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
// SD卡目录
downloadFile = Environment.getExternalStorageDirectory();
// 设置存储目录和文件名称
file = new File(downloadFile, "Text.apk");
out = new FileOutputStream(file);
} else {
// 获取手机内置存储暂且写为这种方式
downloadFile = Environment.getDataDirectory();
file = new File(downloadFile, "Text.apk");
out = new FileOutputStream(file);
}
byte[] b = new byte[2 * 1024];
int len;
while ((len=in.read()) != -1) {
if (out != null) {
out.write(b, 0 , len);
}
}
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
System.out.print("下载完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
然后在Activity中调用:
// 下载文件
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
if (url.endsWith(".apk")) {
// 自身下载
new HttpThrad(url).start();
// // 调用手机浏览器下载
// Uri uri = Uri.parse(url);
// Intent intent = new Intent(Intent.ACTION_VIEW, uri);
// startActivity(intent);
}
}
这里用了两种方式,一种是自身下载,一种是调用系统浏览器。
完整Activity代码:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.webkit.DownloadListener;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, DownloadListener {
private WebView mWebView;
private Button mBtnBack, mBtnRefresh;
private TextView mText;
public static String WEBURL = "http://baidu.com";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
loadWebView();
listener();
}
// 各种监听事件
private void listener() {
mBtnBack.setOnClickListener(this);
mBtnRefresh.setOnClickListener(this);
mWebView.setDownloadListener(this);
}
// 加载网页
private void loadWebView() {
mWebView.loadUrl(WEBURL);
//启用支持javascript,这个一定要设置。
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
// 设置标题
mText.setText(title);
}
});
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 在当前页面加载url
view.loadUrl(url);
return true;
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
// 加载本地文件
view.loadUrl("file:///android_asset/error.html");
}
});
}
// 初始化View
private void initViews() {
mWebView = (WebView) findViewById(R.id.wv_web);
mBtnBack = (Button) findViewById(R.id.btn_back);
mBtnRefresh = (Button) findViewById(R.id.btn_refresh);
mText = (TextView) findViewById(R.id.tv_text);
}
// 点击按钮
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_back:
// 回退:需要点两下才能返回
mWebView.goBack();
break;
case R.id.btn_refresh:
// 刷新
mWebView.reload();
break;
}
}
// 下载文件
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
if (url.endsWith(".apk")) {
// 自身下载
new HttpThrad(url).start();
// // 调用手机浏览器下载
// Uri uri = Uri.parse(url);
// Intent intent = new Intent(Intent.ACTION_VIEW, uri);
// startActivity(intent);
}
}
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/rl_title"
android:layout_width="match_parent"
android:layout_height="70dp">
<Button
android:id="@+id/btn_back"
android:layout_width="wrap_content"
android:layout_height="45dp"
android:layout_alignParentLeft="true"
android:layout_margin="10dp"
android:text="返回" />
<TextView
android:id="@+id/tv_text"
android:layout_width="130dp"
android:layout_height="40dp"
android:layout_centerInParent="true"
android:layout_margin="10dp"
android:text="题目"
android:textSize="15sp" />
<Button
android:id="@+id/btn_refresh"
android:layout_width="wrap_content"
android:layout_height="45dp"
android:layout_alignParentRight="true"
android:layout_margin="10dp"
android:text="刷新" />
</RelativeLayout>
<WebView
android:id="@+id/wv_web"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/rl_title">
</WebView>
</RelativeLayout>
更多:解决与Cookie的同步;解决JS混淆调用问题 ;解决远程注入问题 ;自定义协议拦截(因为自学还未出山,这些本人内容难以掌握)
参考nate讲课内容:
http://www.imooc.com/learn/268