Android之WebView仿微信中图片操作(含二维码识别)
来源:互联网 发布:中学生直播软件 编辑:程序博客网 时间:2024/05/16 09:18
HitTestResult类: WebView中被点击内容的相应信息,通过WebView的getHitTestResult()获取!
自定义WebView
/** * 自定义WebView,长按图片获取图片url * @author LinZhang * */public class CustomWebView extends WebView implements OnLongClickListener{ private Context context; private LongClickCallBack mCallBack; public CustomWebView(Context context, LongClickCallBack mCallBack) { super(context); this.context = context; this.mCallBack = mCallBack; initSettings(); } private void initSettings() { // 初始化设置 WebSettings mSettings = this.getSettings(); mSettings.setJavaScriptEnabled(true);//开启javascript mSettings.setDomStorageEnabled(true);//开启DOM mSettings.setDefaultTextEncodingName("utf-8");//设置字符编码 //设置web页面 mSettings.setAllowFileAccess(true);//设置支持文件流 mSettings.setSupportZoom(true);// 支持缩放 mSettings.setBuiltInZoomControls(true);// 支持缩放 mSettings.setUseWideViewPort(true);// 调整到适合webview大小 mSettings.setLoadWithOverviewMode(true);// 调整到适合webview大小 mSettings.setDefaultZoom(ZoomDensity.FAR);// 屏幕自适应网页,如果没有这个,在低分辨率的手机上显示可能会异常 mSettings.setRenderPriority(RenderPriority.HIGH); //提高网页加载速度,暂时阻塞图片加载,然后网页加载好了,在进行加载图片 mSettings.setBlockNetworkImage(true); mSettings.setAppCacheEnabled(true);//开启缓存机制 setWebViewClient(new MyWebViewClient()); setOnLongClickListener(this); } @Override public boolean onLongClick(View v) { // 长按事件监听(注意:需要实现LongClickCallBack接口并传入对象) final HitTestResult htr = getHitTestResult();//获取所点击的内容 if (htr.getType() == WebView.HitTestResult.IMAGE_TYPE) {//判断被点击的类型为图片 mCallBack.onLongClickCallBack(htr.getExtra()); } return false; } private class MyWebViewClient extends WebViewClient { /** * 加载过程中 拦截加载的地址url * @param view * @param url 被拦截的url * @return */ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return super.shouldOverrideUrlLoading(view, url); } /** * 页面加载过程中,加载资源回调的方法 * @param view * @param url */ @Override public void onLoadResource(WebView view, String url) { super.onLoadResource(view, url); } /** * 页面加载完成回调的方法 * @param view * @param url */ @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 关闭图片加载阻塞 view.getSettings().setBlockNetworkImage(false); } /** * 页面开始加载调用的方法 * @param view * @param url * @param favicon */ @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); } @Override public void onScaleChanged(WebView view, float oldScale, float newScale) { super.onScaleChanged(view, oldScale, newScale); CustomWebView.this.requestFocus(); CustomWebView.this.requestFocusFromTouch(); } } /** * 长按事件回调接口,传递图片地址 * @author LinZhang */ public interface LongClickCallBack{ /**用于传递图片地址*/ void onLongClickCallBack(String imgUrl); }}
自定义Dialog,用于长按图片弹出
/** * 弹出图片操作Dialog * @author LinZhang * */public abstract class CustomDialog extends Dialog { private Context context; /** * 构造器 * @param context 上下文 * @param layoutId 资源文件id */ public CustomDialog(Context context, int layoutId) { super(context, R.style.CustomDialog); this.context = context; createDialog(layoutId); } /** * 设置dialog * @param layoutId */ public void createDialog(int layoutId){ setContentView(layoutId); Window window = getWindow(); WindowManager.LayoutParams params = window.getAttributes(); params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.gravity = Gravity.CENTER; window.setAttributes(params); initViews(); if(!(context instanceof Activity)){ getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); } } public void closeDialog(){ dismiss(); } /** * 用于初始化相应的控件 */ public abstract void initViews();}
MainActivity:
public class MainActivity extends Activity implements LongClickCallBack{ private CustomWebView mCustomWebView; private CustomDialog mCustomDialog; private ArrayAdapter<String> adapter; private boolean isQR;//判断是否为二维码 private Result result;//二维码解析结果 @SuppressLint("HandlerLeak") private Handler handler = new Handler(){ public void handleMessage(Message msg) { if (msg.what == 0){ if (isQR){ adapter.add("识别图中二维码"); } adapter.notifyDataSetChanged(); } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initWebView(); } private void initWebView() { // 初始WebView化控件 mCustomWebView = new CustomWebView(this, this); mCustomWebView.loadUrl("http://keeganlee.me/post/android/20121206");//加载页面 mCustomWebView.setFocusable(true); mCustomWebView.setFocusableInTouchMode(true); addContentView(mCustomWebView, new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT)); } @Override public void onLongClickCallBack(final String imgUrl) { // 获取到图片地址后做相应的处理 new Thread(){ public void run() { decodeImage(imgUrl); handler.sendEmptyMessage(0); }; }.start(); showDialog(); } /** * 判断是否为二维码 * @param url 图片地址 * @return */ private boolean decodeImage(String sUrl){ result = DecodeImage.handleQRCodeFormBitmap(getBitmap(sUrl)); if(result == null){ isQR = false; }else { isQR = true; } return isQR; } /** * 根据地址获取网络图片 * @param sUrl 图片地址 * @return * @throws IOException */ public static Bitmap getBitmap(String sUrl){ try { URL url = new URL(sUrl); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); if(conn.getResponseCode() == 200){ InputStream inputStream = conn.getInputStream(); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); return bitmap; } } catch (Exception e) { e.printStackTrace(); } return null; } /** * 显示Dialog * @param v */ private void showDialog() { adapter = new ArrayAdapter<String>(this,R.layout.item_dialog); adapter.add("发送给朋友"); adapter.add("保存到手机"); adapter.add("收藏"); mCustomDialog = new CustomDialog(this, R.layout.custom_dialog) { @Override public void initViews() { // 初始CustomDialog化控件 ListView mListView = (ListView) findViewById(R.id.lv_dialog); mListView.setAdapter(adapter); mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 点击事件 switch (position) { case 0: Toast.makeText(MainActivity.this, "已发送给朋友", Toast.LENGTH_LONG).show(); closeDialog(); break; case 1: Toast.makeText(MainActivity.this, "已保存到手机", Toast.LENGTH_LONG).show(); closeDialog(); break; case 2: Toast.makeText(MainActivity.this, "已收藏", Toast.LENGTH_LONG).show(); closeDialog(); break; case 3: Toast.makeText(MainActivity.this, "二维码识别结果: " + result.toString(), Toast.LENGTH_LONG).show(); closeDialog(); break; } } }); } }; mCustomDialog.show(); }}
0 0
- Android之WebView仿微信中图片操作(含二维码识别)
- android webview长按识别图片 ,利用zxing识别图片是否是二维码
- Android开源库之使用ZXing开源库生成二维码及识别本地二维码图片
- android webView使用js/css实现夜间模式 长按识别图片以及二维码,网页可以上传图片
- Android Zxing 相册二维码/条码图片识别
- Android实现二维码扫描功能(四)-ZXing识别图片二维码,相册选图
- ios webview中二维码识别
- 二维码生成、扫描、图片识别(Zxing)
- 识别二维码图片
- Android之zxing二维码生成与识别
- Android之二维码生成和识别
- Android之zxing二维码生成与识别
- Android之zxing二维码生成于识别
- Android之zxing二维码生成于识别
- Android之zxing二维码生成与识别
- Android之zxing二维码生成与识别
- Android开发之二维码生成与识别
- Android之二维码生成与识别
- java 反射机制
- C#学习第三天
- IOS开发懒加载
- 当你想要放弃时,请用心看看这副漫画
- 《深入理解JVM》学习笔记(1)
- Android之WebView仿微信中图片操作(含二维码识别)
- smb协议读写远程文件
- LeetCode:Maximum Product of Word Lengths
- 简易自定义seg与tableview联动布局
- CakePHP控制器向视图传值总结
- IIC设备驱动实例
- Cannot assign to 'self' outside of a method in the init family
- SourceTree 使用教程
- 做北京linux培训哪家好?