Android Animation 动画效果介绍
Android的animation由四种类型组成
XML中
alpha | 渐变透明度动画效果 |
scale | 渐变尺寸伸缩动画效果 |
translate | 画面转换位置移动动画效果 |
rotate | 画面转移旋转动画效果 |
JavaCode中
AlphaAnimation | 渐变透明度动画效果 |
ScaleAnimation | 渐变尺寸伸缩动画效果 |
TranslateAnimation | 画面转换位置移动动画效果 |
RotateAnimation | 画面转移旋转动画效果 |
Android动画模式
Animation主要有两种动画模式:
一种是tweened animation(渐变动画)
XML中 | JavaCode |
alpha | AlphaAnimation |
scale | ScaleAnimation |
一种是frame by frame(画面转换动画)
XML中 | JavaCode |
translate | TranslateAnimation |
rotate | RotateAnimation |
如何在XML文件中定义动画
① 打开Eclipse,新建Android工程
② 在res目录中新建anim文件夹
③ 在anim目录中新建一个myanim.xml(注意文件名小写)
④ 加入XML的动画代码
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android">
- <alpha/>
- <scale/>
- <translate/>
- <rotate/>
- </set>
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"><alpha/><scale/><translate/><rotate/></set>
Android动画解析--XML
<alpha>
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android" >
- <alpha
- android:fromAlpha="0.1" <!--fromAlpha(浮点型值) 属性为动画起始时透明度, 0.0表示完全透明 -->
- android:toAlpha="1.0" <!-- toAlpha(浮点型值) 属性为动画结束时透明度, 1.0表示完全不透明. fromAlpha 和 toAlpha 的取值在0.0-1.0之间的float数据类型的数字 -->
- android:duration="3000"<!-- duration(长整型值) 属性为动画持续时间,时间以毫秒为单位-->
- />
- </set>
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" ><alphaandroid:fromAlpha="0.1" <!--fromAlpha(浮点型值) 属性为动画起始时透明度, 0.0表示完全透明 -->android:toAlpha="1.0" <!-- toAlpha(浮点型值) 属性为动画结束时透明度, 1.0表示完全不透明. fromAlpha 和 toAlpha 的取值在0.0-1.0之间的float数据类型的数字 -->android:duration="3000"<!-- duration(长整型值) 属性为动画持续时间,时间以毫秒为单位-->/> </set>
<scale>
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android">
- <scale
- android:interpolator=
- "@android:anim/accelerate_decelerate_interpolator"
- android:fromXScale="0.0"
- android:toXScale="1.4"
- android:fromYScale="0.0"
- android:toYScale="1.4"
- android:pivotX="50%"
- android:pivotY="50%"
- android:fillAfter="false"
- android:duration="700" />
- </set>
- <!-- 尺寸伸缩动画效果 scale
- 属性:interpolator 指定一个动画的插入器
- 在我试验过程中,使用android.res.anim中的资源时候发现
- 有三种动画插入器:
- accelerate_decelerate_interpolator 加速-减速 动画插入器
- accelerate_interpolator 加速-动画插入器
- decelerate_interpolator 减速- 动画插入器
- 其他的属于特定的动画效果
- 浮点型值:
- fromXScale 属性为动画起始时 X坐标上的伸缩尺寸
- toXScale 属性为动画结束时 X坐标上的伸缩尺寸
- fromYScale 属性为动画起始时Y坐标上的伸缩尺寸
- toYScale 属性为动画结束时Y坐标上的伸缩尺寸
- 说明:
- 以上四种属性值
- 0.0表示收缩到没有
- 1.0表示正常无伸缩
- 值小于1.0表示收缩
- 值大于1.0表示放大
- pivotX 属性为动画相对于物件的X坐标的开始位置
- pivotY 属性为动画相对于物件的Y坐标的开始位置
- 说明:
- 以上两个属性值 从0%-100%中取值
- 50%为物件的X或Y方向坐标上的中点位置
- 长整型值:
- duration 属性为动画持续时间
- 说明: 时间以毫秒为单位
- 布尔型值:
- fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用
- -->
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"><scale android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:fromXScale="0.0"android:toXScale="1.4"android:fromYScale="0.0"android:toYScale="1.4"android:pivotX="50%"android:pivotY="50%"android:fillAfter="false"android:duration="700" /></set><!-- 尺寸伸缩动画效果 scale属性:interpolator 指定一个动画的插入器在我试验过程中,使用android.res.anim中的资源时候发现有三种动画插入器:accelerate_decelerate_interpolator 加速-减速 动画插入器accelerate_interpolator 加速-动画插入器decelerate_interpolator 减速- 动画插入器其他的属于特定的动画效果浮点型值:fromXScale 属性为动画起始时 X坐标上的伸缩尺寸 toXScale 属性为动画结束时 X坐标上的伸缩尺寸 fromYScale 属性为动画起始时Y坐标上的伸缩尺寸 toYScale 属性为动画结束时Y坐标上的伸缩尺寸 说明:以上四种属性值 0.0表示收缩到没有 1.0表示正常无伸缩 值小于1.0表示收缩 值大于1.0表示放大pivotX 属性为动画相对于物件的X坐标的开始位置pivotY 属性为动画相对于物件的Y坐标的开始位置说明:以上两个属性值 从0%-100%中取值50%为物件的X或Y方向坐标上的中点位置长整型值:duration 属性为动画持续时间说明: 时间以毫秒为单位布尔型值:fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用-->
<translate>
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android">
- <translate
- android:fromXDelta="30"
- android:toXDelta="-80"
- android:fromYDelta="30"
- android:toYDelta="300"
- android:duration="2000"
- />
- <!-- translate 位置转移动画效果
- 整型值:
- fromXDelta 属性为动画起始时 X坐标上的位置
- toXDelta 属性为动画结束时 X坐标上的位置
- fromYDelta 属性为动画起始时 Y坐标上的位置
- toYDelta 属性为动画结束时 Y坐标上的位置
- 注意:
- 没有指定fromXType toXType fromYType toYType 时候,
- 默认是以自己为相对参照物
- 长整型值:
- duration 属性为动画持续时间
- 说明: 时间以毫秒为单位
- -->
- </set>
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"><translateandroid:fromXDelta="30"android:toXDelta="-80"android:fromYDelta="30"android:toYDelta="300"android:duration="2000"/><!-- translate 位置转移动画效果整型值:fromXDelta 属性为动画起始时 X坐标上的位置 toXDelta 属性为动画结束时 X坐标上的位置fromYDelta 属性为动画起始时 Y坐标上的位置toYDelta 属性为动画结束时 Y坐标上的位置注意:没有指定fromXType toXType fromYType toYType 时候,默认是以自己为相对参照物 长整型值:duration 属性为动画持续时间说明: 时间以毫秒为单位--></set>
<rotate>
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android">
- <rotate
- android:interpolator="@android:anim/accelerate_decelerate_interpolator"
- android:fromDegrees="0"
- android:toDegrees="+350"
- android:pivotX="50%"
- android:pivotY="50%"
- android:duration="3000" />
- <!-- rotate 旋转动画效果
- 属性:interpolator 指定一个动画的插入器
- 在我试验过程中,使用android.res.anim中的资源时候发现
- 有三种动画插入器:
- accelerate_decelerate_interpolator 加速-减速 动画插入器
- accelerate_interpolator 加速-动画插入器
- decelerate_interpolator 减速- 动画插入器
- 其他的属于特定的动画效果
- 浮点数型值:
- fromDegrees 属性为动画起始时物件的角度
- toDegrees 属性为动画结束时物件旋转的角度 可以大于360度
- 说明:
- 当角度为负数——表示逆时针旋转
- 当角度为正数——表示顺时针旋转
- (负数from——to正数:顺时针旋转)
- (负数from——to负数:逆时针旋转)
- (正数from——to正数:顺时针旋转)
- (正数from——to负数:逆时针旋转)
- pivotX 属性为动画相对于物件的X坐标的开始位置
- pivotY 属性为动画相对于物件的Y坐标的开始位置
- 说明: 以上两个属性值 从0%-100%中取值
- 50%为物件的X或Y方向坐标上的中点位置
- 长整型值:
- duration 属性为动画持续时间
- 说明: 时间以毫秒为单位
- -->
- </set>
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"><rotate android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:fromDegrees="0" android:toDegrees="+350" android:pivotX="50%" android:pivotY="50%" android:duration="3000" /> <!-- rotate 旋转动画效果属性:interpolator 指定一个动画的插入器在我试验过程中,使用android.res.anim中的资源时候发现有三种动画插入器:accelerate_decelerate_interpolator 加速-减速 动画插入器accelerate_interpolator 加速-动画插入器decelerate_interpolator 减速- 动画插入器其他的属于特定的动画效果浮点数型值:fromDegrees 属性为动画起始时物件的角度 toDegrees 属性为动画结束时物件旋转的角度 可以大于360度 说明:当角度为负数——表示逆时针旋转当角度为正数——表示顺时针旋转 (负数from——to正数:顺时针旋转) (负数from——to负数:逆时针旋转) (正数from——to正数:顺时针旋转) (正数from——to负数:逆时针旋转) pivotX 属性为动画相对于物件的X坐标的开始位置pivotY 属性为动画相对于物件的Y坐标的开始位置说明: 以上两个属性值 从0%-100%中取值50%为物件的X或Y方向坐标上的中点位置长整型值:duration 属性为动画持续时间说明: 时间以毫秒为单位--></set>
如何使用XML中的动画效果
- public static Animation loadAnimation (Context context, int id)
- //第一个参数Context为程序的上下文
- //第二个参数id为动画XML文件的引用
- //例子:
- myAnimation= AnimationUtils.loadAnimation(this,R.anim.my_action);
- //使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件
public static Animation loadAnimation (Context context, int id) //第一个参数Context为程序的上下文 //第二个参数id为动画XML文件的引用//例子:myAnimation= AnimationUtils.loadAnimation(this,R.anim.my_action);//使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件
如何在Java代码中定义动画
- //在代码中定义 动画实例对象
- private Animation myAnimation_Alpha;
- private Animation myAnimation_Scale;
- private Animation myAnimation_Translate;
- private Animation myAnimation_Rotate;
- //根据各自的构造方法来初始化一个实例对象
- myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);
- myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,
- Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
- myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f);
- myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,
- Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
//在代码中定义 动画实例对象private Animation myAnimation_Alpha;private Animation myAnimation_Scale;private Animation myAnimation_Translate;private Animation myAnimation_Rotate;//根据各自的构造方法来初始化一个实例对象myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f);myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
Android动画解析--JavaCode
AlphaAnimation
① AlphaAnimation类对象定义
private AlphaAnimation myAnimation_Alpha;
② AlphaAnimation类对象构造
- AlphaAnimation(float fromAlpha, float toAlpha)
- //第一个参数fromAlpha为 动画开始时候透明度
- //第二个参数toAlpha为 动画结束时候透明度
- myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);
- //说明:
- // 0.0表示完全透明
- // 1.0表示完全不透明
AlphaAnimation(float fromAlpha, float toAlpha) //第一个参数fromAlpha为 动画开始时候透明度//第二个参数toAlpha为 动画结束时候透明度myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);//说明: // 0.0表示完全透明// 1.0表示完全不透明
③ 设置动画持续时间
myAnimation_Alpha.setDuration(5000);//设置时间持续时间为 5000毫秒
ScaleAnimation
① ScaleAnimation类对象定义
private AlphaAnimation myAnimation_Alpha;
② ScaleAnimation类对象构造
- ScaleAnimation(float fromX, float toX, float fromY, float toY,
- int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
- //第一个参数fromX为动画起始时 X坐标上的伸缩尺寸
- //第二个参数toX为动画结束时 X坐标上的伸缩尺寸
- //第三个参数fromY为动画起始时Y坐标上的伸缩尺寸
- //第四个参数toY为动画结束时Y坐标上的伸缩尺寸
- /*说明:
- 以上四种属性值
- 0.0表示收缩到没有
- 1.0表示正常无伸缩
- 值小于1.0表示收缩
- 值大于1.0表示放大
- */
- //第五个参数pivotXType为动画在X轴相对于物件位置类型
- //第六个参数pivotXValue为动画相对于物件的X坐标的开始位置
- //第七个参数pivotXType为动画在Y轴相对于物件位置类型
- //第八个参数pivotYValue为动画相对于物件的Y坐标的开始位置
- myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,
- Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) //第一个参数fromX为动画起始时 X坐标上的伸缩尺寸 //第二个参数toX为动画结束时 X坐标上的伸缩尺寸 //第三个参数fromY为动画起始时Y坐标上的伸缩尺寸 //第四个参数toY为动画结束时Y坐标上的伸缩尺寸 /*说明:以上四种属性值 0.0表示收缩到没有 1.0表示正常无伸缩 值小于1.0表示收缩 值大于1.0表示放大*///第五个参数pivotXType为动画在X轴相对于物件位置类型 //第六个参数pivotXValue为动画相对于物件的X坐标的开始位置//第七个参数pivotXType为动画在Y轴相对于物件位置类型 //第八个参数pivotYValue为动画相对于物件的Y坐标的开始位置myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
③ 设置动画持续时间
myAnimation_Scale.setDuration(700);//设置时间持续时间为 700毫秒
TranslateAnimation
① TranslateAnimation类对象定义
private AlphaAnimation myAnimation_Alpha;
② TranslateAnimation类对象构造
- TranslateAnimation(float fromXDelta, float toXDelta,
- float fromYDelta, float toYDelta)
- //第一个参数fromXDelta为动画起始时 X坐标上的移动位置
- //第二个参数toXDelta为动画结束时 X坐标上的移动位置
- //第三个参数fromYDelta为动画起始时Y坐标上的移动位置
- //第四个参数toYDelta为动画结束时Y坐标上的移动位置
TranslateAnimation(float fromXDelta, float toXDelta,float fromYDelta, float toYDelta) //第一个参数fromXDelta为动画起始时 X坐标上的移动位置 //第二个参数toXDelta为动画结束时 X坐标上的移动位置 //第三个参数fromYDelta为动画起始时Y坐标上的移动位置 //第四个参数toYDelta为动画结束时Y坐标上的移动位置
③ 设置动画持续时间
myAnimation_Translate.setDuration(2000);//设置时间持续时间为 2000毫秒
RotateAnimation
① RotateAnimation类对象定义
private AlphaAnimation myAnimation_Alpha;
② RotateAnimation类对象构造
- RotateAnimation(float fromDegrees, float toDegrees,
- int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
- //第一个参数fromDegrees为动画起始时的旋转角度
- //第二个参数toDegrees为动画旋转到的角度
- //第三个参数pivotXType为动画在X轴相对于物件位置类型
- //第四个参数pivotXValue为动画相对于物件的X坐标的开始位置
- //第五个参数pivotXType为动画在Y轴相对于物件位置类型
- //第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置
- myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,
- Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)//第一个参数fromDegrees为动画起始时的旋转角度 //第二个参数toDegrees为动画旋转到的角度 //第三个参数pivotXType为动画在X轴相对于物件位置类型 //第四个参数pivotXValue为动画相对于物件的X坐标的开始位置//第五个参数pivotXType为动画在Y轴相对于物件位置类型 //第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
③ 设置动画持续时间
myAnimation_Rotate.setDuration(3000);//设置时间持续时间为 3000毫秒
如何使用Java代码中的动画效果
使用从View父类继承过来的方法startAnimation()来为View或是子类View等等添加一个动画效果
public void startAnimation (Animation animation)
去除ListView滑到顶部和底部时边缘的黑色阴影:
android:fadingEdge="none"
去除拖动时默认的黑色背景:
android:cacheColorHint="#00000000"
去除选中时的黄色底色:
android:listSelector="#00000000"
去除行与行之间的黑线:
msgList.setDivider(null);
ListView刷新后自动滚到最底部:
msgList.setSelection(msgList.getAdapter().getCount()-1);
是否感觉代码区域太小了?试试这个插件,下载后复制到Eclipse的plugins目录,重启后按Ctrl+Alt+Z看下效果
- cn.pande.eclipsex.fullscreen.win32_1.0.6.jar (7 KB)
- 下载次数: 3
Android权限大全
访问登记属性 | android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 |
获取错略位置 | android.permission.ACCESS_COARSE_LOCATION,通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米 |
获取精确位置 | android.permission.ACCESS_FINE_LOCATION,通过GPS芯片接收卫星的定位信息,定位精度达10米以内 |
访问定位额外命令 | android.permission.ACCESS_LOCATION_EXTRA_COMMANDS,允许程序访问额外的定位提供者指令 |
获取模拟定位信息 | android.permission.ACCESS_MOCK_LOCATION,获取模拟定位信息,一般用于帮助开发者调试应用 |
获取网络状态 | android.permission.ACCESS_NETWORK_STATE,获取网络信息状态,如当前的网络连接是否有效 |
访问Surface Flinger | android.permission.ACCESS_SURFACE_FLINGER,Android平台上底层的图形显示支持,一般用于游戏或照相机预览界面和底层模式的屏幕截图 |
获取WiFi状态 | android.permission.ACCESS_WIFI_STATE,获取当前WiFi接入的状态以及WLAN热点的信息 |
账户管理 | android.permission.ACCOUNT_MANAGER,获取账户验证信息,主要为GMail账户信息,只有系统级进程才能访问的权限 |
验证账户 | android.permission.AUTHENTICATE_ACCOUNTS,允许一个程序通过账户验证方式访问账户管理ACCOUNT_MANAGER相关信息 |
电量统计 | android.permission.BATTERY_STATS,获取电池电量统计信息 |
绑定小插件 | android.permission.BIND_APPWIDGET,允许一个程序告诉appWidget服务需要访问小插件的数据库,只有非常少的应用才用到此权限 |
绑定设备管理 | android.permission.BIND_DEVICE_ADMIN,请求系统管理员接收者receiver,只有系统才能使用 |
绑定输入法 | android.permission.BIND_INPUT_METHOD ,请求InputMethodService服务,只有系统才能使用 |
绑定RemoteView | android.permission.BIND_REMOTEVIEWS,必须通过RemoteViewsService服务来请求,只有系统才能用 |
绑定壁纸 | android.permission.BIND_WALLPAPER,必须通过WallpaperService服务来请求,只有系统才能用 |
使用蓝牙 | android.permission.BLUETOOTH,允许程序连接配对过的蓝牙设备 |
蓝牙管理 | android.permission.BLUETOOTH_ADMIN,允许程序进行发现和配对新的蓝牙设备 |
变成砖头 | android.permission.BRICK,能够禁用手机,非常危险,顾名思义就是让手机变成砖头 |
应用删除时广播 | android.permission.BROADCAST_PACKAGE_REMOVED,当一个应用在删除时触发一个广播 |
收到短信时广播 | android.permission.BROADCAST_SMS,当收到短信时触发一个广播 |
连续广播 | android.permission.BROADCAST_STICKY,允许一个程序收到广播后快速收到下一个广播 |
WAP PUSH广播 | android.permission.BROADCAST_WAP_PUSH,WAP PUSH服务收到后触发一个广播 |
拨打电话 | android.permission.CALL_PHONE,允许程序从非系统拨号器里输入电话号码 |
通话权限 | android.permission.CALL_PRIVILEGED,允许程序拨打电话,替换系统的拨号器界面 |
拍照权限 | android.permission.CAMERA,允许访问摄像头进行拍照 |
改变组件状态 | android.permission.CHANGE_COMPONENT_ENABLED_STATE,改变组件是否启用状态 |
改变配置 | android.permission.CHANGE_CONFIGURATION,允许当前应用改变配置,如定位 |
改变网络状态 | android.permission.CHANGE_NETWORK_STATE,改变网络状态如是否能联网 |
改变WiFi多播状态 | android.permission.CHANGE_WIFI_MULTICAST_STATE,改变WiFi多播状态 |
改变WiFi状态 | android.permission.CHANGE_WIFI_STATE,改变WiFi状态 |
清除应用缓存 | android.permission.CLEAR_APP_CACHE,清除应用缓存 |
清除用户数据 | android.permission.CLEAR_APP_USER_DATA,清除应用的用户数据 |
底层访问权限 | android.permission.CWJ_GROUP,允许CWJ账户组访问底层信息 |
手机优化大师扩展权限 | android.permission.CELL_PHONE_MASTER_EX,手机优化大师扩展权限 |
控制定位更新 | android.permission.CONTROL_LOCATION_UPDATES,允许获得移动网络定位信息改变 |
删除缓存文件 | android.permission.DELETE_CACHE_FILES,允许应用删除缓存文件 |
删除应用 | android.permission.DELETE_PACKAGES,允许程序删除应用 |
电源管理 | android.permission.DEVICE_POWER,允许访问底层电源管理 |
应用诊断 | android.permission.DIAGNOSTIC,允许程序到RW到诊断资源 |
禁用键盘锁 | android.permission.DISABLE_KEYGUARD,允许程序禁用键盘锁 |
转存系统信息 | android.permission.DUMP,允许程序获取系统dump信息从系统服务 |
状态栏控制 | android.permission.EXPAND_STATUS_BAR,允许程序扩展或收缩状态栏 |
工厂测试模式 | android.permission.FACTORY_TEST,允许程序运行工厂测试模式 |
使用闪光灯 | android.permission.FLASHLIGHT,允许访问闪光灯 |
强制后退 | android.permission.FORCE_BACK,允许程序强制使用back后退按键,无论Activity是否在顶层 |
访问账户Gmail列表 | android.permission.GET_ACCOUNTS,访问GMail账户列表 |
获取应用大小 | android.permission.GET_PACKAGE_SIZE,获取应用的文件大小 |
获取任务信息 | android.permission.GET_TASKS,允许程序获取当前或最近运行的应用 |
允许全局搜索 | android.permission.GLOBAL_SEARCH,允许程序使用全局搜索功能 |
硬件测试 | android.permission.HARDWARE_TEST,访问硬件辅助设备,用于硬件测试 |
注射事件 | android.permission.INJECT_EVENTS,允许访问本程序的底层事件,获取按键、轨迹球的事件流 |
安装定位提供 | android.permission.INSTALL_LOCATION_PROVIDER,安装定位提供 |
安装应用程序 | android.permission.INSTALL_PACKAGES,允许程序安装应用 |
内部系统窗口 | android.permission.INTERNAL_SYSTEM_WINDOW,允许程序打开内部窗口,不对第三方应用程序开放此权限 |
访问网络 | android.permission.INTERNET,访问网络连接,可能产生GPRS流量 |
结束后台进程 | android.permission.KILL_BACKGROUND_PROCESSES,允许程序调用killBackgroundProcesses(String).方法结束后台进程 |
管理账户 | android.permission.MANAGE_ACCOUNTS,允许程序管理AccountManager中的账户列表 |
管理程序引用 | android.permission.MANAGE_APP_TOKENS,管理创建、摧毁、Z轴顺序,仅用于系统 |
高级权限 | android.permission.MTWEAK_USER,允许mTweak用户访问高级系统权限 |
社区权限 | android.permission.MTWEAK_FORUM,允许使用mTweak社区权限 |
软格式化 | android.permission.MASTER_CLEAR,允许程序执行软格式化,删除系统配置信息 |
修改声音设置 | android.permission.MODIFY_AUDIO_SETTINGS,修改声音设置信息 |
修改电话状态 | android.permission.MODIFY_PHONE_STATE,修改电话状态,如飞行模式,但不包含替换系统拨号器界面 |
格式化文件系统 | android.permission.MOUNT_FORMAT_FILESYSTEMS,格式化可移动文件系统,比如格式化清空SD卡 |
挂载文件系统 | android.permission.MOUNT_UNMOUNT_FILESYSTEMS,挂载、反挂载外部文件系统 |
允许NFC通讯 | android.permission.NFC,允许程序执行NFC近距离通讯操作,用于移动支持 |
永久Activity | android.permission.PERSISTENT_ACTIVITY,创建一个永久的Activity,该功能标记为将来将被移除 |
处理拨出电话 | android.permission.PROCESS_OUTGOING_CALLS,允许程序监视,修改或放弃播出电话 |
读取日程提醒 | android.permission.READ_CALENDAR,允许程序读取用户的日程信息 |
读取联系人 | android.permission.READ_CONTACTS,允许应用访问联系人通讯录信息 |
屏幕截图 | android.permission.READ_FRAME_BUFFER,读取帧缓存用于屏幕截图 |
读取收藏夹和历史记录 | com.android.browser.permission.READ_HISTORY_BOOKMARKS,读取浏览器收藏夹和历史记录 |
读取输入状态 | android.permission.READ_INPUT_STATE,读取当前键的输入状态,仅用于系统 |
读取系统日志 | android.permission.READ_LOGS,读取系统底层日志 |
读取电话状态 | android.permission.READ_PHONE_STATE,访问电话状态 |
读取短信内容 | android.permission.READ_SMS,读取短信内容 |
读取同步设置 | android.permission.READ_SYNC_SETTINGS,读取同步设置,读取Google在线同步设置 |
读取同步状态 | android.permission.READ_SYNC_STATS,读取同步状态,获得Google在线同步状态 |
重启设备 | android.permission.REBOOT,允许程序重新启动设备 |
开机自动允许 | android.permission.RECEIVE_BOOT_COMPLETED,允许程序开机自动运行 |
接收彩信 | android.permission.RECEIVE_MMS,接收彩信 |
接收短信 | android.permission.RECEIVE_SMS,接收短信 |
接收Wap Push | android.permission.RECEIVE_WAP_PUSH,接收WAP PUSH信息 |
录音 | android.permission.RECORD_AUDIO,录制声音通过手机或耳机的麦克 |
排序系统任务 | android.permission.REORDER_TASKS,重新排序系统Z轴运行中的任务 |
结束系统任务 | android.permission.RESTART_PACKAGES,结束任务通过restartPackage(String)方法,该方式将在外来放弃 |
发送短信 | android.permission.SEND_SMS,发送短信 |
设置Activity观察其 | android.permission.SET_ACTIVITY_WATCHER,设置Activity观察器一般用于monkey测试 |
设置闹铃提醒 | com.android.alarm.permission.SET_ALARM,设置闹铃提醒 |
设置总是退出 | android.permission.SET_ALWAYS_FINISH,设置程序在后台是否总是退出 |
设置动画缩放 | android.permission.SET_ANIMATION_SCALE,设置全局动画缩放 |
设置调试程序 | android.permission.SET_DEBUG_APP,设置调试程序,一般用于开发 |
设置屏幕方向 | android.permission.SET_ORIENTATION,设置屏幕方向为横屏或标准方式显示,不用于普通应用 |
设置应用参数 | android.permission.SET_PREFERRED_APPLICATIONS,设置应用的参数,已不再工作具体查看addPackageToPreferred(String) 介绍 |
设置进程限制 | android.permission.SET_PROCESS_LIMIT,允许程序设置最大的进程数量的限制 |
设置系统时间 | android.permission.SET_TIME,设置系统时间 |
设置系统时区 | android.permission.SET_TIME_ZONE,设置系统时区 |
设置桌面壁纸 | android.permission.SET_WALLPAPER,设置桌面壁纸 |
设置壁纸建议 | android.permission.SET_WALLPAPER_HINTS,设置壁纸建议 |
发送永久进程信号 | android.permission.SIGNAL_PERSISTENT_PROCESSES,发送一个永久的进程信号 |
状态栏控制 | android.permission.STATUS_BAR,允许程序打开、关闭、禁用状态栏 |
访问订阅内容 | android.permission.SUBSCRIBED_FEEDS_READ,访问订阅信息的数据库 |
写入订阅内容 | android.permission.SUBSCRIBED_FEEDS_WRITE,写入或修改订阅内容的数据库 |
显示系统窗口 | android.permission.SYSTEM_ALERT_WINDOW,显示系统窗口 |
更新设备状态 | android.permission.UPDATE_DEVICE_STATS,更新设备状态 |
使用证书 | android.permission.USE_CREDENTIALS,允许程序请求验证从AccountManager |
使用SIP视频 | android.permission.USE_SIP,允许程序使用SIP视频服务 |
使用振动 | android.permission.VIBRATE,允许振动 |
唤醒锁定 | android.permission.WAKE_LOCK,允许程序在手机屏幕关闭后后台进程仍然运行 |
写入GPRS接入点设置 | android.permission.WRITE_APN_SETTINGS,写入网络GPRS接入点设置 |
写入日程提醒 | android.permission.WRITE_CALENDAR,写入日程,但不可读取 |
写入联系人 | android.permission.WRITE_CONTACTS,写入联系人,但不可读取 |
写入外部存储 | android.permission.WRITE_EXTERNAL_STORAGE,允许程序写入外部存储,如SD卡上写文件 |
写入Google地图数据 | android.permission.WRITE_GSERVICES,允许程序写入Google Map服务数据 |
写入收藏夹和历史记录 | com.android.browser.permission.WRITE_HISTORY_BOOKMARKS,写入浏览器历史记录或收藏夹,但不可读取 |
读写系统敏感设置 | android.permission.WRITE_SECURE_SETTINGS,允许程序读写系统安全敏感的设置项 |
读写系统设置 | android.permission.WRITE_SETTINGS,允许读写系统设置项 |
编写短信 | android.permission.WRITE_SMS,允许编写短信 |
写入在线同步设置 | android.permission.WRITE_SYNC_SETTINGS,写入Google在线同步设置 |
使用多个Activity首先在AndroidManifest.xml文件中声明:
<activity android:name="com.yaku.B"/>
如有A和B两个Activity,由A打开B,并传递参数给B:
A Activity
- //打开 B Activity
- Intent intent = new Intent(A.this, B.class);//为Intent设置要激活的组件
- /*intent.putExtra("name", "小九九");
- intent.putExtra("age", 26);*/
- Bundle bundle = new Bundle();
- bundle.putString("name", "小九九");
- bundle.putInt("age", 26);
- intent.putExtras(bundle);
- //写法一 intent.setClass(A.this, B.class);//设置要激活的组件
- //写法二 intent.setComponent(new ComponentName(A.this, B.class));//设置要激活的组件
- startActivity(intent);
//打开 B ActivityIntent intent = new Intent(A.this, B.class);//为Intent设置要激活的组件/*intent.putExtra("name", "小九九");intent.putExtra("age", 26);*/Bundle bundle = new Bundle();bundle.putString("name", "小九九");bundle.putInt("age", 26);intent.putExtras(bundle);//写法一 intent.setClass(A.this, B.class);//设置要激活的组件//写法二 intent.setComponent(new ComponentName(A.this, B.class));//设置要激活的组件startActivity(intent);
B Activity 得到参数:
- Intent intent = this.getIntent();//得到激活它的Intent
- String name = intent.getStringExtra("name");
- int age = intent.getExtras().getInt("age");//第二种写法
Intent intent = this.getIntent();//得到激活它的IntentString name = intent.getStringExtra("name");int age = intent.getExtras().getInt("age");//第二种写法
B 处理完后要返回结果给A 则不能使用startActivity(intent); 来启动B
而是startActivityForResult(intent, 100); 第二个参数为请求码。
同时A要重写onActivityResult 方法,该方法为系统自动调用。如:
A Activity:
- public void onCreate(Bundle savedInstanceState) {
- Intent intent = new Intent(A.this, B.class);//为Intent设置要激活的组件
- /*intent.putExtra("name", "小九九");
- intent.putExtra("age", 26);*/
- Bundle bundle = new Bundle();
- bundle.putString("name", "小九九");
- bundle.putInt("age", 26);
- intent.putExtras(bundle);
- startActivityForResult(intent, 100);//第二个参数为设置的请求码
- }
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- Toast.makeText(this, data.getStringExtra("result"), 1).show();//得到返回结果
- super.onActivityResult(requestCode, resultCode, data);
- }
public void onCreate(Bundle savedInstanceState) { Intent intent = new Intent(A.this, B.class);//为Intent设置要激活的组件 /*intent.putExtra("name", "小九九"); intent.putExtra("age", 26);*/ Bundle bundle = new Bundle(); bundle.putString("name", "小九九"); bundle.putInt("age", 26); intent.putExtras(bundle); startActivityForResult(intent, 100);//第二个参数为设置的请求码}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { Toast.makeText(this, data.getStringExtra("result"), 1).show();//得到返回结果 super.onActivityResult(requestCode, resultCode, data);}
B Activity:
- Intent intent = new Intent();
- intent.putExtra("result", "这是处理结果");
- setResult(20, intent);//设置返回数据
- finish();//关闭activity
Intent intent = new Intent();intent.putExtra("result", "这是处理结果");setResult(20, intent);//设置返回数据finish();//关闭activity
首先添加访问Internet权限:
<uses-permission android:name="android.permission.INTERNET"/>
示例代码:
- public static boolean sendGetRequest(String path,
- Map<String, String> params, String enc) throws Exception{
- StringBuilder sb = new StringBuilder(path);
- sb.append('?');
- //?method=save&title=12345678&timelength=26&
- //迭代Map拼接请求参数
- for(Map.Entry<String, String> entry : params.entrySet()){
- sb.append(entry.getKey()).append('=')
- .append(URLEncoder.encode(entry.getValue(), enc)).append('&');
- }
- sb.deleteCharAt(sb.length()-1);//删除最后一个"&"
- URL url = new URL(sb.toString());
- HttpURLConnection conn = (HttpURLConnection)url.openConnection();
- conn.setRequestMethod("GET");
- conn.setConnectTimeout(5 * 1000);
- if(conn.getResponseCode()==200){
- return true;
- }
- return false;
- }
- public static boolean sendPostRequest(String path,
- Map<String, String> params, String enc) throws Exception{
- // title=dsfdsf&timelength=23&method=save
- StringBuilder sb = new StringBuilder();
- if(params!=null && !params.isEmpty()){
- //迭代Map拼接请求参数
- for(Map.Entry<String, String> entry : params.entrySet()){
- sb.append(entry.getKey()).append('=')
- .append(URLEncoder.encode(entry.getValue(), enc)).append('&');
- }
- sb.deleteCharAt(sb.length()-1);//删除最后一个"&"
- }
- byte[] entitydata = sb.toString().getBytes();//得到实体的二进制数据
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection)url.openConnection();
- conn.setRequestMethod("POST");
- conn.setConnectTimeout(5 * 1000);
- //如果通过post提交数据,必须设置允许对外输出数据
- conn.setDoOutput(true);
- //此两参数必须设置
- //Content-Type: application/x-www-form-urlencoded
- //Content-Length: 38
- conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
- conn.setRequestProperty("Content-Length", String.valueOf(entitydata.length));
- OutputStream outStream = conn.getOutputStream();
- outStream.write(entitydata);
- outStream.flush();
- outStream.close();
- if(conn.getResponseCode()==200){
- return true;
- }
- return false;
- }
- //HttpClient组件 SSL HTTPS Cookie
- public static boolean sendRequestFromHttpClient(String path,
- Map<String, String> params, String enc) throws Exception{
- List<NameValuePair> paramPairs = new ArrayList<NameValuePair>();
- if(params!=null && !params.isEmpty()){
- for(Map.Entry<String, String> entry : params.entrySet()){
- paramPairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
- }
- }
- //得到经过编码过后的实体数据
- UrlEncodedFormEntity entitydata = new UrlEncodedFormEntity(paramPairs, enc);
- HttpPost post = new HttpPost(path); //form
- post.setEntity(entitydata);
- DefaultHttpClient client = new DefaultHttpClient(); //浏览器
- HttpResponse response = client.execute(post);//执行请求
- if(response.getStatusLine().getStatusCode()==200){
- return true;
- }
- return false;
- }
public static boolean sendGetRequest(String path, Map<String, String> params, String enc) throws Exception{ StringBuilder sb = new StringBuilder(path); sb.append('?'); //?method=save&title=12345678&timelength=26& //迭代Map拼接请求参数 for(Map.Entry<String, String> entry : params.entrySet()){ sb.append(entry.getKey()).append('=') .append(URLEncoder.encode(entry.getValue(), enc)).append('&'); } sb.deleteCharAt(sb.length()-1);//删除最后一个"&" URL url = new URL(sb.toString()); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5 * 1000); if(conn.getResponseCode()==200){ return true; } return false;}public static boolean sendPostRequest(String path, Map<String, String> params, String enc) throws Exception{ // title=dsfdsf&timelength=23&method=save StringBuilder sb = new StringBuilder(); if(params!=null && !params.isEmpty()){ //迭代Map拼接请求参数 for(Map.Entry<String, String> entry : params.entrySet()){ sb.append(entry.getKey()).append('=') .append(URLEncoder.encode(entry.getValue(), enc)).append('&'); } sb.deleteCharAt(sb.length()-1);//删除最后一个"&" } byte[] entitydata = sb.toString().getBytes();//得到实体的二进制数据 URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(5 * 1000); //如果通过post提交数据,必须设置允许对外输出数据 conn.setDoOutput(true); //此两参数必须设置 //Content-Type: application/x-www-form-urlencoded //Content-Length: 38 conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", String.valueOf(entitydata.length)); OutputStream outStream = conn.getOutputStream(); outStream.write(entitydata); outStream.flush(); outStream.close(); if(conn.getResponseCode()==200){ return true; } return false;}//HttpClient组件 SSL HTTPS Cookiepublic static boolean sendRequestFromHttpClient(String path, Map<String, String> params, String enc) throws Exception{ List<NameValuePair> paramPairs = new ArrayList<NameValuePair>(); if(params!=null && !params.isEmpty()){ for(Map.Entry<String, String> entry : params.entrySet()){ paramPairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); } } //得到经过编码过后的实体数据 UrlEncodedFormEntity entitydata = new UrlEncodedFormEntity(paramPairs, enc); HttpPost post = new HttpPost(path); //form post.setEntity(entitydata); DefaultHttpClient client = new DefaultHttpClient(); //浏览器 HttpResponse response = client.execute(post);//执行请求 if(response.getStatusLine().getStatusCode()==200){ return true; } return false;}
单元测试:
- public void testSendGetRequest() throws Throwable{
- //?method=save&title=12345678&timelength=26
- Map<String, String> params = new HashMap<String, String>();
- params.put("method", "save");
- params.put("title", "yaku");
- params.put("timelength", "80");
- HttpRequest.sendGetRequest("http://192.168.1.2:8080/webserver/server/manage.do", params, "UTF-8");
- }
- public void testSendPostRequest() throws Throwable{
- Map<String, String> params = new HashMap<String, String>();
- params.put("method", "save");
- params.put("title", "胡汉三");
- params.put("timelength", "80");
- HttpRequest.sendPostRequest("http://192.168.1.2:8080/webserver/server/manage.do", params, "UTF-8");
- }
- public void testSendRequestFromHttpClient() throws Throwable{
- Map<String, String> params = new HashMap<String, String>();
- params.put("method", "save");
- params.put("title", "开天");
- params.put("timelength", "80");
- HttpRequest.sendRequestFromHttpClient("http://192.168.1.2:8080/webserver/server/manage.do", params, "UTF-8");
- }
public void testSendGetRequest() throws Throwable{ //?method=save&title=12345678&timelength=26 Map<String, String> params = new HashMap<String, String>(); params.put("method", "save"); params.put("title", "yaku"); params.put("timelength", "80"); HttpRequest.sendGetRequest("http://192.168.1.2:8080/webserver/server/manage.do", params, "UTF-8");}public void testSendPostRequest() throws Throwable{ Map<String, String> params = new HashMap<String, String>(); params.put("method", "save"); params.put("title", "胡汉三"); params.put("timelength", "80"); HttpRequest.sendPostRequest("http://192.168.1.2:8080/webserver/server/manage.do", params, "UTF-8");}public void testSendRequestFromHttpClient() throws Throwable{ Map<String, String> params = new HashMap<String, String>(); params.put("method", "save"); params.put("title", "开天"); params.put("timelength", "80"); HttpRequest.sendRequestFromHttpClient("http://192.168.1.2:8080/webserver/server/manage.do", params, "UTF-8");}
Android访问网络操作。
首先在AndroidManifest.xml文件中添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
业务类ImageServer.java:
根据指定的网络图片地址获取二进制数据
- package com.yaku.service;
- import java.io.ByteArrayOutputStream;
- import java.io.InputStream;
- import java.net.HttpURLConnection;
- import java.net.URL;
- public class ImageServer {
- public static byte[] getImage(String path) throws Exception {
- //URL url = new URL("http://www.baidu.com/img/baidu_sylogo1.gif");
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection)url.openConnection();
- conn.setRequestMethod("GET");
- conn.setConnectTimeout(5 * 1000);
- InputStream inStream = conn.getInputStream();//通过输入流获取图片数据
- //获取网页上的数据,如HTML代码
- //byte[] data = readInputStream(inStream);//得到html的二进制数据
- //String html = new String(data, "gb2312");
- return readInputStream(inStream);//得到图片的二进制数据
- }
- /**
- * 从输入流中获取数据
- * @param inStream 输入流
- * @throws Exception
- */
- public static byte[] readInputStream(InputStream inStream) throws Exception{
- ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- byte[] buffer = new byte[1024];
- int len = 0;
- while( (len=inStream.read(buffer)) != -1 ){
- outStream.write(buffer, 0, len);
- }
- inStream.close();
- return outStream.toByteArray();
- }
- }
package com.yaku.service;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;public class ImageServer { public static byte[] getImage(String path) throws Exception { //URL url = new URL("http://www.baidu.com/img/baidu_sylogo1.gif"); URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5 * 1000); InputStream inStream = conn.getInputStream();//通过输入流获取图片数据 //获取网页上的数据,如HTML代码 //byte[] data = readInputStream(inStream);//得到html的二进制数据 //String html = new String(data, "gb2312"); return readInputStream(inStream);//得到图片的二进制数据 } /** * 从输入流中获取数据 * @param inStream 输入流 * @throws Exception */ public static byte[] readInputStream(InputStream inStream) throws Exception{ ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while( (len=inStream.read(buffer)) != -1 ){ outStream.write(buffer, 0, len); } inStream.close(); return outStream.toByteArray(); }}
将图片显示在手机屏幕上HttpImageActivity.java:
- package com.yaku.http;
- import com.yaku.service.ImageServer;
- import android.app.Activity;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.ImageView;
- import android.widget.Toast;
- public class HttpImageActivity extends Activity {
- private EditText path;
- private ImageView image;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- path = (EditText) this.findViewById(R.id.url);
- image = (ImageView) this.findViewById(R.id.image);
- Button button = (Button)this.findViewById(R.id.button);
- button.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- String urlPath = path.getText().toString();
- try {
- byte[] data = ImageServer.getImage(urlPath);
- //生成位图
- Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
- image.setImageBitmap(bitmap);//显示图片
- } catch (Exception e) {
- Toast.makeText(HttpImageActivity.this, R.string.error, 1).show();
- }
- }
- });
- }
- }
package com.yaku.http;import com.yaku.service.ImageServer;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.Toast;public class HttpImageActivity extends Activity { private EditText path; private ImageView image; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); path = (EditText) this.findViewById(R.id.url); image = (ImageView) this.findViewById(R.id.image); Button button = (Button)this.findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String urlPath = path.getText().toString(); try { byte[] data = ImageServer.getImage(urlPath); //生成位图 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); image.setImageBitmap(bitmap);//显示图片 } catch (Exception e) { Toast.makeText(HttpImageActivity.this, R.string.error, 1).show(); } } }); }}
ContentProvider数据共享
1.首先在AndroidManifest.xml文件中添加对外暴露的数据共享接口Content
- <provider android:name=".UserProvider" android:authorities="com.yaku.ContentProvider.userprovider"/>
<provider android:name=".UserProvider" android:authorities="com.yaku.ContentProvider.userprovider"/>
ContentProvider采用了authorities(主机名/域名)对它进行唯一标识,authorities 就是他的域名
2.Url解析
content://com.yaku.ContentProvider.userprovider/user/2
【content://】 Android定义的内容提供都的Schema
【com.yaku.ContentProvider.userprovider】 主机名或者authorities
【user】 路径
【2】 ID
示例代码:
数据结构User.java:
- package com.yaku.pojo;
- public class User {
- private int id;
- private String name;
- private int age;
- public User(int id, String name, int age) {
- super();
- this.id = id;
- this.name = name;
- this.age = age;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- @Override
- public String toString() {
- return "User [age=" + age + ", id=" + id + ", name=" + name + "]";
- }
- }
package com.yaku.pojo;public class User { private int id; private String name; private int age; public User(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User [age=" + age + ", id=" + id + ", name=" + name + "]"; }}
数据库操作DBOpenHelper.java:
- package com.yaku.db;
- import android.content.Context;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteOpenHelper;
- public class DBOpenHelper extends SQLiteOpenHelper {
- private static final String DBNAME = "yaku.db"; //数据库名称
- private static final int DBVER = 1;//数据库版本
- public DBOpenHelper(Context context) {
- super(context, DBNAME, null, DBVER);
- }
- @Override
- public void onCreate(SQLiteDatabase db) {
- String sql = "CREATE TABLE user (userid integer primary key autoincrement, name varchar(20), age integer)";
- db.execSQL(sql);//执行有更改的sql语句
- }
- @Override
- public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
- db.execSQL("DROP TABLE IF EXISTS user");
- onCreate(db);
- }
- }
package com.yaku.db;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DBOpenHelper extends SQLiteOpenHelper { private static final String DBNAME = "yaku.db"; //数据库名称 private static final int DBVER = 1;//数据库版本 public DBOpenHelper(Context context) { super(context, DBNAME, null, DBVER); } @Override public void onCreate(SQLiteDatabase db) { String sql = "CREATE TABLE user (userid integer primary key autoincrement, name varchar(20), age integer)"; db.execSQL(sql);//执行有更改的sql语句 } @Override public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { db.execSQL("DROP TABLE IF EXISTS user"); onCreate(db); }}
对外共享处理类ContentProviderUser.java:
- package com.yaku.ContentProvider;
- import com.yaku.db.DBOpenHelper;
- import android.content.ContentProvider;
- import android.content.ContentUris;
- import android.content.ContentValues;
- import android.content.UriMatcher;
- import android.database.Cursor;
- import android.database.sqlite.SQLiteDatabase;
- import android.net.Uri;
- public class ContentProviderUser extends ContentProvider {
- private DBOpenHelper dbOpenHelper;
- //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
- private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
- private static final int USERS = 1;
- private static final int USER = 2;
- static{
- //如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user路径,返回匹配码为1
- MATCHER.addURI("com.yaku.ContentProvider.userprovider", "user", USERS);
- //如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user/123路径,返回匹配码为2
- MATCHER.addURI("com.yaku.ContentProvider.userprovider", "user/#", USER);//#号为通配符
- }
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
- int count = 0;
- switch (MATCHER.match(uri)) {
- case USERS:
- count = db.delete("user", selection, selectionArgs);
- return count;
- case USER:
- //ContentUris类用于获取Uri路径后面的ID部分
- long id = ContentUris.parseId(uri);
- String where = "userid = "+ id;
- if(selection!=null && !"".equals(selection)){
- where = selection + " and " + where;
- }
- count = db.delete("user", where, selectionArgs);
- return count;
- default:
- throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
- }
- }
- /**
- * 该方法用于返回当前Url所代表数据的MIME类型。
- * 如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头
- * 如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头
- */
- @Override
- public String getType(Uri uri) {
- switch (MATCHER.match(uri)) {
- case USERS:
- return "vnd.android.cursor.dir/user";
- case USER:
- return "vnd.android.cursor.item/user";
- default:
- throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
- }
- }
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
- switch (MATCHER.match(uri)) {
- case USERS:
- long rowid = db.insert("user", "name", values);
- Uri insertUri = ContentUris.withAppendedId(uri, rowid);//得到代表新增记录的Uri
- this.getContext().getContentResolver().notifyChange(uri, null);
- return insertUri;
- default:
- throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
- }
- }
- @Override
- public boolean onCreate() {
- this.dbOpenHelper = new DBOpenHelper(this.getContext());
- return false;
- }
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
- SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
- switch (MATCHER.match(uri)) {
- case USERS:
- return db.query("user", projection, selection, selectionArgs, null, null, sortOrder);
- case USER:
- long id = ContentUris.parseId(uri);
- String where = "userid = "+ id;
- if(selection!=null && !"".equals(selection)){
- where = selection + " and " + where;
- }
- return db.query("user", projection, where, selectionArgs, null, null, sortOrder);
- default:
- throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
- }
- }
- @Override
- public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
- int count = 0;
- switch (MATCHER.match(uri)) {
- case USERS:
- count = db.update("person", values, selection, selectionArgs);
- return count;
- case USER:
- long id = ContentUris.parseId(uri);
- String where = "userid = "+ id;
- if(selection!=null && !"".equals(selection)){
- where = selection + " and " + where;
- }
- count = db.update("user", values, where, selectionArgs);
- return count;
- default:
- throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
- }
- }
- }
package com.yaku.ContentProvider;import com.yaku.db.DBOpenHelper;import android.content.ContentProvider;import android.content.ContentUris;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.net.Uri;public class ContentProviderUser extends ContentProvider { private DBOpenHelper dbOpenHelper; //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码 private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH); private static final int USERS = 1; private static final int USER = 2; static{ //如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user路径,返回匹配码为1 MATCHER.addURI("com.yaku.ContentProvider.userprovider", "user", USERS); //如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user/123路径,返回匹配码为2 MATCHER.addURI("com.yaku.ContentProvider.userprovider", "user/#", USER);//#号为通配符 } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); int count = 0; switch (MATCHER.match(uri)) { case USERS: count = db.delete("user", selection, selectionArgs); return count; case USER: //ContentUris类用于获取Uri路径后面的ID部分 long id = ContentUris.parseId(uri); String where = "userid = "+ id; if(selection!=null && !"".equals(selection)){ where = selection + " and " + where; } count = db.delete("user", where, selectionArgs); return count; default: throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString()); } } /** * 该方法用于返回当前Url所代表数据的MIME类型。 * 如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头 * 如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头 */ @Override public String getType(Uri uri) { switch (MATCHER.match(uri)) { case USERS: return "vnd.android.cursor.dir/user"; case USER: return "vnd.android.cursor.item/user"; default: throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString()); } } @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); switch (MATCHER.match(uri)) { case USERS: long rowid = db.insert("user", "name", values); Uri insertUri = ContentUris.withAppendedId(uri, rowid);//得到代表新增记录的Uri this.getContext().getContentResolver().notifyChange(uri, null); return insertUri; default: throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString()); } } @Override public boolean onCreate() { this.dbOpenHelper = new DBOpenHelper(this.getContext()); return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); switch (MATCHER.match(uri)) { case USERS: return db.query("user", projection, selection, selectionArgs, null, null, sortOrder); case USER: long id = ContentUris.parseId(uri); String where = "userid = "+ id; if(selection!=null && !"".equals(selection)){ where = selection + " and " + where; } return db.query("user", projection, where, selectionArgs, null, null, sortOrder); default: throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString()); } } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); int count = 0; switch (MATCHER.match(uri)) { case USERS: count = db.update("person", values, selection, selectionArgs); return count; case USER: long id = ContentUris.parseId(uri); String where = "userid = "+ id; if(selection!=null && !"".equals(selection)){ where = selection + " and " + where; } count = db.update("user", values, where, selectionArgs); return count; default: throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString()); } }}
单元测试类(在另一个应用中):
- package com.yaku.ContentProvider;
- import android.content.ContentResolver;
- import android.content.ContentValues;
- import android.database.Cursor;
- import android.net.Uri;
- import android.test.AndroidTestCase;
- import android.util.Log;
- /**
- * 对ContentProvider工程中的ContentProviderActivity进行单元测试
- */
- public class ContentProviderActivityTest extends AndroidTestCase {
- private static final String TAG = "ContentProvider";
- //往内容提供者添加数据
- public void testInsert() throws Throwable{
- ContentResolver contentResolver = this.getContext().getContentResolver();
- Uri insertUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
- ContentValues values = new ContentValues();
- values.put("name", "道长");
- values.put("age", 86);
- Uri uri = contentResolver.insert(insertUri, values);
- Log.i(TAG, uri.toString());
- }
- //更新内容提供者中的数据
- public void testUpdate() throws Throwable{
- ContentResolver contentResolver = this.getContext().getContentResolver();
- Uri updateUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1");
- ContentValues values = new ContentValues();
- values.put("name", "青眉道长");
- contentResolver.update(updateUri, values, null, null);
- }
- //从内容提供者中删除数据
- public void testDelete() throws Throwable{
- ContentResolver contentResolver = this.getContext().getContentResolver();
- Uri deleteUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1");
- contentResolver.delete(deleteUri, null, null);
- }
- //获取内容提供者中的数据
- public void testFind() throws Throwable{
- ContentResolver contentResolver = this.getContext().getContentResolver();
- Uri selectUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
- Cursor cursor = contentResolver.query(selectUri, null, null, null, "userid desc");
- while(cursor.moveToNext()){
- int id = cursor.getInt(cursor.getColumnIndex("userid"));
- String name = cursor.getString(cursor.getColumnIndex("name"));
- int age = cursor.getInt(cursor.getColumnIndex("age"));
- Log.i(TAG, "id="+ id + ",name="+ name+ ",age="+ age);
- }
- }
- }
package com.yaku.ContentProvider;import android.content.ContentResolver;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.test.AndroidTestCase;import android.util.Log;/** * 对ContentProvider工程中的ContentProviderActivity进行单元测试 */public class ContentProviderActivityTest extends AndroidTestCase { private static final String TAG = "ContentProvider"; //往内容提供者添加数据 public void testInsert() throws Throwable{ ContentResolver contentResolver = this.getContext().getContentResolver(); Uri insertUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user"); ContentValues values = new ContentValues(); values.put("name", "道长"); values.put("age", 86); Uri uri = contentResolver.insert(insertUri, values); Log.i(TAG, uri.toString()); } //更新内容提供者中的数据 public void testUpdate() throws Throwable{ ContentResolver contentResolver = this.getContext().getContentResolver(); Uri updateUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1"); ContentValues values = new ContentValues(); values.put("name", "青眉道长"); contentResolver.update(updateUri, values, null, null); } //从内容提供者中删除数据 public void testDelete() throws Throwable{ ContentResolver contentResolver = this.getContext().getContentResolver(); Uri deleteUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1"); contentResolver.delete(deleteUri, null, null); } //获取内容提供者中的数据 public void testFind() throws Throwable{ ContentResolver contentResolver = this.getContext().getContentResolver(); Uri selectUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user"); Cursor cursor = contentResolver.query(selectUri, null, null, null, "userid desc"); while(cursor.moveToNext()){ int id = cursor.getInt(cursor.getColumnIndex("userid")); String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); Log.i(TAG, "id="+ id + ",name="+ name+ ",age="+ age); } } }
监听数据的变化:
- <SPAN style="FONT-SIZE: medium">package com.yaku.ContentProvider;
- import android.content.ContentResolver;
- import android.content.ContentValues;
- import android.database.Cursor;
- import android.net.Uri;
- import android.test.AndroidTestCase;
- import android.util.Log;
- /**
- * 监听数据变化
- */
- public class OtherContentProviderTest extends AndroidTestCase {
- private static final String TAG = "OtherContentProvider";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Uri insertUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
- ContentResolver contentResolver = this.getContentResolver();
- //对指定uri进行监听,如果该uri代表的数据发生变化,就会调用PersonObserver中的onChange()
- contentResolver.registerContentObserver(insertUri, true, new PersonObserver(new Handler()));
- }
- private final class PersonObserver extends ContentObserver{
- public PersonObserver(Handler handler) {
- super(handler);
- }
- @Override
- public void onChange(boolean selfChange) {
- ContentResolver contentResolver = getContentResolver();
- Uri selectUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
- Cursor cursor = contentResolver.query(selectUri, null, null, null, "userid desc");
- while(cursor.moveToNext()){
- int id = cursor.getInt(cursor.getColumnIndex("userid"));
- String name = cursor.getString(cursor.getColumnIndex("name"));
- int age = cursor.getInt(cursor.getColumnIndex("age"));
- Log.i(TAG, "id="+ id + ",name="+ name+ ",age="+ age);
- }
- }
- }
- }
- </SPAN>
package com.yaku.ContentProvider;import android.content.ContentResolver;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.test.AndroidTestCase;import android.util.Log;/** * 监听数据变化 */public class OtherContentProviderTest extends AndroidTestCase { private static final String TAG = "OtherContentProvider"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Uri insertUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user"); ContentResolver contentResolver = this.getContentResolver(); //对指定uri进行监听,如果该uri代表的数据发生变化,就会调用PersonObserver中的onChange() contentResolver.registerContentObserver(insertUri, true, new PersonObserver(new Handler())); } private final class PersonObserver extends ContentObserver{ public PersonObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { ContentResolver contentResolver = getContentResolver(); Uri selectUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user"); Cursor cursor = contentResolver.query(selectUri, null, null, null, "userid desc"); while(cursor.moveToNext()){ int id = cursor.getInt(cursor.getColumnIndex("userid")); String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); Log.i(TAG, "id="+ id + ",name="+ name+ ",age="+ age); } } }}
SharedPreferences配置文件为XML文件,路径:/data/data/<package name>/shared_prefs目录下
关键代码:
- //第一个参数用于指定该文件的名称,第二个参数指定文件的操作模式,共有四种操作模式。
- //如果希望生成的xml文件能被其他应用读和写,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。
- //另外Activity还提供了另一个getPreferences(mode)方法操作SharedPreferences,这个方法默认使用当前类不带包名的类名作为文件的名称。
- SharedPreferences perferences = getSharedPreferences("yaku", Context.MODE_PRIVATE);
- Editor edit = perferences.edit();//获得编辑器
- edit.putString("name", "我是内容");
- edit.putInt("age", 20);
- edit.commit();//提交内容
//第一个参数用于指定该文件的名称,第二个参数指定文件的操作模式,共有四种操作模式。//如果希望生成的xml文件能被其他应用读和写,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。//另外Activity还提供了另一个getPreferences(mode)方法操作SharedPreferences,这个方法默认使用当前类不带包名的类名作为文件的名称。SharedPreferences perferences = getSharedPreferences("yaku", Context.MODE_PRIVATE); Editor edit = perferences.edit();//获得编辑器edit.putString("name", "我是内容"); edit.putInt("age", 20); edit.commit();//提交内容
获取数据:
- SharedPreferences preference = getSharedPreferences("yaku", Context.MODE_PRIVATE);
- String nameStr = preference.getString("name", "");//如果取不到值就取值后面的参数
- int ageStr = preference.getInt("age", 0);
- //其他应用要访问上面应用的preference,首先需要创建上面应用的Context,然后通过Context 访问preference
- Context context = createPackageContext("cn.yaku.action", Context.CONTEXT_IGNORE_SECURITY);
- SharedPreferences perferences = context.getSharedPreferences("yaku", Context.MODE_WORLD_READABLE);
- String name = perferences.getString("name", "");
- int age = perferences.getInt("age", 0);
- //如果不通过创建Context访问其他应用的preference,也可以以读取xml文件方式直接访问其他应用preference对应的xml文件,如:
- File xmlFile = new File("/data/data/<package name>/shared_prefs/yaku.xml");
SharedPreferences preference = getSharedPreferences("yaku", Context.MODE_PRIVATE); String nameStr = preference.getString("name", "");//如果取不到值就取值后面的参数 int ageStr = preference.getInt("age", 0); //其他应用要访问上面应用的preference,首先需要创建上面应用的Context,然后通过Context 访问preference Context context = createPackageContext("cn.yaku.action", Context.CONTEXT_IGNORE_SECURITY);SharedPreferences perferences = context.getSharedPreferences("yaku", Context.MODE_WORLD_READABLE);String name = perferences.getString("name", "");int age = perferences.getInt("age", 0);//如果不通过创建Context访问其他应用的preference,也可以以读取xml文件方式直接访问其他应用preference对应的xml文件,如: File xmlFile = new File("/data/data/<package name>/shared_prefs/yaku.xml");
示例代码:
- package com.yaku.SharedPreferences;
- import com.yaku.test.R;
- import android.app.Activity;
- import android.content.Context;
- import android.content.SharedPreferences;
- import android.content.SharedPreferences.Editor;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.Toast;
- /**
- * SharedPerferences的使用
- * @author Administrator
- */
- public class ShareActivity extends Activity {
- private EditText name;
- private EditText age;
- private Button sure;
- private Button recover;
- private Button clear;
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.sharedperference);
- name = (EditText)findViewById(R.id.name);
- age = (EditText)findViewById(R.id.age);
- sure = (Button)findViewById(R.id.sure);
- recover = (Button)findViewById(R.id.recover);
- clear = (Button)findViewById(R.id.clear);
- //保存信息到yaku.xml文件
- sure.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- String nameStr = name.getText().toString();
- String ageStr = age.getText().toString();
- if(!"".equals(nameStr)&&nameStr!=null && !"".equals(ageStr)&&ageStr!=null){
- SharedPreferences perferences = getSharedPreferences("yaku", Context.MODE_PRIVATE);
- Editor edit = perferences.edit();
- edit.putString("name", nameStr);
- edit.putInt("age", Integer.parseInt(ageStr));
- edit.commit();
- Toast.makeText(ShareActivity.this, "OK", 0).show();
- }
- }
- });
- //恢复保存的数据
- recover.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- SharedPreferences preference = getSharedPreferences("yaku", Context.MODE_PRIVATE);
- String nameStr = preference.getString("name", "");//如果取不到值就取值后面的参数
- int ageStr = preference.getInt("age", 0);
- name.setText(nameStr);
- age.setText(String.valueOf(ageStr));
- }
- });
- //清除数据
- clear.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- name.setText(null);
- age.setText(null);
- }
- });
- }
- }
package com.yaku.SharedPreferences;import com.yaku.test.R;import android.app.Activity;import android.content.Context;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;/** * SharedPerferences的使用 * @author Administrator */public class ShareActivity extends Activity { private EditText name; private EditText age; private Button sure; private Button recover; private Button clear; protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.sharedperference); name = (EditText)findViewById(R.id.name); age = (EditText)findViewById(R.id.age); sure = (Button)findViewById(R.id.sure); recover = (Button)findViewById(R.id.recover); clear = (Button)findViewById(R.id.clear); //保存信息到yaku.xml文件 sure.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String nameStr = name.getText().toString(); String ageStr = age.getText().toString(); if(!"".equals(nameStr)&&nameStr!=null && !"".equals(ageStr)&&ageStr!=null){ SharedPreferences perferences = getSharedPreferences("yaku", Context.MODE_PRIVATE); Editor edit = perferences.edit(); edit.putString("name", nameStr); edit.putInt("age", Integer.parseInt(ageStr)); edit.commit(); Toast.makeText(ShareActivity.this, "OK", 0).show(); } } }); //恢复保存的数据 recover.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { SharedPreferences preference = getSharedPreferences("yaku", Context.MODE_PRIVATE); String nameStr = preference.getString("name", "");//如果取不到值就取值后面的参数 int ageStr = preference.getInt("age", 0); name.setText(nameStr); age.setText(String.valueOf(ageStr)); } }); //清除数据 clear.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { name.setText(null); age.setText(null); } }); }}
JDBC连接工厂类ConnectionFactory
- package com.yaku.util;
- import java.io.InputStream;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- import java.util.Properties;
- import javax.naming.Context;
- import javax.naming.InitialContext;
- import javax.sql.DataSource;
- /**
- * 数据库连接工厂类,专门取得数据连接的
- * @author hery
- */
- public class ConnectionFactory {
- private static Properties config = new Properties();
- static {
- InputStream in = ConnectionFactory.class.getResourceAsStream("db-config.properties");
- if (in == null) {
- throw new RuntimeException("not found the DBConfig file");
- }
- try {
- config.load(in);
- in.close();
- } catch (Exception e) {
- e.printStackTrace();
- throw new ExceptionInInitializerError("the file load fail!");
- }
- }
- public static Connection getDirectConnection() {
- Connection con = null;
- String jdbcDriver = null;
- String jdbcUrl = null;
- String userName = null;
- String password = null;
- try {
- jdbcDriver = config.getProperty("drivername");
- jdbcUrl = config.getProperty("jdbcurl");
- userName = config.getProperty("username");
- password = config.getProperty("password");
- // Class.forName("oracle.jdbc.driver.OracleDriver");
- Class.forName(jdbcDriver);
- // con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.13:1521:sta","sta01","sta02");
- con = DriverManager.getConnection(jdbcUrl, userName, password);
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return con;
- }
- public static Connection getJNDIConnection() {
- Connection con = null;
- String jndiName = config.getProperty("jndiName");
- try {
- Context context = new InitialContext();
- DataSource ds = (DataSource) context.lookup("java:comp/env/"
- + jndiName);
- con = ds.getConnection();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return con;
- }
- public static Connection getConnection() throws SQLException {
- Connection con = null;
- if (config.getProperty("jndiName") != null) {
- try {
- con = getJNDIConnection();
- } catch (Exception e) {
- e.printStackTrace();
- }
- if (con == null) {
- con = getDirectConnection();
- }
- } else {
- con = getDirectConnection();
- }
- return con;
- }
- @SuppressWarnings("static-access")
- public static void main(String args[]) throws SQLException {
- ConnectionFactory cf = new ConnectionFactory();
- System.out.println(cf.getConnection());
- }
- }
package com.yaku.util;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.Properties;import javax.naming.Context;import javax.naming.InitialContext;import javax.sql.DataSource;/** * 数据库连接工厂类,专门取得数据连接的 * @author hery */public class ConnectionFactory { private static Properties config = new Properties(); static { InputStream in = ConnectionFactory.class.getResourceAsStream("db-config.properties"); if (in == null) { throw new RuntimeException("not found the DBConfig file"); } try { config.load(in); in.close(); } catch (Exception e) { e.printStackTrace(); throw new ExceptionInInitializerError("the file load fail!"); } } public static Connection getDirectConnection() { Connection con = null; String jdbcDriver = null; String jdbcUrl = null; String userName = null; String password = null; try { jdbcDriver = config.getProperty("drivername"); jdbcUrl = config.getProperty("jdbcurl"); userName = config.getProperty("username"); password = config.getProperty("password"); // Class.forName("oracle.jdbc.driver.OracleDriver"); Class.forName(jdbcDriver); // con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.13:1521:sta","sta01","sta02"); con = DriverManager.getConnection(jdbcUrl, userName, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return con; } public static Connection getJNDIConnection() { Connection con = null; String jndiName = config.getProperty("jndiName"); try { Context context = new InitialContext(); DataSource ds = (DataSource) context.lookup("java:comp/env/" + jndiName); con = ds.getConnection(); } catch (Exception e) { e.printStackTrace(); } return con; } public static Connection getConnection() throws SQLException { Connection con = null; if (config.getProperty("jndiName") != null) { try { con = getJNDIConnection(); } catch (Exception e) { e.printStackTrace(); } if (con == null) { con = getDirectConnection(); } } else { con = getDirectConnection(); } return con; } @SuppressWarnings("static-access") public static void main(String args[]) throws SQLException { ConnectionFactory cf = new ConnectionFactory(); System.out.println(cf.getConnection()); }}
JDBC关闭工厂类CloseUtil
- package com.yaku.util;
- import java.sql.Connection;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- public class CloseUtil {
- public static void close(Statement st, Connection con) {
- if (st != null) {
- try {
- st.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- if (con != null) {
- try {
- con.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- public static void close(ResultSet rs, Statement st, Connection con) {
- if (rs != null) {
- try {
- rs.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- close(st, con);
- }
- }
package com.yaku.util;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class CloseUtil { public static void close(Statement st, Connection con) { if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if (con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close(ResultSet rs, Statement st, Connection con) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } close(st, con); }}
配置文件db-config.properties
- drivername = com.microsoft.sqlserver.jdbc.SQLServerDriver
- jdbcurl = jdbc:sqlserver://192.168.1.2:1433;DatabaseName=Test
- username = sa
- password =sa
drivername = com.microsoft.sqlserver.jdbc.SQLServerDriverjdbcurl = jdbc:sqlserver://192.168.1.2:1433;DatabaseName=Testusername = sapassword =sa
编码的时候通常要用到 JavaBean ,而在我们经常把注释写在字段上面,但生成的Get/Set方法不会生成,通过修改Eclipse源码可解决,直接上例子:
- /**
- * 员工ID
- */
- private String userid;
- /**
- * 获取员工ID
- * @return userid 员工ID
- */
- public String getUserid() {
- return userid;
- }
- /**
- * 设置员工ID
- * @param userid 员工ID
- */
- public void setUserid(String userid) {
- this.userid = userid;
- }
/** * 员工ID */private String userid;/** * 获取员工ID * @return userid 员工ID */public String getUserid() { return userid;}/** * 设置员工ID * @param userid 员工ID */public void setUserid(String userid) { this.userid = userid;}
找到Eclipse中Jar包:org.eclipse.jdt.ui_*.jar,进行备份
然后将后缀Jar改为rar,
找到org.eclipse.jdt.internal.corext.codemanipulation.GetterSetterUtil.class
直接用附件中的class文件进行替换,再将后缀改为Jar替换Eclipse的Jar包,
重启Eclipse设置注释风格:
Window->Preferences->Java->CodeStyle->Code Templates->Comments->Getters/Setters
Getters:
/** * 获取${bare_field_name} * @return ${bare_field_name} ${bare_field_name} */
Setters:
/** * 设置${bare_field_name} * @param ${bare_field_name} ${bare_field_name} */
注意:生成Get/Set方法时勾选上Generate method comments
OK,成功。
在Eclipse3.3/3.4/3.5 测试成功,若无用则还原Jar包,找到对应版本源码进行修改。
- GetterSetterUtil.rar (9.1 KB)
- 下载次数: 18
- GetterSetterUtil_Eclipse3.5.rar (9.8 KB)
- 下载次数: 11
Android2.2 源码编译
1、编译环境
Android2.2 + Ubuntu10.04 + JDK1.5
安装必要的软件环境
sudo apt-get install git-core
sudo apt-get install gnupg
sudo apt-get install flex
sudo apt-get install bison
sudo apt-get install gperf
sudo apt-get install libsdl-dev
sudo apt-get install libesd0-dev
sudo apt-get install libwxgtk2.6-dev
sudo apt-get install build-essential
sudo apt-get install zip
sudo apt-get install curl
sudo apt-get install libncurses5-dev
sudo apt-get install zlib1g-dev
以上就是官方推荐的软件包,可能需要的软件包还有以下几个
sudo apt-get install make
sudo apt-get install gcc
sudo apt-get install g++
sudo apt-get install libc6-dev
sudo apt-get install patch
sudo apt-get install texinfo
sudo apt-get install valgrind
sudo apt-get install python
JDK1.5安装
官方声明:32位操作系统下JDK必须要用1.5的,是因为在编译Android api docs时需要1.5的。用JDK1.6必须用64位系统,当然也有解决办法,网上教程很多此处就不再一一声明。
到官网下载jdk-1_5_0_22-linux-i586.bin,目前JDK1.5的最后更新版本是JDK 5.0 Update 22,下载后得到一bin文件。命令行输入
sudo chmod u+x jdk-1_5_0_22-linux-i586.bin
sudo gnome-open /opt
然后将此文件拷贝到 /opt目录下(可自定义),进入/opt目录输入命令
sudo -s ./jdk-1_5_0_22-linux-i586.bin
一路回车,直到询问是否安装,输入yes后确认,安装完毕后配置环境变量
sudo gedit /etc/profile
在umask 022上面添加如下内容
export JAVA_HOME=/opt/Java/jdk1.5.0_22
export JRE_HOME=/opt/Java/jdk1.5.0_22/jre
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH:$HOME/bin
保存后关闭,再在命令行输入
sudo gedit /etc/environment
然后在文件结尾加入以下内容
export JAVA_HOME=/opt/Java/jdk1.5.0_22
export JRE_Home=/opt/Java/jdk1.5.0_22/jre
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JRE_Home/lib
保存后关闭,然后重启电脑,验证安装,在命令行输入
java –version
javac -version
查看否是刚才所安装的JDK版本
2、下载Android2.2源码
安装repo脚本
在当前用户目录下新建一repo目录。在终端中执行:
mkdir repo
然后向PATH中添加repo路径
export PATH=$PATH:~/repo
然后下载repo脚本并修改可执行属性
curl https://android.git.kernel.org/repo > ~/repo/repo
chmod a+x ~/repo/repo
初始化repo
首先建立一个目录用来存放Android源代码并下载
mkdir Android2.2
cd Android2.2
repo init -u git://android.git.kernel.org/platform/manifest.git -b froyo
注:后面加 -b froyo 就是下载指定的版本源码,froyo 就是Android2.2版本 的代号。这中间会问到你的名字和Email。如果你打算上传代码,Email须是 一个Google账户。
最后执行repo sync开始同步代码,接下来就是慢长的等待了,中间可能会 遇到断线,重新执行repo sync即可断点续传。
3、编译Android源码
编译生成镜像文件:make
切换到Android源码目录下,执行make命令,然后又是慢长的等待,大约 要2-3个小时。完成后镜像文件生成在out/target/product/generic下。
Android源码编译后得到system.img,ramdisk.img,userdata.img映像文件。其中, ramdisk.img是emulator的文件系统,system.img包括了主要的包、库等文件,userdata.img包括了一些用户数据,emulator加载这3个映像文件后,会把 system和 userdata分别加载到 ramdisk文件系统中的system和 userdata目录 下。
编译SDK
make编译完成后,执行
make sdk
生成对应于该版本源代码的sdk。注意这个sdk不能用于生产环境,用于生产环境的最好用如下命令:
make PRODUCT-sdk-sdk ###使用make sdk 会出现R文件不能自动生成的问题
SDK编译成功后会在out/host/linux-x86/sdk/ 生成sdk的文件目录和压缩包:
android-sdk_eng.用户名_linux-x86
android-sdk_eng.用户名_linux-x86.zip
并在out/target/product/generic(generic是默认的产品名)下打包所有的映像文件:
generic-img-eng.用户名.zip
配置AndroidSDK环境变量,在终端中执行
sudo gedit ~/.bashrc
在文件最后添加如下内容
#set android environment
export PATH=$PATH:/Android源码目录/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT=/Android源码目录/out/target/product/generic
保存后退出,在终端中同步这些设置
source ~/.bashrc
验证是否编译正确
在终端执行
emulator &
(注:可进入${ANDROID_PRODUCT_OUT}目录,后执行
emulator -image system.img -data userdata.img -ramdisk ramdisk.img)
模拟器能正常启动则表明编译成功
4、单模块编译
Android中的一个应用程序可以单独编译,编译后要重新生成system.img
在源码目录下执行
. build/envsetup.sh (.后面有空格)
然后就多出一些命令:
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
可以加—help查看用法
我们可以使用mmm来编译指定目录的模块,如编译联系人:
mmm packages/apps/Contacts/
编完之后生成两个文件:
out/target/product/generic/data/app/ContactsTests.apk
out/target/product/generic/system/app/Contacts.apk
可以使用make snod重新生成system.img
编译所修改的代码所在模块,例如:
cd ~/android/src
mmm packages/apps/Contacts
在~/android/src中运行:
cd ~/android/src
make snod
该命令生成一个新的系统映像
out/target/product/generic/system.img
将这个系统映像拷贝至sdk下
out/host/linux-x86/sdk/android-sdk_eng.justin_linux-x86/tools/lib/images/
5、Android 在Eclipse中进行调试
拷贝development/ide/eclipse/.classpath到源代码根目录
启动Eclipse并新建一Java Project
选择Create project from existing source
点击Browse选择Android的源码目录然后Finish
导入时比较慢,导入完成后Android项目出错,右击工程
Build Path -- Configure Build Path -- Libraries
删除两个出错的jar包
google-common_intermediates/javalib.jar
gsf-client_intermediates/javalib.jar
再添加out/target/common/obj/JAVA_LIBRARIES/android-common_intermediates/javalib.jar
点击OK
在Eclipse中修改
展开packages/providers/CalendarProvider/src
展开包: com.android.providers.calendar
右键点击包com.android.providers.calendar
选择 "new file"
在对话框中选择点击 "Advanced >>" 按钮, 可以看到"Link to file in the file system" checkbox,
勾选上 checkbox. 这时 "Browse..." 可用.
点击 "Browse..." 按钮,
选择out/target/common/obj/APPS/CalendarProvider_intermediates/src/src/com/android/providers/calendar/EventLogTags.java
点击OK
点击 Finish (in "New File")
同样的方式修改com.android.providers.contacts的问题
调试
在IDE(eclipse)中修改源代码后在shell中编译运行
源码自带编译工具
先在Adroid源码根目录执行. build/envsetup.sh 再通过m/mm/mmm进行编译
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
. build/envsetup.sh #初始化
lunch 1 # 初始化模拟器等
mmm packages/providers/ContactsProvider/
#用mm/mmm来编译生成的.apk并不会打包到system.img中
#可以使用make snod将模块打包到system.img中,也可以使用 adb install -r *.apk安装
注:通过mmm packages/providers/ContactsProvider/ 编译后的apk在 out/target/product/generic/system/app
emulator & #启动Android模拟器
ddms & #调试工具
- package com.yaku.access;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.Statement;
- public class AccessTest {
- public static void main(String[] args) {
- try {
- Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
- // String url = "jdbc:odbc:wombat";
- // string url=“jdbc:odbc:Driver={MicroSoft Access Driver
- // (*.mdb)};DBQ=“+application.getRealPath(“/Data/ReportDemo.mdb“);
- String url = "jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=C:\\Test.mdb";
- Connection conn = DriverManager.getConnection(url, "", "");
- Statement stmt = conn.createStatement();
- // ResultSet rs = stmt.executeQuery("delete from arts where id =
- // 2");
- // System.out.println("a row has beenn inserted;");
- PreparedStatement ps ;
- for(int i=0;i<1000;i++){
- String sex = "";
- if(i%2==0){
- sex="M";
- }else{
- sex="F";
- }
- ps = conn.prepareStatement
- ("insert into test values('"+i+"','Yaku"+i+"','"+sex+"')");
- ps.executeUpdate();
- ps.close();
- }
- // rs.close();
- stmt.close();
- conn.close();
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- }
- }
package com.yaku.access;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.Statement;public class AccessTest { public static void main(String[] args) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // String url = "jdbc:odbc:wombat"; // string url=“jdbc:odbc:Driver={MicroSoft Access Driver // (*.mdb)};DBQ=“+application.getRealPath(“/Data/ReportDemo.mdb“); String url = "jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=C:\\Test.mdb"; Connection conn = DriverManager.getConnection(url, "", ""); Statement stmt = conn.createStatement(); // ResultSet rs = stmt.executeQuery("delete from arts where id = // 2"); // System.out.println("a row has beenn inserted;"); PreparedStatement ps ; for(int i=0;i<1000;i++){ String sex = ""; if(i%2==0){ sex="M"; }else{ sex="F"; } ps = conn.prepareStatement ("insert into test values('"+i+"','Yaku"+i+"','"+sex+"')"); ps.executeUpdate(); ps.close(); } // rs.close(); stmt.close(); conn.close(); } catch (Exception ex) { ex.printStackTrace(); } }}
查询Access数据
- package com.yaku.access;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.Statement;
- public class Select {
- public static void main(String[] args) {
- try {
- Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
- // String url = "jdbc:odbc:wombat";
- // string url=“jdbc:odbc:Driver={MicroSoft Access Driver
- // (*.mdb)};DBQ=“+application.getRealPath(“/Data/ReportDemo.mdb“);
- String url = "jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=C:\\Test.mdb";
- Connection conn = DriverManager.getConnection(url, "", "");
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("SELECT * FROM test");
- System.out.println("Got ResultSet Now");
- //rs.beforeFirst();
- while (rs.next()) {
- System.out.println(rs.getString(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3));
- }
- rs.close();
- stmt.close();
- conn.close();
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- }
- }
package com.yaku.access;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class Select { public static void main(String[] args) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // String url = "jdbc:odbc:wombat"; // string url=“jdbc:odbc:Driver={MicroSoft Access Driver // (*.mdb)};DBQ=“+application.getRealPath(“/Data/ReportDemo.mdb“); String url = "jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=C:\\Test.mdb"; Connection conn = DriverManager.getConnection(url, "", ""); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM test"); System.out.println("Got ResultSet Now"); //rs.beforeFirst(); while (rs.next()) { System.out.println(rs.getString(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)); } rs.close(); stmt.close(); conn.close(); } catch (Exception ex) { ex.printStackTrace(); } }}
删除Access数据
- package com.yaku.access;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.Statement;
- public class Delete {
- public static void main(String[] args) {
- try {
- Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
- // String url = "jdbc:odbc:wombat";
- // string url=“jdbc:odbc:Driver={MicroSoft Access Driver
- // (*.mdb)};DBQ=“+application.getRealPath(“/Data/ReportDemo.mdb“);
- String url = "jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=C:\\Test.mdb";
- Connection conn = DriverManager.getConnection(url, "", "");
- Statement stmt = conn.createStatement();
- // ResultSet rs = stmt.executeQuery("delete from arts where id = 2");
- // System.out.println("a row has beenn inserted;");
- PreparedStatement ps = conn.prepareStatement("delete from test where id = '1'");
- ps.executeUpdate();
- // rs.close();
- ps.close();
- stmt.close();
- conn.close();
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- }
- }
package com.yaku.access;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.Statement;public class Delete { public static void main(String[] args) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // String url = "jdbc:odbc:wombat"; // string url=“jdbc:odbc:Driver={MicroSoft Access Driver // (*.mdb)};DBQ=“+application.getRealPath(“/Data/ReportDemo.mdb“); String url = "jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=C:\\Test.mdb"; Connection conn = DriverManager.getConnection(url, "", ""); Statement stmt = conn.createStatement(); // ResultSet rs = stmt.executeQuery("delete from arts where id = 2"); // System.out.println("a row has beenn inserted;"); PreparedStatement ps = conn.prepareStatement("delete from test where id = '1'"); ps.executeUpdate(); // rs.close(); ps.close(); stmt.close(); conn.close(); } catch (Exception ex) { ex.printStackTrace(); } }}