android浏览器源代码
Android开发—SeeJoPlayer视频播放器源码解析
2020.03.27 v1.2.0 beta版:更新说明:一、完美支持android1.五、android1.六、android2.0、android2.0一、android2.1平台;2、完美支持320×480、480×800、480×854等各类分辨率(自适应屏幕分辨率);3、支持在线音视频播放,支持URL input和从浏览器调用SeeJoPlayer播放器播放在线音视频;4、自动转为横屏播放,为用户提供更好的观看体验;5、修改了没有SD卡程序出错的Bug;6、美化了视频播放列表和操作说明的界面。
第一部份:功能介绍SeeJoPlayer的优势要紧在相对还算美观的界面和便利的交互操作上。
先说操作吧,它支持:一、全屏切换: 双击屏幕二、播放/暂停: 长按屏幕3、静音/恢复: 长按音量按钮4、播放列表: 操纵面板最右边的按钮(暂不支持编辑功能)五、音量调剂: 单击音量按钮,在弹出的音量显示区域触摸改变音量这些操作和PC上的播放器较为类似,希望大伙儿能用得适应。
至于界面的话,多说无益,直接上图吧:第二部份:源码解析一、VideoView与视频比例缩放:咱们能够很方便的取得VideoView的源代码,最简单的方式是直接在上找“.java”。
因此重写VideoView的进程其实只是在原先的基础上进行一些修改罢了,并非一个很麻烦的工作。
什么缘故Android自带的VideoView会维持视频的长宽比而不能让咱们很方便的自概念比例呢?我猜想可能Google 做Android也是一个很仓促的工程,许多代码并无考虑得太成熟。
VideoView的源码中有如此一段代码:1 @Override2 3 4 5 6 7 8 9101112131415161718192021222324252627protectedvoid onMeasure(int widthMeasureSpec, int heightMeasureSpec){//Log.i("@@@@", "onMeasure");int width = getDefaultSize(mVideoWidth, widthMeasureSpec);int height = getDefaultSize(mVideoHeight, heightMeasureSpec);if(mVideoWidth >0&& mVideoHeight >0){if( mVideoWidth * height > width * mVideoHeight ){//Log.i("@@@", "image too tall, correcting");height = width * mVideoHeight / mVideoWidth;}elseif( mVideoWidth * height < width * mVideoHeight ){//Log.i("@@@", "image too wide, correcting");width = height * mVideoWidth / mVideoHeight;}else{//Log.i("@@@", "aspect ratio is correct: " +//width+"/"+height+"="+//mVideoWidth+"/"+mVideoHeight);}}//Log.i("@@@@@@@@@@", "setting size: " + width + 'x' + height); setMeasuredDimension(width, height);}这确实是什么缘故长宽比不能改变的缘故了。
Android源码下载方法详解
Android: Android源码下载方法详解分类:Android平台安卓源码下载地址:/source/downloading.html相信很多下载过内核的人都对这个很熟悉git clone git:///kernel/common.git kernel但是这是在以前,现在如果这么执行的话,会显示如下内容Initialized empty Git repository in /home/star/working/kernel/.git/[0: 149.20.4.77]: errno=Connection refusedfatal: unable to connect a socket (Connection refused)通过浏览器输入/,发现该网站已经被重定向为/source/downloading.html可以在该页面的最后发现内核的下载方法。
下面我们介绍一下Android源码下载的步骤。
工作环境:操作系统:Ubuntu 10.04 或Ubuntu10.10git程序:1.7.0.4 或1.7.1转载请注明出处:/pku_android方法一:1.1 初始化安装环境参考网页/source/initializing.html主要要做的就是安装jdk和安装一些软件包$ sudo apt-get install git-core gnupg flex bison gperf build-essential \zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev \libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown \libxml2-utils如果已经安装了,就不许要这步了1.2 无论下载内核和源码,都需要进行如下操作参考网页/source/downloading.html$ mkdir ~/bin$ PATH=~/bin:$PATH$ curl https:///dl/googlesource/git-repo/repo > ~/bin/repo如果出现: repo init error: could not verify the tag 'v1.12.7',执行下面的命令:curl /git-repo-downloads/repo > ~/bin/repo $ chmod a+x ~/bin/repo建立一个文件夹,以便下载的内容保存其中$ mkdir WORKING_DIRECTORY$ cd WORKING_DIRECTORY@@@ 以下可以脚本实现autogit.rar @@@1.3 内核下载$ git clone https:///kernel/common.git kernel命令行最后面的kernel的意思是保存在这个文件夹下,所以可以是任何名字,该文件夹不需要自己去创建,最后的这个不写也没问题如果想下载其他版本的内核$ git clone https:///kernel/goldfish.git$ git clone https:///kernel/msm.git$ git clone https:///kernel/omap.git$ git clone https:///kernel/samsung.git$ git clone https:///kernel/tegra.git下载过程中,会有如下信息,速度快慢取决于网速了。
开放源代码的例子
开放源代码的例子
以下是 7 条关于开放源代码的例子:
1. Linux 操作系统啊!哇塞,这可是个超级厉害的开放源代码例子呢!就像一个巨大的宝藏,全世界的开发者都能去挖掘它、贡献自己的力量。
想想看,如果没有开源,我们能享受到这么强大又稳定的操作系统吗?
2. Apache HTTP Server 呀!它可不简单,就像一个坚固的基石,为无数网站提供着可靠的支持。
这不是活生生地体现了开放源代码的厉害之处吗?有那么多人能一起改进它,让它越来越好!
3. MySQL 数据库,这也是开放源代码的明星呢!它就如同一个知识的海洋,任由大家在里面遨游、探索。
没有开源,它能变得如此强大和好用吗?
4. Firefox 浏览器呢!很多人每天都在用它。
它就像是一辆快速的赛车,在
互联网的道路上疾驰。
因为开源,它才能不断进化,满足大家各种各样的需求,这多棒呀!
5. WordPress,建网站的都知道吧!它可是开放源代码的杰作啊!就像一
个魔法盒,能变出各种精彩的网站。
大家一起努力让它变得神奇,多有意思!
6. LibreOffice 办公软件,和那些收费的相比也毫不逊色呀!它如同一位贴
心的助手,随时帮我们处理各种文档。
开源让它充满活力,能更好地服务大家。
7. TensorFlow,在人工智能领域那可是大名鼎鼎!它就像是一把开启智慧之门的钥匙。
因为开源,众多开发者才能在其基础上创造出更多令人惊叹的成果。
我觉得开放源代码真的是太棒了!它让技术能够被广泛分享和发展,推动着整个世界不断进步!。
黑马程序员安卓教程:HTML源码查看器
HTML源码查看器通俗了解,通过html语法规则让图片、文字等内容,在浏览器显示出来的代码我们称之为网页源代码。
如何查看html源码?下面我们将编写一个html源码查看器,通过该查看器来查看指定网页的html源码。
1.浏览器上查看html源码●打开一个网页后点击鼠标右键,在弹出的菜单栏中选择“查看源文件”即可弹出一个记事本,而该记事本的内容就是此网页的html代码。
右击豆瓣主页,弹出图1-1所示的html源码。
图1-1所示●点击浏览器状态栏或工具栏中的“查看”,然后选中弹出面板的“查看源代码”亦可查看此网页的html源代码。
2.手机上查看html源码通过浏览器我们可以查看到html源码,下面我们通过手机实现以上功能,具体操作如下:●新建工程【File】→【new】→【Android Application Project】命名为:01_网页源码查看器●设计布局文件根据功能需求,设计显示界面,效果如图1-2所示:图1-2所示在编辑框中输入网址,当点击“查看”按钮时则下方的TextView将显示该网址所在页面的html 源码。
图1-2对应的xml布局文件代码如例1-1所示:例1-1 布局文件根据控件定义的id,在activity中查找到相关控件,代码如例1-2:(1)点击按钮查看指定路径下网页的html源文件,首先我们可以通过httpwatch来抓取数据包,查看分析该数据包的内容。
启动tomcat服务器,从浏览器中访问tomcat服务器默认页面,并抓取数据流,效果如图1-3所示:图1-3所示由图1-3可知:在访问url路径:http://<本地计算机ip>:8080时,服务端返回的数据就是html源码,因此,我们可以发送http请求,然后在手机端接收服务端返回的数据流,并将该数据流转化成String类型的文本,最后部署在TestView控件上。
(2)发送get请求,获取页面html源码,代码如例1-3:例1-3运行项目,效果如图1-4所示:图1-4所示上图TextView只能显示部分html源码,此时将局文件做如下例1-4调整,则可以显示全部的html内容。
Android是一种基于Linux的自由及开放源代码的操作系统
Android是⼀种基于Linux的⾃由及开放源代码的操作系统Android是⼀种基于Linux的⾃由及开放源代码的操作系统,主要使⽤于移动设备,如智能⼿机和平板电脑,由Google公司和开放⼿机联盟领导及开发。
尚未有统⼀中⽂名称,中国⼤陆地区较多⼈使⽤“安卓”或“安致”。
Android操作系统最初由Andy Rubin开发,主要⽀持⼿机。
2005年8⽉由Google收购注资。
2007年11⽉,Google与84家硬件制造商、软件开发商及电信营运商组建开放⼿机联盟共同研发改良Android系统。
随后Google以Apache开源许可证的授权⽅式,发布了Android的源代码。
第⼀部Android智能⼿机发布于2008年10⽉。
Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。
2011年第⼀季度,Android在全球的市场份额⾸次超过塞班系统,跃居全球第⼀。
2012年11⽉数据显⽰,Android占据全球智能⼿机操作系统市场76%的份额,中国市场占有率为90%。
中⽂名:安卓外⽂名:Android开发商:Google、开放⼿持设备联盟发⾏商:Google发⾏时间:2008年9⽉23⽇编程语⾔:C/C++(底层)Java等(应⽤层)系统家族:类Unix,Linux源码模式:⾃由及开放源代码软件内核类型:宏内核(Linux内核)软件许可:Apache License, GPL等Android⼀词的本义指“机器⼈”,同时也是Google于2007年11⽉5⽇宣布的基于Linux平台的开源⼿机操作系统的名称,该平台由操作系统、中间件、⽤户界⾯和应⽤软件组成。
Android⼀词最早出现于法国作家利尔亚当(Auguste Villiers de l'Isle-Adam)在1886年发表的科幻⼩说《未来夏娃》(L'ève future)中。
他将外表像⼈的机器起名为Android。
拥有自己的浏览器--部分源代码(c++)
附录六部分源代码1、浏览完成浏览器必需的浏览功能。
//---------------------------------------------------------------------------#include <vcl.h>#pragma hdrstop#include "CWin.h"#include <Filectrl.hpp>//---------------------------------------------------------------------------#pragma package(smart_init)#pragma link "SHDocVw_OCX"#pragma resource "*.dfm"TForm1 *Form1;//---------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){//设置浏览器起始页面//空白页TVariant *starturl=new TVariant(CppWebBrowser1->Path+"blank") ; CppWebBrowser1->Navigate2(starturl) ;}//---------------------------------------------------------------------------void __fastcall TForm1::CppWebBrowser1BeforeNavigate2(TObject *Sender, LPDISPATCH pDisp, TVariant *URL, TVariant *Flags,TVariant *TargetFrameName, TVariant *PostData, TVariant *Headers,TOLEBOOL *Cancel){//修改地址栏为当前页面网址AddrBar->Text = *URL ;}//---------------------------------------------------------------------------void __fastcall TForm1::StartBrowseClick(TObject *Sender){//按钮go ;浏览//鼠标点击按钮,开始浏览地址栏中请求网页//默认,回车键TVariant *url=new TVariant(AddrBar->Text);CppWebBrowser1->Navigate2(url) ;}//---------------------------------------------------------------------------void __fastcall TForm1::stopClick(TObject *Sender){//按钮stop ;停止//鼠标点击按钮,停止当前浏览请求CppWebBrowser1->Stop();}//---------------------------------------------------------------------------void __fastcall TForm1::refreshClick(TObject *Sender){//按钮refresh ;刷新//鼠标点击按钮,刷新当前显示页面CppWebBrowser1->Refresh();}//---------------------------------------------------------------------------void __fastcall TForm1::backClick(TObject *Sender){//按钮<< ;后退//鼠标点击按钮,访问历史链表中的后一网页CppWebBrowser1->GoBack();}//---------------------------------------------------------------------------void __fastcall TForm1::forwardClick(TObject *Sender){//按钮>> ;前进//鼠标点击按钮,访问历史链表中的前一网页CppWebBrowser1->GoForward();}//---------------------------------------------------------------------------void __fastcall TForm1::homeClick(TObject *Sender){//按钮home ;主页//鼠标点击按钮,显示IE默认主页CppWebBrowser1->GoHome();}//---------------------------------------------------------------------------2、Http请求消息类Http请求消息的分析和构造。
python单机版自动化测试框架源代码(selenium+Appium+requests+。。。
python单机版⾃动化测试框架源代码(selenium+Appium+requests+。
⼀、⾃动化测试框架:1、框架和项⽬源代码下载说明:框架可以⽀持web界⾯UI、安卓Android,ios苹果、接⼝API等⾃动化测试。
⽂档和代码持续维护更新,有问题可以交流。
2、依赖包安装2.1、jdk2.2、python安装下载地址:或2.3、python依赖包pip install seleniumpip install xlrdpip install pymysqlpip install lxmlpip install Pillowpip install win32guipip install win32conpip install requestspip install qrcodepip install pexpectpip install chinesecalendarpip install automagicapip install tusharepip install imapclientpip install pymysqlpip install schedulepip install paramikopip install pypiwin32pip install pdfminer3Kpip install browsermob-proxypip install pywin32pip install python-dateutilpip install bs4pip install configparserpip install beautifulsoup4pip install html5libpip install matplotlibpython -m pip install cx_Oracle --upgradepip install sqlparsepip install DBUtilspip install keyboard2.3、chrome driver2.3.1、chrome driver的下载地址:2.3.2、安装下载解压放到chrome的安装⽬录下...\Google\Chrome\Application\设置path环境变量,把chrome的安装⽬录(我的:C:\ProgramFiles\Google\Chrome\Application)1、因信息安全原因,删除了真实项⽬配置⽂件中密码和http⽹页真实地址2、以业务物流追踪(ipadWuLiuZhuiZong.py)中国港⼝功能为样例,做了界⾯检查、数据库与界⾯数据对⽐、字体颜⾊(红绿)检查等功能,仅供参考⼆、简介:1. 外部⼯具:上⾯⾃动化包⽬录“autoTest\basic\browsermob-proxy”中已经包含2. autoTest\conf\config.ini可以配置⽇志级别3. autoTest\caseexcel\ipadWebCase.xls是ipad⽹页项⽬Excel⽤例,“ipadApiCase.xls"是API接⼝⽤例,"⼤屏WebCase.xls"是⼤屏项⽬⽤例,"#url.xls"是⽣产和测试等⽹页地址配置⽂件4. autoTest\basic是基础脚本,基本所有项⽬通⽤,mySysCommon.py为系统常⽤函数功能class,webTestCase.py为UI⾃动化测试常⽤函数功能class5. autoTest\report是⽤于存放测试报告和过程图⽚6. autoTest\log是⽤于存放过程⽇志7. autoTest\cases\Zd为某项⽬⾃动化脚本,allData.json为公共数据变量⽂件,publicOperation.py为当前项⽬共⽤函数,comm.py中编写unittest的test开头⽤例,ipadDanJi.py和ipadWuLiuZhuiZong.py是各测试模块。
分享45个android实例源码
分享45个android实例源码,很好很强大/android-20978-1-1.htmlandriod闹钟源代码/android-20974-1-1.htmlandroid源码分享之指南针程序/android-20973-1-1.html重力感应的测试程序andriod源代码/android-20972-1-1.htmlandroid源码分享之时光日志个人日程管理/android-20969-1-1.htmlOpenGL的一个简单的例子/android-20968-1-1.html文件管理器-android源代码/android-20960-1-1.htmlAndroid Txt文本阅读器源码/android-20959-1-1.htmlAndroid远程登录含有loading登录效果~~完整代码和超级详细注释/android-20958-1-1.htmlAndroid 手电筒源码/android-20957-1-1.htmlAndroid操作数据库实例/android-20954-1-1.htmlandroid 画图程序/android-20953-1-1.htmlAndroid 天气预报加widget源码/android-20950-1-1.htmlAndroid 指南针程序/android-20949-1-1.htmlAndroid 个人记账程序源码Android游戏的心跳效果/android-20939-1-1.htmlAndroid PDF 阅读器源码/android-20858-1-1.htmlAndroid SqliteManager 源码/android-20857-1-1.htmlandroid 多点触控实例源码/android-20856-1-1.htmlAndroid 条码扫描程序源码/android-20855-1-1.htmlEditText插入QQ表情源码/android-20854-1-1.htmlAsyncTask进度条加载网站数据到ListView /android-20834-1-1.htmlandroid连接SQLite数据库-----增加改查+分页/android-20833-1-1.htmlAndroid 一个批量删除联系人的Demo/android-20832-1-1.htmlTXT 文本阅读器源码(android源码分享)/android-20827-1-1.htmlandroid 查询工具源代码/android-20824-1-1.htmlandroid进度条对话框Demo/android-20823-1-1.htmlAndroid实现渐显按钮的左右滑动效果/android-20752-1-1.html android天气预报源码Android 文件浏览器源码/android-20976-1-1.htmlandroid源码分享之私密通讯录源码/android-20975-1-1.htmlAndroid自定义泡泡效果源码/android-20956-1-1.htmlandroid 获取Gps信息的程序源码/android-20955-1-1.htmlandroid 超炫的图片浏览器/android-20952-1-1.htmlandroid 加载时闪烁点样式的启动画面/android-20951-1-1.html实现基于Android的英文电子词典/android-20948-1-1.html基于Android 的英文电子词典/android-20947-1-1.htmlandroid 源码之英语单词记忆程序源码/android-20936-1-1.htmlandorid 源码北京公交线路查询(离线)/android-20938-1-1.htmlAndroid 计算器源码/android-20935-1-1.html带文字的ProgressBar Demo源码/android-20831-1-1.htmlandroid自定义时钟(三种方法实现,秒针效果,详细注解)/android-20830-1-1.htmlAndroid 秒表源码分享/android-20829-1-1.htmlAndroid源代码定时情景模式切换/android-20828-1-1.htmlandroid 公交查询/android-20826-1-1.htmlandroid源码分享之带手势划动功能的日历源码/android-20825-1-1.html。
Android编译系统(Android.mk文件详解)
Android编译系统(Android.mk⽂件详解)【Android-NDK(Native Development Kit) docs⽂档】NDK提供了⼀系列的⼯具,帮助开发者快速开发C(或C++)的动态库,并能⾃动将so和java应⽤⼀起打包成apk。
Android.mk⽂件是GNU Makefile的⼀⼩部分,它⽤来对Android程序进⾏编译。
因为所有的编译⽂件都在同⼀个 GNU MAKE 执⾏环境中进⾏执⾏,⽽Android.mk中所有的变量都是全局的。
因此,您应尽量少声明变量,不要认为某些变量在解析过程中不会被定义。
⼀个Android.mk⽂件可以编译多个模块,每个模块属下列类型之⼀:1)APK程序⼀般的Android程序,编译打包⽣成apk⽂件2)JAVA库java类库,编译打包⽣成jar⽂件3)C\C++应⽤程序可执⾏的C\C++应⽤程序4)C\C++静态库编译⽣成C\C++静态库,并打包成.a⽂件5)C\C++共享库编译⽣成共享库(动态链接库),并打包成.so⽂,有且只有共享库才能被安装/复制到您的应⽤软件(APK)包中。
可以在每⼀个Android.mk file 中定义⼀个或多个模块,你也可以在⼏个模块中使⽤同⼀个源代码⽂件。
编译系统为你处理许多细节问题。
例如,你不需要在你的 Android.mk 中列出头⽂件和依赖⽂件。
编译系统将会为你⾃动处理这些问题。
这也意味着,在升级 NDK 后,你应该得到新的toolchain/platform⽀持,⽽且不需要改变你的 Android.mk ⽂件。
注意,NDK的Anroid.mk语法同公开发布的Android平台开源代码的Anroid.mk语法很接近,然⽽编译系统实现他们的⽅式却是不同的,这是故意这样设计的,可以让程序开发⼈员重⽤外部库的源代码更容易。
在描述语法细节之前,咱们来看⼀个简单的"hello world"的例⼦,⽐如,下⾯的⽂件:sources/helloworld/helloworld.csources/helloworld/Android.mk'helloworld.c'是⼀个 JNI 共享库,实现返回"hello world"字符串的原⽣⽅法。
AndroidStudio连接数据库实现增删改查
AndroidStudio连接数据库实现增删改查 源代码如下:DBUtil.java:package dao;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.sql.PreparedStatement;public class DBUtil {public static String db_url = "jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=UTF-8&serverTimezone=GMT"; public static String db_user = "root";public static String db_pass = "root";public static Connection getConn () {Connection conn = null;try {Class.forName("com.mysql.cj.jdbc.Driver");conn = DriverManager.getConnection(db_url, db_user, db_pass);} catch (Exception e) {e.printStackTrace();}return conn;}public static void close (Statement state, Connection conn) {if (state != null) {try {state.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}public static void close (ResultSet rs, Statement state, Connection conn) {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (state != null) {try {state.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}Add.java:package add;import java.sql.Connection;import java.sql.Statement;import dao.DBUtil;public class Add {public static boolean add(String table, AddService user ) {String sql = "insert into "+table+"(username,password)values('" + user.getUsername() + "','" + user.getPassword() + "')"; Connection conn = DBUtil.getConn();Statement state = null;boolean f = false;int a = 0;try {state = conn.createStatement();a = state.executeUpdate(sql);} catch (Exception e) {e.printStackTrace();} finally {DBUtil.close(state, conn);}if (a > 0) {f = true;}return f;}}AddService.java:package add;public class AddService {String username;String password;public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public static void main(String args[]){AddService user=new AddService();user.setUsername("123");user.setPassword("456");Add test=new Add();test.add("user1",user);}}Delete.java:package delete;import java.sql.Connection;import java.sql.Statement;import java.sql.SQLException;import dao.DBUtil;public class Delete {public boolean delete(String table,String username){boolean c=false;Connection conn= DBUtil.getConn();Statement state=null;String sql="delete from "+table+" where username="+username;try {state=conn.createStatement();int num = state.executeUpdate(sql);if(num!=0){c= true;}state.close();conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return c;}}DeleteService.java:package delete;public class DeleteService {String username;public void setUsername(String username) {ername = username;}public String getUsername() {return username;}public static void main(String args[]){DeleteService user=new DeleteService();user.setUsername("123");String username="'"+user.getUsername()+"'";Delete test=new Delete();test.delete("user1",username);}}Change.java:package change;import java.sql.Connection;import java.sql.SQLException;import java.sql.Statement;import dao.DBUtil;public class Change {public boolean change(String table,String lie,String lie0,String gai,String biao){Connection conn=DBUtil.getConn();Statement state=null;try {state=conn.createStatement();String sql="update "+table+" set "+lie+"='"+gai+"' where "+lie0+"='"+biao+"'"; System.out.println(sql);state.executeUpdate(sql);state.close();conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return true;}}ChangeService.java:package change;public class ChangeService {String lie;String lie0;String gai;String biao;public String getBiao() {return biao;}public String getGai() {return gai;}public String getLie() {return lie;}public String getLie0() {return lie0;}public void setBiao(String biao) {this.biao = biao;}public void setGai(String gai) {this.gai = gai;}public void setLie(String lie) {this.lie = lie;}public void setLie0(String lie0) {this.lie0 = lie0;}public static void main(String args[]){ChangeService user=new ChangeService();user.setBiao("2");user.setGai("xhj");user.setLie0("username");user.setLie("password");Change test=new Change();test.change("user1",user.getLie(),user.getLie0(),user.getGai(),user.getBiao()); }}Select.java:package select;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import dao.DBUtil;public class Select {public boolean select(String table){boolean c;Connection conn=DBUtil.getConn();Statement state=null;try{state=conn.createStatement();String sql="select * from "+table;ResultSet rs=state.executeQuery(sql);while(rs.next()){System.out.println(rs.getString(1)+" "+rs.getString(2));}rs.close();state.close();conn.close();}catch(Exception e){}return true;}}SelectService.java:package select;public class SelectService {String table;public String getTable() {return table;}public void setTable(String table) {this.table = table;}public static void main(String[] args) {SelectService user=new SelectService(); user.setTable("user1");Select test=new Select();test.select(user.getTable());}}数据库表名:user1。
Android超大图长图浏览库SubsamplingScaleImageView源码解析
Android超⼤图长图浏览库SubsamplingScaleImageView源码解析⼀开始没打算分析 SubsamplingScaleImageView 这个开源的图⽚浏览器的,因为这个库在我们 App 中使⽤了,觉得⾃⼰对这个库还是⽐较熟悉的,结果某天再看看到源码介绍的时候,才发现⾃⼰对其了解并不够深⼊,所以这才打算再细细看看源码的实现,同时记录⽅便以后回顾。
那么 SubsamplingScaleImageView 有啥优点呢?1. 采⽤ GestureDetector 进⾏⼿势控制,⽀持图⽚的点击,双击,滑动等来控制的放⼤缩⼩;2. 使⽤了 BitmapRegionDecoder,具有分块加载功能;3. ⽀持查看长图,超⼤图上⾯的优点简直就是⾮常实⽤,基本上拿来就可以直接⽤,简单省⼒。
下⾯就是要来分析,它是如何满⾜这些优点的。
源码分析⾸先附上源码地址:使⽤说明如果可以拿到图⽚的资源id,assert或者⽂件路径,直接使⽤下⾯⽅式进⾏使⽤:SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(id.imageView);imageView.setImage(ImageSource.resource(R.drawable.monkey));// ... or ...imageView.setImage(ImageSource.asset("map.png"))// ... or ...imageView.setImage(ImageSource.uri("/sdcard/DCIM/DSCM00123.JPG"));如果可以拿到 bitmap 就可以这么使⽤:SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(id.imageView);imageView.setImage(ImageSource.bitmap(bitmap));可以看到使⽤是⾮常简单的。
gitee chromium源码编译
一、概述Gitee是我国领先的云端软件开发评台,致力于提供代码托管、项目管理、协作协议等服务。
Chromium是一款由Google主导开发的开源网络浏览器项目,其源代码可以在Gitee上获取并进行编译。
本文将介绍如何在Gitee上获取Chromium源代码并进行编译的方法和步骤。
二、获取Chromium源代码1. 注册Gitee账号我们需要在Gitee上注册一个账号,如果已经有账号,可直接登入。
2. 搜索Chromium源代码登入Gitee后,可以在搜索框中输入“Chromium源代码”,然后按下回车键进行搜索。
3. ForkChromium仓库在搜索结果中找到Chromium的源代码仓库,点击进入仓库页面,然后点击Fork按钮,将该仓库Fork到自己的账号下。
4. 克隆Fork后的仓库在自己的仓库页面中,点击Clone按钮,复制仓库的位置区域。
5. 下载源代码打开命令行工具,执行git clone 命令,将源代码下载至本地。
三、编译Chromium源代码1. 安装依赖工具在编译Chromium源代码之前,首先需要安装一些编译所需的依赖工具,如Python、depot_tools等。
2. 配置环境变量在编译前,需要配置一些环境变量,如环境变量PATH、GYP_DEFINES等,以便编译可以正常进行。
3. 执行编译命令在命令行工具中,进入源代码目录,执行编译命令,等待编译过程完成。
4. 编译完成编译完成后,将在源代码目录中生成可执行文件,即Chromium浏览器的可执行文件。
四、注意事项1. 网络环境在获取源代码和进行编译的过程中,需要保证网络环境稳定,以免影响源代码的获取和编译。
2. 硬件配置在进行编译时,需要一定的硬件配置,如内存、CPU等,以确保编译过程顺利进行。
3. 版本兼容性需要注意Chromium源代码与依赖工具的兼容性,确保使用的版本能够正常支持编译。
五、总结通过本文的介绍,我们了解了如何在Gitee上获取Chromium源代码并进行编译的方法和步骤。
android手把手开发一个图片浏览器
android手把手开发一个图片浏览器这次我给大家讲解一个Android图片浏览器的应用。
AndroidAndroid是基于Linux内核的软件平台和操作系统,早期由Google开发,后由开放手机联盟Open Handset Alliance)开发。
它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分。
低层以Linux内核工作为基础,只提供基本功能;其他的应用软件则由各公司自行开发,以Java作为编写程序的一部分。
另外,为了推广此技术,Google和其它几十个手机公司建立了开放手机联盟。
Android在未公开之前常被传闻为Google电话或gPhone。
大多传闻认为Google开发的是自己的手机电话产品,而不是一套软件平台。
到了2010年1月,Google开始发表自家品牌手机电话的Nexus One。
目前最新版本为Android2.1。
下图是它的结构:简单来讲,Android就是一个开源的手机软件开发工具。
我主要给大家讲应用方面,大家如果有兴趣,可以了解相关基本知识。
要开发一个Android应用,首先得搭建Android开发环境:下载并安装Android sdk(Software Development Kit, 即软件开发工具包)。
由于Android 开发是集成在Eclipse中,需下载并安装ADT (Eclipse集成Android sdk插件)。
搭建环境会用一个专门的章节为大家详细讲解,这里我就不再赘述。
Android开发环境搭好后,我们先启动Eclipse创建一个Android的应用程序,然后在左上角单击File,New,Android Project,如下图所示:如果在图中Java Project找不到Android Project:在左上角单击File,New,Other:在弹出框中Android文件件中选中Android Project,然后单击Next进入下一步:弹出一个列表框:下面对这个列表的一些重要属性进行讲解:1.应用程序名称以及内容栏:2.工具栏:采用的编译工具即Android模拟器:3.属性栏:即应用程序中的相关属性:Android 这就是我们刚才创建的一个Android应用程序如下图:在这里面,我们最关心的是界面(main.xml)与后台(Test1.java):单击main.xml:我们先看看中间视图:这是一个页面编辑器模式:在左下角点击main.xml切换到界面编码模式:这就是刚才页面视图的源码:下面让我们看看后台(Test1.java)源码:单击Test1.java:以下将此类程序称之为activity(活动),该activity运行时会自动调用onCreate方法:而上图中onCreate方法是启动res文件夹下的layout下的main.xml界面。
最全的Android源码目录结构详解
最全的Android源码目录结构详解收藏转自/a/android/2010/0622/67.htmlAndroid 2.1|-- Makefile|-- bionic (bionic C库)|-- bootable (启动引导相关代码)|-- build (存放系统编译规则及generic等基础开发包配置)|-- cts (Android兼容性测试套件标准)|-- dalvik (dalvik JAVA虚拟机)|-- development (应用程序开发相关)|-- external (android使用的一些开源的模组)|-- frameworks (核心框架——java及C++语言)|-- hardware (部分厂家开源的硬解适配层HAL代码)|-- out (编译完成后的代码输出与此目录)|-- packages (应用程序包)|-- prebuilt (x86和arm架构下预编译的一些资源)|-- sdk (sdk及模拟器)|-- system (底层文件系统库、应用及组件——C语言)`-- vendor (厂商定制代码)bionic 目录|-- libc (C库)| |-- arch-arm (ARM架构,包含系统调用汇编实现)| |-- arch-x86 (x86架构,包含系统调用汇编实现)| |-- bionic (由C实现的功能,架构无关)| |-- docs (文档)| |-- include (头文件)| |-- inet (?inet相关,具体作用不明)| |-- kernel (Linux内核中的一些头文件)| |-- netbsd (?nesbsd系统相关,具体作用不明)| |-- private (?一些私有的头文件)| |-- stdio (stdio实现)| |-- stdlib (stdlib实现)| |-- string (string函数实现)| |-- tools (几个工具)| |-- tzcode (时区相关代码)| |-- unistd (unistd实现)| `-- zoneinfo (时区信息)|-- libdl (libdl实现,dl是动态链接,提供访问动态链接库的功能)|-- libm (libm数学库的实现,)| |-- alpha (apaha架构)| |-- amd64 (amd64架构)| |-- arm (arm架构)| |-- bsdsrc (?bsd的源码)| |-- i386 (i386架构)| |-- i387 (i387架构?)| |-- ia64 (ia64架构)| |-- include (头文件)| |-- man (数学函数,后缀名为.3,一些为freeBSD的库文件)| |-- powerpc (powerpc架构)| |-- sparc64 (sparc64架构)| `-- src (源代码)|-- libstdc++ (libstdc++ C++实现库)| |-- include (头文件)| `-- src (源码)|-- libthread_db (多线程程序的调试器库)| `-- include (头文件)`-- linker (动态链接器)`-- arch (支持arm和x86两种架构)bootable 目录.|-- bootloader (适合各种bootloader的通用代码)| `-- legacy (估计不能直接使用,可以参考)| |-- arch_armv6 (V6架构,几个简单的汇编文件)| |-- arch_msm7k (高通7k处理器架构的几个基本驱动)| |-- include (通用头文件和高通7k架构头文件)| |-- libboot (启动库,都写得很简单)| |-- libc (一些常用的c函数)| |-- nandwrite (nandwirte函数实现)| `-- usbloader (usbloader实现)|-- diskinstaller (android镜像打包器,x86可生产iso)`-- recovery (系统恢复相关)|-- edify (升级脚本使用的edify脚本语言)|-- etc (init.rc恢复脚本)|-- minui (一个简单的UI)|-- minzip (一个简单的压缩工具)|-- mtdutils (mtd工具)|-- res (资源)| `-- images (一些图片)|-- tools (工具)| `-- ota (OTA Over The Air Updates升级工具)`-- updater (升级器)build目录.|-- core (核心编译规则)|-- history (历史记录)|-- libs| `-- host (主机端库,有android “cp”功能替换)|-- target (目标机编译对象)| |-- board (开发平台)| | |-- emulator (模拟器)| | |-- generic (通用)| | |-- idea6410 (自己添加的)| | `-- sim (最简单)| `-- product (开发平台对应的编译规则)| `-- security (密钥相关)`-- tools (编译中主机使用的工具及脚本)|-- acp (Android "acp" Command)|-- apicheck (api检查工具)|-- applypatch (补丁工具)|-- apriori (预链接工具)|-- atree (tree工具)|-- bin2asm (bin转换为asm工具)|-- check_prereq (检查编译时间戳工具)|-- dexpreopt (模拟器相关工具,具体功能不明)|-- droiddoc (?作用不明,java语言,网上有人说和JDK5有关)|-- fs_config (This program takes a list of files and directories)|-- fs_get_stats (获取文件系统状态)|-- iself (判断是否ELF格式)|-- isprelinked (判断是否prelinked)|-- kcm (按键相关)|-- lsd (List symbol dependencies)|-- releasetools (生成镜像的工具及脚本)|-- rgb2565 (rgb转换为565)|-- signapk (apk签名工具)|-- soslim (strip工具)`-- zipalign (zip archive alignment tool)dalvik目录dalvik虚拟机.|-- dalvikvm (main.c的目录)|-- dexdump (dex反汇编)|-- dexlist (List all methods in all concrete classes in a DEX file.)|-- dexopt (预验证与优化)|-- docs (文档)|-- dvz (和zygote相关的一个命令)|-- dx (dx工具,将多个java转换为dex)|-- hit (?java语言写成)|-- libcore (核心库)|-- libcore-disabled (?禁用的库)|-- libdex (dex的库)|-- libnativehelper (Support functions for Android's class libraries)|-- tests (测试代码)|-- tools (工具)`-- vm (虚拟机实现)development 目录(开发者需要的一些例程及工具)|-- apps (一些核心应用程序)| |-- BluetoothDebug (蓝牙调试程序)| |-- CustomLocale (自定义区域设置)| |-- Development (开发)| |-- Fallback (和语言相关的一个程序)| |-- FontLab (字库)| |-- GestureBuilder (手势动作)| |-- NinePatchLab (?)| |-- OBJViewer (OBJ查看器)| |-- SdkSetup (SDK安装器)| |-- SpareParts (高级设置)| |-- Term (远程登录)| `-- launchperf (?)|-- build (编译脚本模板)|-- cmds (有个monkey工具)|-- data (配置数据)|-- docs (文档)|-- host (主机端USB驱动等)|-- ide (集成开发环境)|-- ndk (本地开发套件——c语言开发套件)|-- pdk (Plug Development Kit)|-- samples (例程)| |-- AliasActivity (?)| |-- ApiDemos (API演示程序)| |-- BluetoothChat (蓝牙聊天)| |-- BrowserPlugin (浏览器插件)| |-- BusinessCard (商业卡)| |-- Compass (指南针)| |-- ContactManager (联系人管理器)| |-- CubeLiveWallpaper (动态壁纸的一个简单例程)| |-- FixedGridLayout (像是布局)| |-- GlobalTime (全球时间)| |-- HelloActivity (Hello)| |-- Home (Home)| |-- JetBoy (jetBoy游戏)| |-- LunarLander (貌似又是一个游戏)| |-- MailSync (邮件同步)| |-- MultiResolution (多分辨率)| |-- MySampleRss (RSS)| |-- NotePad (记事本)| |-- RSSReader (RSS阅读器)| |-- SearchableDictionary (目录搜索)| |-- SimpleJNI (JNI例程)| |-- SkeletonApp (空壳APP)| |-- Snake (snake程序)| |-- SoftKeyboard (软键盘)| |-- Wiktionary (?维基)| `-- WiktionarySimple(?维基例程)|-- scripts (脚本)|-- sdk (sdk配置)|-- simulator (?模拟器)|-- testrunner (?测试用)`-- tools (一些工具)external 目录.|-- aes (AES加密)|-- apache-http (网页服务器)|-- astl (ASTL (Android STL) is a slimmed-down version of the regular C++ STL.)|-- bison (自动生成语法分析器,将无关文法转换成C、C++)|-- blktrace (blktrace is a block layer IO tracing mechanism)|-- bluetooth (蓝牙相关、协议栈)|-- bsdiff (diff工具)|-- bzip2 (压缩工具)|-- clearsilver (html模板系统)|-- dbus (低延时、低开销、高可用性的IPC机制)|-- dhcpcd (DHCP服务)|-- dosfstools (DOS文件系统工具)|-- dropbear (SSH2的server)|-- e2fsprogs (EXT2文件系统工具)|-- elfcopy (复制ELF的工具)|-- elfutils (ELF工具)|-- embunit (Embedded Unit Project)|-- emma (java代码覆盖率统计工具)|-- esd (Enlightened Sound Daemon,将多种音频流混合在一个设备上播放)|-- expat (Expat is a stream-oriented XML parser.)|-- fdlibm (FDLIBM (Freely Distributable LIBM))|-- freetype (字体)|-- fsck_msdos (dos文件系统检查工具)|-- gdata (google的无线数据相关)|-- genext2fs (genext2fs generates an ext2 filesystem as a normal (non-root) user)|-- giflib (gif库)|-- googleclient (google用户库)|-- grub (This is GNU GRUB, the GRand Unified Bootloader.)|-- gtest (Google C++ Testing Framework)|-- icu4c (ICU(International Component for Unicode)在C/C++下的版本)|-- ipsec-tools (This package provides a way to use the native IPsec functionality )|-- iptables (防火墙)|-- jdiff (generate a report describing the difference between two public Java APIs.)|-- jhead (jpeg头部信息工具)|-- jpeg (jpeg库)|-- junit (JUnit是一个Java语言的单元测试框架)|-- kernel-headers (内核的一些头文件)|-- libffi (libffi is a foreign function interface library.)|-- libpcap (网络数据包捕获函数)|-- libpng (png库)|-- libxml2 (xml解析库)|-- mtpd (一个命令)|-- netcat (simple Unix utility which reads and writes dataacross network connections)|-- netperf (网络性能测量工具)|-- neven (看代码和JNI相关)|-- opencore (多媒体框架)|-- openssl (SSL加密相关)|-- openvpn (VPN开源库)|-- oprofile (OProfile是Linux内核支持的一种性能分析机制。
【文件】WebKit介绍及总结
【关键字】文件WebKit介绍及总结一. WebKit 简介Webkit 是一个开放源代码的浏览器引擎(web browser engine) ,最初的代码来自KDE 的KHTML 和KJS( 均开放源代码) 。
苹果公司在Webkit 的基础上做了大量优化改进工作,此时的Apple Webkit 已经和Webkit 有了不少差别,最后开发出了著名的Safari ,可以说Safari 是一个相当成功的产品,但是Safari 却不是开放源代码的。
基于WebKit 的浏览器产品有:苹果的Safari 和iPhone ,Google 的Chrome 和Android ,Nokia 的S60 ,傲游3(Maxthon3) ;WebKit 目前支持HTML4/5 ,CSS1/2 ,DOM1/2 ,HTTP/FILE ,GIF/JPEG/PNG ,XML ,SVG ,RSS2.0 等;同类的浏览器引擎有:Trident (IE 内核),Gechko (Netscape, Mozilla 和Firefox 内核),Presto (Opera 内核,不免费),Tasman (IE for MAC 内核),等等,而WebKit 因为其功能强大、速度快而且免费备受欢迎。
二. 用到的库:除了平台相关的库,WebKit 需要用到的一些主要的后台库有:ICU :International Components for Unicode ,一个成熟,广泛使用的一套为C / C + + 和Java 库提供Unicode 的全球化支持软件;XSLT :eXtensible Stylesheet Language Transformation, W3C 定义的用于XML 文档转换的规范;Curl :一个利用URL 语法的命令行数据传输工具,基于libcurl 。
Sqlite :SQLite 是实现了SQL92 标准的SQL 数据库引擎,它能在一个库里组合数据库引擎和接口,将所有数据存储于单个文件;Gperf :一个很完美的哈希函数生成器;Flex :Fast Lex, 快速词法分析生成器;Bison :语法分析生成器,可以将一段带注释的上下文无关语法转化成LALR 或GLR 语法;Enchant :一个拼写检查库,提供单词的拼写检查、纠错等功能;三. 代码目录结构WebKitTools一些尝试WebKit 实现功能的程序;WebKitLibrariesWebKit 用到的库以及系统调用接口定义;WebKitExamplePlugins一些来自Netscape 的插件,比如输入法、动画和Cocoa 环境等;WebKitSite: 保存了网站的WebKit此目录位于WebKit 的最上层,定义了与应用相关的一些接口,因此它是平台相关的,每个子目录都是对应平台的完整实现:cf :Core Foundation, MAC OS X 上的系统级C 语言API 接口;win :Windows ;mac :MAC OS X ;qt :Q Toolkit ,其公司已被Nokia 收购;gtk :Gimp Toolkit ;scripts :一些脚本,目前只有一个关于WebKit 版本的脚本程序;chromium :Google Chrome 开发平台;wx :wxWindows ,一种可移植的C++ 和Python GUI 工具箱,by Julian Smart ;haiku :一种开源OS ,从BeOS 而来,2001 开始,2009 发布首版;efl: Enlightenment Foundation Libraries, Enlightenment 平台;WebCoreWebKit 的核心部分,定义了浏览相关的数据IO 、页面加载、脚本分析、UI 组织、事件处理、网络分析、平台相关的具体实现等内容。
Android应用程序开发(第二版)课后习题答案.doc
第一章Android简介1.简述各种手机操作系统的特点.答案:目前,手机上的操作系统主要包括以下几种,分别是Android、iOS、Windows Mobile、Windows Phone 7、Symbian、黑莓、PalmOS和Linux。
(1)Android是谷歌发布的基于Linux的开源手机平台,该平台由操作系统、中间件、用户界面和应用软件组成,是第一个可以完全定制、免费、开放的手机平台。
Android底层使用开源的Linux操作系统,同时开放了应用程序开发工具,使所有程序开发人员都在统一、开放的开发平台上进行开发,保证了Android应用程序的可移植性。
(2)iOS是由苹果公司为iPhone、iPod touch、iPad以及Apple TV开发的操作系统,以开放源代码的操作系统Darwin为基础,提供了SDK,iOS操作系统具有多点触摸操作的特点,支持的控制方法包括滑动、轻按、挤压和旋转, 允许系统界面根据屏幕的方向而改变方向,自带大量的应用程序。
(3)Windows Mobile是微软推出的移动设备操作系统,对硬件配置要求较高,一般需要使用高主频的嵌入式处理器,从而产生了耗电量大、电池续航时间短和硬件成本高等缺点,Windows Mobile系列操作系统包括Smartphone、Pocket PC和Portable Media Center。
随着Windows Phone 7的出现,Windows Mobile 正逐渐走出历史舞台。
(4)Windows Phone 7具有独特的“方格子”用户界面,非常简洁,黑色背景下的亮蓝色方形图标,显得十分清晰醒目,集成了Xbox Live游戏和Zune音乐功能,可见Windows Phone 7对游戏功能和社交功能的重视。
(5)Symbian是为手机而设计的实时多任务32位操作系统,它的功效低,内存占用少,提供了开发使用的函数库、用户界面、通用工具和参考示例。
谷歌开放源代码有哪些优势和存在的问题
谷歌开放源代码有哪些优势和存在的问题谷歌是一家以互联网服务为主打的科技公司,其产品包括搜索引擎、浏览器、手机操作系统等。
与其他企业相比,谷歌具有研究和开发先进技术的实力,同时,其支持并积极参与开放源代码社区,促进了这一领域的发展,为用户带来了许多好处。
本文将从谷歌开放源代码的角度探讨其优势和存在的问题。
谷歌开放源代码的优势1. 促进技术的创新开放源代码可以吸引更多的开发者加入到项目中来,共同协作实现技术的创新,同时也让更多的人能够分享到开发成果,推动技术进步。
谷歌生产的开放源代码项目具有这个优势。
例如,Android操作系统就是一个开放源代码项目,它的源代码可以自由获取和修改,有了这个操作系统,许多设备制造商都可以基于Android开发自己的设备,推进了智能手机市场的发展。
2. 提高软件质量开放源代码项目在开发的过程中可以吸引到更多高质量的代码贡献者参与,这样可以保证软件的质量。
例如,谷歌浏览器Chrome就是基于开源项目Chromium开发的,由于Chromium的源代码是公开的,许多开发者就可以利用这个平台来提出自己的建议,从而提高了浏览器的质量。
3. 降低软件成本开放源代码项目可以让企业、组织和开发者减少软件开发成本,从而进一步优化产品。
由于开源项目的源代码是公开的,企业和组织可以使用和修改开源项目的源代码,避免因为从头开始开发而带来的巨额成本。
谷歌的产品中有很多开源项目,例如Android、Chrome浏览器等都是基于开源项目开发的,这就大大降低了开发成本。
4. 保障软件安全开源代码的可见性可以消除隐藏的漏洞,同时让更多的人参与代码的审查过程,从而提高了软件的安全性。
谷歌在安全方面一直有着严格的标准,不断改进自己的安全技术,就是基于这个原因。
例如,Google Cloud中也是基于开源技术和开发的,这就保障了云服务在安全方面的强劲支持。
谷歌开放源代码的问题1. 维护的成本开源软件是由大量的开发者共同参与开发的,但这也会导致开发者的贡献是分散的,没有一个具体的负责人来负责代码的维护。
android WebView详解,常见漏洞详解和安全源码(下)
android WebView详解,常见漏洞详解和安全源码(下)WebView 常见漏洞WebView 的漏洞也是不少,列举一些常见的漏洞,实时更新,如果有其他的常见漏洞,知会一下我~~WebView 任意代码执行漏洞已知的WebView 任意代码执行漏洞有4 个,较早被公布是CVE-2012-6636,揭露了WebView 中addJavascriptInterface 接口会引起远程代码执行漏洞。
接着是CVE-2013-4710,针对某些特定机型会存在addJavascriptInterface API 引起的远程代码执行漏洞。
之后是CVE-2014-1939 爆出WebView 中内置导出的“searchBoxJavaBridge_”Java Object 可能被利用,实现远程任意代码。
再后来是CVE-2014-7224,类似于CVE-2014-1939 ,WebView 内置导出“accessibility”和“accessibilityTraversal”两个Java Object 接口,可被利用实现远程任意代码执行。
一般情况下,WebView 使用JavaScript 脚本的代码如下所示:WebView mWebView = (WebView)findViewById(R.id.webView);WebSettings msetting = mWebView.getSettings();msetting.setJavaScriptEnabled(true);mWebView.addJavascriptInterface(new TestJsInterface(), “testjs”);mWebView.loadUrl(url);CVE-2012-6636 和CVE-2013-4710Android 系统为了方便APP 中Java 代码和网页中的Javascript 脚本交互,在WebView 控件中实现了addJavascriptInterface 接口,如上面的代码所示,我们来看一下这个方法的官方描述:This method can be used to allow JavaScript to control the host application. This is a powerful feature,but also presents a security risk for apps targeting JELL Y_BEAN or earlier. Apps that target a versionlater than JELL Y_BEAN are still vulnerable if the app runs on a device running Android earlier than 4.2.The most secure way to use this method is to target JELL Y_BEAN_MR1 and to ensure the method is calledonly when running on Android 4.2 or later. With these older versions, JavaScript could use reflectionto access an injected object's public fields. Use of this method in a WebView containing untrustedcontent could allow an attacker to manipulate the host application in unintended ways, executing Javacode with the permissions of the host application. Use extreme care when using this method in a WebViewwhich could contain untrusted content.JavaScript interacts with Java object on a private, background thread of this WebView. Care is thereforerequired to maintain thread safety.The Java object's fields are not accessible.For applications targeted to API level LOLLIPOP and above, methods of injected Java objects are enumerable from JavaScript.可以看到,在JELL Y_BEAN(android 4.1)和JELL Y_BEAN 之前的版本中,使用这个方法是不安全的,网页中的JS脚本可以利用接口“testjs”调用App 中的Java 代码,而Java 对象继承关系会导致很多Public 的函数及getClass 函数都可以在JS中被访问,结合Java 的反射机制,攻击者还可以获得系统类的函数,进而可以进行任意代码执行,首先第一步WebView 添加Javascript 对象,并且添加一些权限,比如想要获取SD 卡上面的信息就需要android.permission.WRITE_EXTERNAL_STORAGE ;第二步JS 中可以遍历window 对象,找到存在getClass 方法的对象,再通过反射的机制,得到Runtime 对象,然后就可以调用静态方法来执行一些命令,比如访问文件的命令;第三步就是从执行命令后返回的输入流中得到字符串,比如执行完访问文件的命令之后,就可以得到文件名的信息了,有很严重暴露隐私的危险,核心JS 代码:function execute(cmdArgs){for (var obj in window) {if ("getClass" in window[obj]) {alert(obj);return window[obj].getClass().forName("ng.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);}}}所以当一些APP 通过扫描二维码打开一个外部网页的时候,就可以执行这段js 代码,漏洞在2013 年8 月被披露后,很多APP 都中招,其中浏览器APP 成为重灾区,但截至目前仍有很多APP 中依然存在此漏洞,与以往不同的只是攻击入口发生了一定的变化。
Androidwebview注入JS代码修改网页内容操作
Androidwebview注⼊JS代码修改⽹页内容操作今天开发的时候遇到⼀个需求,就是需要隐藏webview的元素,⿎捣了半天在stack overFlow找到了解决办法在此记录⼀下final WebView webview = (WebView)findViewById(R.id.browser);webview.getSettings().setJavaScriptEnabled(true);webview.setWebViewClient(new WebViewClient() {@Overridepublic void onPageFinished(WebView view, String url){// hide element by class namewebview.loadUrl("javascript:(function() { " +"document.getElementsByClassName('your_class_name')[0].style.display='none'; })()");// hide element by idwebview.loadUrl("javascript:(function() { " +"document.getElementById('your_id').style.display='none';})()");}});webview.loadUrl(url);结束!补充知识:android——webview修改html界⾯,达到去除或隐藏部分界⾯的效果如下所⽰:去除NBA及CAB频道。
为了达到这个效果,当时考虑了两种⽅式。
第⼀种是在webview加载前,先讲html代码拉下来,修改后,在通过webview去加载。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/bbs/home.php?mod=invite&id=62&c=apzrou /bbs/home.php?mod=invite&id=61&c=akkahk /bbs/home.php?mod=invite&id=60&c=zhhsor /bbs/home.php?mod=invite&id=59&c=4ukha8 /bbs/home.php?mod=invite&id=58&c=lgg60m /bbs/home.php?mod=invite&id=57&c=ymgm3m /bbs/home.php?mod=invite&id=56&c=n5zhht /bbs/home.php?mod=invite&id=55&c=huukbh /bbs/home.php?mod=invite&id=54&c=8yrc1c /bbs/home.php?mod=invite&id=53&c=stf115package com.explorer;import static com.mime.MIME.MIME_MapTable;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream; import java.util.ArrayList;import java.util.Arrays;import parator;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent;import .Uri;import android.os.Bundle;import android.os.Environment; import android.os.Handler;import android.os.Looper;import android.os.Message;import youtInflater; import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.AdapterView.OnItemLongClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.ListAdapter;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.TextView;import android.widget.Toast;import com.file.R;public class MainActivity extends Activity implements OnClickListener, OnItemClickListener, OnItemLongClickListener { private TextView currentDir;private Button btnC;private Button btnE;private ListView listView;private File rootDir;private File copyPath;private String flag;private String startFilePath;private String desFilePath;private List<File> fileList = new ArrayList<File>();private ProgressDialog progressDialog;private int currentLen = 0;private long totaLength = 0;private Handler messageHandler;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(yout.main);currentDir = (TextView) findViewById(R.id.currentDir);// fileName = (TextView) findViewById();btnC = (Button) findViewById(R.id.btnC);btnE = (Button) findViewById(R.id.btnE);btnC.setOnClickListener(this);btnE.setOnClickListener(this);listView = (ListView) findViewById(R.id.listView);listView.setOnItemClickListener(this);listView.setOnItemLongClickListener(this);//得到当前线程的Looper实例,由于当前线程是UI线程也可以通过Looper.getMainLooper()得到messageHandler = new MessageHandler(Looper.myLooper());if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { rootDir = Environment.getExternalStorageDirectory();} else {rootDir = Environment.getRootDirectory();}loadFiles(rootDir);}//自定义Handlerclass MessageHandler extends Handler {public MessageHandler(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {loadFiles(new File(currentDir.getText().toString()));}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.menu, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {if (item.getItemId() == R.id.newFile) {LayoutInflater factory = LayoutInflater.from(MainActivity.this);final View view = factory.inflate(yout.rename, null);AlertDialog d = new AlertDialog.Builder(MainActivity.this).setCancelable(true).setMessage("文件夹名") .setView(view).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {String dirName = ((EditText) view.findViewById(R.id.rename)).getText().toString();String newFile = currentDir.getText().toString() + "/" + dirName;if (new File(newFile).exists()) {Toast.makeText(MainActivity.this, "文件夹已存在", Toast.LENGTH_LONG).show();return;}File f = new File(currentDir.getText().toString(), dirName);f.mkdir();}}).create();d.show();} else if (item.getItemId() == R.id.about) {Dialog d = new AlertDialog.Builder(MainActivity.this).setTitle("文件浏览器1.0beta").setMessage("本程序由劲松Alex制作") .setPositiveButton("确定", null).create();d.show();} else if (item.getItemId() == R.id.exit) {MainActivity.this.finish();}return true;}/*** 加载当前文件夹列表* */public void loadFiles(File dir) {List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();if (dir != null) {// 处理上级目录if (!dir.getAbsolutePath().equals(rootDir.getAbsolutePath())) {Map<String, Object> map = new HashMap<String, Object>();map.put("file", dir.getParentFile());map.put("name", "上一级目录");map.put("img", R.drawable.folder);list.add(map);}currentDir.setText(dir.getAbsolutePath());File[] files = dir.listFiles();sortFiles(files);if (files != null) {for (File f : files) {Map<String, Object> map = new HashMap<String, Object>();map.put("file", f);map.put("name", f.getName());map.put("img", f.isDirectory() ? R.drawable.folder: (f.getName().toLowerCase().endsWith(".zip") ? R.drawable.zip : R.drawable.text));list.add(map);}}} else {Toast.makeText(this, "目录不正确,请输入正确的目录!", Toast.LENGTH_LONG).show();}ListAdapter adapter = new SimpleAdapter(this, list, yout.item, new String[] { "name", "img" }, new int[] {, R.id.icon });// listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);listView.setAdapter(adapter);}/*** 排序文件列表* */private void sortFiles(File[] files) {Arrays.sort(files, new Comparator<File>() {public int compare(File file1, File file2) {if (file1.isDirectory() && file2.isDirectory())return 1;if (file2.isDirectory())return 1;return -1;}});}/*** 打开文件** @param file*/private void openFile(File file) {Intent intent = new Intent();intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// 设置intent的Action属性intent.setAction(Intent.ACTION_VIEW);// 获取文件file的MIME类型String type = getMIMEType(file);// 设置intent的data和Type属性。