Android里webviewActivity一般功能实现

安卓开发新人,刚着手项目中用html实现应用的某些模块,在编写带webview的Activity时就遇到的问题不断尝试,并改进自己的webviewActivity,最后给出自己的源码,刚接触webview的童鞋可以参考其中的解决方案。
其中涉及到的问题有:

<p>webview加载页面的基本配置</p><p>使webview显示网页加载进度</p><p>webview的后退、前进、刷新、关闭的实现</p><p>Android通过webview的cookie来传键值对给html端</p><p>使webview支持文件的上传</p><p>webview中如何给JS提供接口,让JS能调用Android的方法</p><p>将JS的Alert转换为Android的AlertDialog</p><p>调用该activity来加载页面,只需要用以下片断即可</p>

<p></span></div><div><span style="font-size:24px;"></span><pre name="code" class="java"><span style="white-space:pre">			</span>intent.setClass(MainActivity_3.this, WebViewActivity.class);</p>			intent.putExtra("url", "file:///android_asset/index.html");// FIXME
			intent.putExtra("title", "测试");
			startActivity(intent);

Activity源码
public class WebViewActivity extends Activity {
	private final static int FINISH_ACTIVITY = 0;
	private final static int REQUEST_UPLOAD_FILE_CODE = 2;
	private ValueCallback<Uri> mUploadFile;
	private final String TAG = "WebViewActivity ";
	private WebView webview;
	private String url;
	private Handler handler = new MyHandler(this);

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		getWindow().requestFeature(Window.FEATURE_PROGRESS);
		setContentView(R.layout.activity_webview);
		webview = (WebView) findViewById(R.id.webView);
		url = getIntent().getStringExtra("url");
		getWindow().setFeatureInt(Window.FEATURE_PROGRESS,
				Window.PROGRESS_VISIBILITY_ON);
		//给页面的actionBar加上回退按钮
		getActionBar().setDisplayHomeAsUpEnabled(true);
		getActionBar().setBackgroundDrawable(
				getResources().getDrawable(R.color.deepgrey));
		//设置webview的settings和client
		configWebview();
		setCookie();
		// 加载 页面
		loadURL();

	}
	//给html页面传递的用户数据都放在cookie中
	private void setCookie() {
		SharedPreferences userInfoSP = MyApplication.getInstance()
				.getUserinfoSharedPreferences();
		CookieSyncManager cookieSyncManager = CookieSyncManager
				.createInstance(this);
		CookieManager cookieManager = CookieManager.getInstance();
		cookieManager.setAcceptCookie(true);
		String domain = "app.issll.com";
		Cookie cname = null;
		try {//若不用URLEncoder编码,中文在某些机型上会出现乱码
			cname = new Cookie(domain, "userName", URLEncoder.encode(
					userInfoSP.getString("name", ""), "UTF-8"));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		Cookie cplotid = new Cookie(domain, "plotId",
				UserSelectedAddress.plotid);
		Cookie cLongtitude = new Cookie(domain, "longtitude",
				String.valueOf(UserSelectedAddress.myLongitude));
		Cookie cLatitude = new Cookie(domain, "latitude",
				String.valueOf(UserSelectedAddress.myLatitude));
		Cookie cUserId = new Cookie(domain, "userId", userInfoSP.getString(
				"userid", ""));
		MyDebugUtils.d(TAG, cplotid.toString());
		MyDebugUtils.d(TAG, cUserId.toString());
		MyDebugUtils.d(TAG, cname.toString());
		cookieManager.removeAllCookie();
		cookieManager.setCookie(url, "" + cUserId);
		cookieManager.setCookie(url, "" + cname);
		cookieManager.setCookie(url, "" + cplotid);
		cookieManager.setCookie(url, "" + cLongtitude);
		cookieManager.setCookie(url, "" + cLatitude);
		cookieSyncManager.startSync();

	}

	private void setActionbarTitle() {
		String title = getIntent().getStringExtra("title");
		if (title != null)
			getActionBar().setTitle(title);
		else
			getActionBar().setTitle(R.string.app_name);
	}

	private void loadURL() {
		try {
			webview.loadUrl(url);
		} catch (Exception e) {
			MyDebugUtils.e(TAG + url, e.getLocalizedMessage());
		}
	}
	//友盟SDK的方法
	@Override
	protected void onResume() {
		MobclickAgent.onResume(this);
		super.onResume();
	}

	@Override
	protected void onPause() {
		MobclickAgent.onPause(this);
		super.onPause();
	}

	@Override
	protected void onDestroy() {
		webview.destroy();
		super.onDestroy();
	}

	@SuppressWarnings("deprecation")
	private void configWebview() {
		// 允许javascript代码执行
		WebSettings settings = webview.getSettings();
		settings.setJavaScriptEnabled(true);
		settings.setDomStorageEnabled(true);
		settings.setCacheMode(WebSettings.LOAD_DEFAULT);
		settings.setAppCacheMaxSize(8 * 1024 * 1024);
		settings.setRenderPriority(RenderPriority.HIGH);
		settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
		settings.setAppCacheEnabled(true);
		settings.setJavaScriptCanOpenWindowsAutomatically(true);
		settings.setAllowFileAccess(true);
		settings.setAllowFileAccessFromFileURLs(true);
		settings.setAllowUniversalAccessFromFileURLs(true);
		settings.setDefaultTextEncodingName("utf-8");

		// 在当前页面打开链接,而不是启动用户手机上安装的浏览器打开
		webview.setWebViewClient(new WebViewClient() {
			@Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				webview.loadUrl(url);
				return true;
			}
		});
	
		webview.setWebChromeClient(new WebChromeClient() {
			// 使webview可以更新进度条
			@Override
			public void onProgressChanged(WebView view, int newProgress) {
				WebViewActivity.this.setTitle("加载中……");
				WebViewActivity.this.setProgress(newProgress * 100);
				if (newProgress == 100)
					setActionbarTitle();
			}
			//使JS alert可以以Android的AlertDiaolog形式弹出
			@Override
			public boolean onJsAlert(WebView view, String url, String message,
					final JsResult result) {
				AlertDialog.Builder builder = new Builder(WebViewActivity.this)
						.setMessage(message).setPositiveButton("确定",
								new OnClickListener() {
									@Override
									public void onClick(DialogInterface dialog,
											int which) {
										result.confirm();
									}
								});
				builder.setCancelable(true);
				builder.show();
				return true;
			}
			//html中上传点击input type为file的控件时会调用下列方法,在Android4.4中无效,待修复
			// Android 4.1+
			@SuppressWarnings("unused")
			public void openFileChooser(ValueCallback<Uri> uploadFile,
					String acceptType, String capture) {
				openFileChooser(uploadFile);
			}

			// Android 3.0 +
			@SuppressWarnings("unused")
			public void openFileChooser(ValueCallback<Uri> uploadFile,
					String acceptType) {
				openFileChooser(uploadFile);
			}

			// Android 3.0
			public void openFileChooser(ValueCallback<Uri> uploadFile) {
				mUploadFile = uploadFile;
				startActivityForResult(createCameraIntent(),
						REQUEST_UPLOAD_FILE_CODE);

			}
		});
		// 在js中用window.injs.方法名来调用InJavaScript类中的方法
		webview.addJavascriptInterface(new InJavaScript(), "android");
		webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

	}

	private Intent createCameraIntent() {
		Intent imageIntent = new Intent(Intent.ACTION_GET_CONTENT);// 选择图片文件
		imageIntent.setType("image/*");
		return imageIntent;
	}

	// 使后退键可以达到网页回退功能,而不是关闭activity
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK && webview.canGoBack()) {
			webview.goBack();
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}

	//添加菜单栏的几个功能键
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.webview, menu);
		return super.onCreateOptionsMenu(menu);
	}

	/**
	 * 给javascript调用的代码
	 * 
	 */
	private final class InJavaScript {
		//可以用JS关闭本Activity
		@android.webkit.JavascriptInterface
		public void finish() {
			handler.sendEmptyMessage(FINISH_ACTIVITY);
		}
		//可以用JS触发一个分享文本信息的intent
		@android.webkit.JavascriptInterface
		public void sharelink(String link){
			Intent i=new Intent(Intent.ACTION_SEND);
			i.setType("text/plain");
			i.putExtra(Intent.EXTRA_SUBJECT, "分享");
			i.putExtra(Intent.EXTRA_TEXT, "share this:"+link);
			startActivity(Intent.createChooser(i, "请选择分享方式"));
		}
	}

	/*
	 * (non-Javadoc)左上角回退可以结束本activity,另有前进、后退、刷新
	 * 
	 * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case android.R.id.home://关闭页面
			finish();
			break;
		case R.id.menu_webview_refresh://刷新
			webview.reload();
			break;
		case R.id.menu_webview_back://后退
			if (webview.canGoBack())
				webview.goBack();
			break;
		case R.id.menu_webview_forward://前进
			if (webview.canGoForward())
				webview.goForward();
			break;
		}
		return super.onOptionsItemSelected(item);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		//选择文件后回调给JS一个URI
		if (requestCode == REQUEST_UPLOAD_FILE_CODE && resultCode == RESULT_OK) {
			if (null == mUploadFile)
				return;
			Uri result = (null == data) ? null : data.getData();//注,此处data.getData(),若为data则仅是contentProvider的地址将不能为JS识别
			if (null != result) {
				mUploadFile.onReceiveValue(result);
				mUploadFile = null;
			}
			//如果用户取消了选择文件操作,必须回调一个null的URI给JS,否则webview将会死掉
		} else if (requestCode == REQUEST_UPLOAD_FILE_CODE &&resultCode == RESULT_CANCELED) {
			Uri result = null;
			mUploadFile.onReceiveValue(result);
			mUploadFile = null;
		}

	}
	//用来处理UI操作的handler,可扩展,暂无太大用处……
	private static class MyHandler extends Handler {
		WeakReference<WebViewActivity> weakReference;

		public MyHandler(WebViewActivity webViewActivity) {
			weakReference = new WeakReference<WebViewActivity>(webViewActivity);
		}
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case FINISH_ACTIVITY:
				weakReference.get().finish();
				break;
			default:
				break;
			}
			super.handleMessage(msg);
		}
	}
}



                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android Studio中使用WebView实现通讯录,首先需要创建一个新的Android工程,并在布局文件中添加一个WebView组件。然后,需要在代码中加载一个包含通讯录功能的web页面,并启用JavaScript交互。在web页面中,可以使用HTML、CSS和JavaScript来创建通讯录界面,并实现添加、删除、编辑联系人等功能。 在Android Studio中,需要在Activity中配置WebView的设置,如启用JavaScript、设置WebViewClient等。通过WebViewClient可以拦截网页的加载过程,并在Android应用中处理对应的逻辑。同时,可以通过JavaScript与Android应用进行通信,例如通过JavaScript调用Android方法来实现添加联系人、删除联系人等操作。 在Android应用中,还可以通过WebView的接口来调用JavaScript方法,实现与web页面的数据交互。例如,通过WebView的addJavascriptInterface方法,可以将Java对象注入到JavaScript中,从而实现Android应用与WebView之间的双向通信。 最后,需要注意在使用WebView时,要注意安全性问题,防止恶意网页攻击。可以通过设置WebView的安全策略、禁止加载不安全的资源等方式来加强安全性。另外,还可以对JavaScript接口进行限制,只暴露必要的方法,以减少潜在的风险。 总之,通过在Android Studio中使用WebView实现通讯录,可以充分发挥WebView的强大功能实现一个功能丰富、交互性强的通讯录应用。同时,需要在开发过程中注意安全性和用户体验,确保应用的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值