android开发笔记
- 格式:doc
- 大小:57.50 KB
- 文档页数:7
01、什么是3G02、android系统简介03、android背景介绍04、android的framewor简介05、两种虚拟机的比较06、sdk的下载以及简介07、创建android模拟器08、ddms简介09、platform-tools的简介及常见adb指令10、android项目的目录结构11、android下apk安装的过程12、常见的adb指令介绍13、创建模拟器遇到的常见错误14、电话拨号器15、点击事件的四种写法16、短信发送器17、相对布局&单位介绍18、现形布局&布局的组合19、表格布局&绝对布局20、帧布局21、测试相关概念22、android下junit测试框架配置23、logcat简介24、保存文件到手机内存25、android下文件访问的权限26、保存文件到SD卡中27、分析setting源代码获取SD卡大小28、_sharePreference入门29、xml文件的序列化30、采用pull解析xml文件31、采用断电调试的方法观察pull解析的的流程32、android下创建一个sqllite数据库33、sql语句实现数据库的增删改查34、系统api实现数据库的增删改查&Sqlite3工具的使用35、数据库的事物36、listView入门37、采用layoutInflater打气筒创建一个view对象38、采用数据适配器ArryAdapter39、常用数据适配器simpleAdapter40、数据适配器总结41、内容提供者简介42、内容提供者的实现43、短信的备份44、插入一条记录到系统短信应用45、内容观察者46、获取系统的联系人信息47、保存联系人到系统通讯录48、读取联系人的一个小细节49、网络图片查看器50、anr产生的原理&如何避免51、android消息机制入门52、网络html查看器53、字符乱码问题的处理54、采用get方式提交数据到服务器55、采用post方式提交数据到服务器56、提交数据到服务器中文乱码问题的处理57、采用httpclient提交数据到服务器58、异步http框架简介&实现原理59、异步http框架提交数据到服务器60、上传文件到服务器61、smartimageview&常见开源代码62、多线程下载的原理63、多线程断点下载的原理64、多线程java代码移植到android65、多线程下载文本页面的更新66、显示意图激活另一个activity67、隐式意图激活另一个activity68、隐式意图的配置69、隐式意图和显示意图的使用场景70、在不同activity之间数据传递71、activity的声明周期72、activity的启动模式73、activity横竖屏切换的声明周期74、开启新的activity获取他的返回值75、请求码和结果码的作用76、利用广播实现ip拨号77、短信窃听器78、自定义广播时间&发送自定义广播&广播接受者优先级79、采用服务执行长期后台操作80、采用服务窃听电话&服务的声明周期81、android进程优先级&为什么使用服务82、绑定方式开启服务&调用服务的方法83、服务的声明周期(混合开启84、采用aidl绑定远程服务85、代码注册广播接受者&利用广播调用服务的办法86、加载大图片到内存87、获取图片exif信息88、从gallery获取图片89、图片画画板90、扒开美女衣服91、图片的缩放92、图片的旋转93、图片的平移&镜面&倒影效果94、图片的合成95、图片的颜色处理96、多媒体播放api简介97、人脸识别98、mediaplayer的生命周期99、soundpoo简介100、sufaceview的生命周期101、播放在线视频102、视频播放器进度的处理103、调用系统照相机拍照和录像104、采用camera拍照105、常见对话框106、notification入门107、菜单108、android下的样式109、android下的主题110、代码编写ui111、html创建ui112、帧动画113、代码创建创建的tween动画114、xml文件定义动画115、传感器简介116、117、杀死进程118、apk的安装119、应用程序的反编译120、动态创建fragment121、用fragment创建一个选项卡122、fragment的向下兼容性123、fragment的生命周期124、fragment之间的通讯125、应用程序国际化04、android的framewor简介Wap:wait and playWireless Makeup Language(WML)精简的html语言Applications:android自带的基本上层应用Aplication framework:应用程序框架Librarics:Linux lernel:05、两种虚拟机的比较编译后文件格式:jvm:.java->.class->.jardalvik vm:.java->.dex->.odex基于的架构:jvm:基于栈的架构dalvik vm:基于寄存器的架构Cpu直接访问寄存器因此dalvik虚拟机的效率比jvm高06、sdk的下载以及简介->获取sdk工具包(sdk:standard develope kits)->ADT(android develop tools,实际上是eclipse的插件)SDK具体内容Android->SDK Plateform:开发时使用到的jar包->Samples for sdk:->ARM EABI V7a System Image:模拟器运行时的镜像->Intel n86 Aton System:模拟器运行时的镜像->MIPS System Image:模拟器运行时的镜像->google APIs:google提供的jar包,可以直接使用google提供的一些API ->source for android SDK:SDK全部的源代码Extrals:->tools:开发的工具->support library:实现高版本的android向下的兼容->google Admed Ads SDK:gongle提供的广告插件->Analyties App Irackiong SDK:应用的用户分析->cloud message:云消息->gongle play service:收费服务->google USB Driver:真实的设备驱动开发时:基于4.0,兼容2.2、2.3.307、创建android模拟器avd:android virture developerVGA:480*640(电视的标准分辨率)QVGA:240*320(四分之一)HVGA:320*480(一半)WVGA:480*800(width)FWVGA:480*854(更宽)08、ddms简介ddms:模拟器不支持中文,因此发送中文会显示不出来09、platform-tools的简介及常见adb指令Android调试桥:内部实现就是socket让两个系统之间实现数据交互->reset adb:模拟器找不到时候可以重启->adb device:列出所有的连接的设备->adb kill-server:杀死adb调试桥->adb start-server 启动adb调试桥dx.bat:将.class文件打包10、android项目的目录结构一:SDK的目录结构->Samples->Api demo:根据API demo(模拟器上面可以看见)的效果可以在sample中看见相应的代码->Source:jar包所有的sdk源代码都在这个文件夹里->SystemImage:系统镜像->temp:下载更新临时存储的文件夹,一般是空的->tools:emulater.ext 不同版本的模拟器二:New Android Application->theme:留给以后作为扩展,现在并没有太大的作用->target SDK:一般选择高版本,因为高版本对下兼容->mark project as a library:一般不选择,意思是将这个项目提供一个jar包供别人使用三:文件夹目录.setting:设置目录assets:资产目录,存放一些文件,这些文件会被原封不动打包到应用程序的apk中bin:gen:自动生成的目录->builderConfig.java:生成的配置信息->R.java:Android 4.1.2->android.jar开发环境,jar包可以在properties中修改,jar包就是SDK011、Android下apk的安装过程一、Android安装过程分析:->setContentView:甚至view的对象,把里面的xml文件加载到->在project中选择build automaticly会自动把文件生成字节码文件,.class $代表的class文件生成的是内部类->dex.bat文件会把.class文件生成.dex文件->apk压缩文件解压内部内容->META-INF:应用程序的签名eclipse的调试签名文件->res:资源文件->classes.dex:class文件->resources.arsc:资源ID映射->android软件安装的过程:->拷贝xxx.apk带/data/app/xxx-1.apk->在/data/data目录下创建一个文件夹,文件夹名称当前应用程序的报名012、常见adb指令前提:->设备连接上电脑而且驱动安装正常,如果安装不正常的话,会有黄色的问号显示;->设备上打开USB调试;指令:->adb device(如果启动发现这个程序没有安装会自动安装)->adb kill-server->adb start-server->adb uninstall <包名>->adb -s emulator-5554 install c:\\users\\administrator\\hello.apk如果有多个设备的话,如果不指定安装的是哪个设备程序会报错->adb push haha.prop /sdcard/haha.txt 将文件移到(360管家,豌豆荚之类的软件他们也是用的adb指令,倘若电脑上装这些软件的话,会因为两个adb指令抢端口号而挂掉)(adb版本之间兼容不是很好,经常报错可以考虑下版本的问题)->adb shell:远程连接到了android的linux终端ls:显示文件夹ps:显示正在运行的程序ping:网络连通性013、创建模拟器遇到的常见错误->路径最好不要有中文:->应用安装不上,或者安装模拟器的时候开启一个新的模拟器:可能是模拟器的资源被占用,模拟器在运行的时候其实占用着硬盘上面的一个文件,这个文件位于工作空间.android/avd/iphone.avd 里面会有镜像文件,当一个模拟器开启起来了,就给你创建一个文件夹.knock的文件夹,代表着这个模拟器被锁定了,如果把模拟器关掉,就没有程序占据这几个镜像资源了,那么这几个程序就会被自动删除。
Android(java)学习笔记47:通过反射获得构造⽅法并且使⽤1. 获取字节码⽂件对象:Class c = Class.forName("cn.itcast_01.Person");2. 获取构造⽅法public Constructor[] getConstructors():所有公共(public)构造⽅法public Constructor[] getDeclaredConstructors():所有构造⽅法⽐如使⽤:Constructor[] cons = c.getDeclaredConstructors();//获取所有构造⽅法下⾯我会通过代码形式进⾏讲解:Person.java:1package cn.itcast_01;23public class Person {4private String name;5int age;6public String address;78public Person() {9 }1011private Person(String name) { = name;13 }1415 Person(String name, int age) { = name;17this.age = age;18 }1920public Person(String name, int age, String address) { = name;22this.age = age;23this.address = address;24 }2526public void show() {27 System.out.println("show");28 }2930public void method(String s) {31 System.out.println("method " + s);32 }3334public String getString(String s, int i) {35return s + "---" + i;36 }3738private void function() {39 System.out.println("function");40 }4142 @Override43public String toString() {44return "Person [name=" + name + ", age=" + age + ", address=" + address45 + "]";46 }4748 }ReflectDemo.java:1package cn.itcast_02;23import ng.reflect.Constructor;45import cn.itcast_01.Person;67/*8 * 通过反射获取构造⽅法并使⽤。
Android学习笔记(三)Activity及Intent⼀、废话 今天⼗分的忙,本来打算今天就不写了,可是想想既然决定要做某件事情了,那么就要坚持下去。
做不做是⼀个态度问题!⼆、正⽂1、Activity 在⼀个Android应⽤程序中,Activity是为⽤户操作⽽展⽰的可视化界⾯。
⽐如你要打电话,这个时候的拨号界⾯就是⼀个Activity,你要发短信给你的⼥朋友,这个短信窗⼝就是⼀个Activity。
Activity在创建之初只是⼀个没有任何内容的页⾯,如果要做出⽤户体验⾮常棒的应⽤程序,还需要在Activity中添加控件(如按钮,⽂字,图⽚)以显⽰和响应⽤户操作。
2、在Android中,多个Activity之间如何切换? 在Android 系统中,之所以⼀个Activiyt运⾏过程中可以运⾏另外的Activity,是因为Android在遇到这种情况后,会⾃动创建⼀个任务堆栈,并把这些关联的Activity压⼊堆栈中。
在这个任务堆栈栈顶的Activity就是当前⽤户⼀直操作的Activity,⽽当⼀个新的Activity启动时,这个Activity就必须位于栈顶,⽽当前的Activity就会被压⼊栈的下⼀个位置。
当系统发现内存不够⽤时,会默认清理⼀些长时间没有被使⽤的Activity存放栈。
打个⽐⽅,你在看微博,现在收到⼀条⼥朋友发来的微信,这个时候你打开微信,Android就会将微信的Activity压⼊栈并放在栈顶,使微信的Activity被激活,⽽把本来在栈顶的微博Activity压⼊栈中下⼀个位置。
这样⼀来,当你按Back键时,微信Activity就会弹出栈,新浪Activity位于栈顶于是被激活。
但是当你按下HOME键后,这些Activity都将转到后台运⾏,你使⽤Back是不能再次激活他们的,此时你必须点击应⽤程序才能再次激活它。
那么为什么微信Activity激活时,再按Back微博Activity能够再次激活?这就要从Activity的⽣命周期讲起了。
Android开发⾃学笔记(AndroidStudio)—4.1布局组件⼀、引⾔Android的界⾯是有布局和组件协同完成的,布局好⽐是建筑⾥的框架,⽽组件则相当于建筑⾥的砖⽡。
组件按照布局的要求依次排列,就组成了⽤户所看见的界⾯。
在Android4.0之前,我们通常说Android开发五⼤布局和四⼤组件,这五⼤布局就是:1. LinearLayout 线性布局2. FrameLayout 单帧布局,也有中⽂翻译为帧布局、框架布局。
3. RelativeLayout 相对布局4. AbsoluteLayout 绝对布局5. TableLayout 表格布局⽽在Android4.0之后⼜新增了⼀种GridLayout⽹格布局。
⼆、LinearLayout线性布局线性布局是Android开发中最常见的⼀种布局⽅式,它是按照垂直或者⽔平⽅向来布局,通过“android:orientation”属性可以设置线性布局的⽅向。
属性值有垂直(vertical)和⽔平(horizontal)两种。
线性布局的排列在某⾏或者某列并不会⾃动换⾏或换列,就是说如果采⽤⽔平布局,控件宽度超过屏幕显⽰的话,后⾯的控件都将被隐藏,不会⾃动换⾏。
常⽤的属性有:1. android:orientation:可以设置布局的⽅向2. android:id - 为控件指定相应的ID3. android:text - 指定控件当中显⽰的⽂字,需要注意的是,这⾥尽量使⽤string.xml4. android:gravity - 指定控件的基本位置,⽐如说居中,居右等位置5. android:textSize - 指定控件当中字体的⼤⼩6. android:background - 指定控件所⽤的背景⾊,RGB命名法7. android:layout_width - 指定控件的宽度8. android:layout_height - 指定控件的⾼度9. android:layout_weight - 指定控件的占⽤⽐例10. android:padding - 指定控件的内边距,也就是说控件当中的内容11. android:sigleLine - 如果设置为真的话,则将控件的内容显⽰在⼀⾏当中layout_weight属性以控制各个控件在布局中的相对⼤⼩。
android移动应用开发技术课第一章笔记第一章:Android移动应用开发技术课笔记一、引言在当今移动互联网时代,Android系统以其开放性和普及率成为了最受欢迎的移动操作系统之一。
随着移动应用市场的不断扩大,对Android移动应用开发技术的需求也日益增加。
学习和掌握Android移动应用开发技术成为了越来越多人的选择。
二、Android移动应用开发技术概述1. 什么是Android?Android是一款基于Linux操作系统的开源移动设备操作系统,主要用于触摸屏移动设备,如智能手机和平板电脑。
Android操作系统的开放性使得开发者可以自由定制和开发应用,受到了广大用户的喜爱。
2. Android移动应用开发技术的重要性随着信息化和数字化的发展,移动应用成为了人们获取信息和进行交流的重要方式。
而Android作为最主流的移动操作系统之一,其应用的开发和推广具有巨大的市场潜力和商业价值。
掌握Android移动应用开发技术成为了许多开发者和从业者的追求目标。
三、学习Android移动应用开发技术的重要性1. 对于个人的意义学习Android移动应用开发技术可以提升个人的职业技能,并且在移动应用开发领域有更多的发展机会。
可以通过开发自己的应用来实现个人价值和创造财富。
2. 对于企业的意义随着移动互联网的发展,各类企业都希望拥有自己的移动应用,以提升品牌形象和服务用户。
懂得Android移动应用开发技术的人才对企业来说显得格外宝贵。
四、学习Android移动应用开发技术的途径1. 自学通过阅读相关书籍、网上教程和参加线上培训班,可以自学Android 移动应用开发技术。
这种方式需要具备较好的自学能力和毅力。
2. 参加培训班选择权威的培训机构进行系统的学习和培训,可以更快速、系统地学习Android移动应用开发技术。
五、Android移动应用开发技术的未来发展随着人工智能、物联网、区块链等技术的不断发展,Android移动应用开发技术也将不断拓展应用场景和技术深度。
Android开发笔记之《远程控制(MQTTmosquitto)(ProtocalBuff。
Android推送⽅案分析(MQTT/XMPP/GCM): /lib/view/open1410848945601.htmlMQTT官⽹: /: /caca/p/mqtt.htmlOSChina grpc document : /grpc?t=56831⾼⼿对MQTT的理解: /leeying/p/3791077.htm⾼⼿对MQTT的经验之谈: /yongboy/archive/2015/01/11/422172.htmlMQTT是IBM开发的⼀个即时通讯协议。
MQTT是⾯向M2M和物联⽹的连接协议,采⽤轻量级发布和订阅消息传输机制。
Mosquitto是⼀款实现了 MQTT v3.1协议的开源消息代理软件,提供轻量级的,⽀持发布/订阅的的消息推送模式,使设备对设备若初次接触MQTT协议,可先理解以下概念:【MQTT协议特点】——相⽐于RESTful架构的物联⽹系统,MQTT协议借助消息推送功能,可以更好地实现远程控制。
【MQTT协议⾓⾊】——在RESTful架构的物联⽹系统,包含两个⾓⾊客户端和服务器端,⽽在MQTT协议中包括发布者,代理器(服务器)和订阅者。
【MQTT协议消息】——MQTT中的消息可理解为发布者和订阅者交换的内容(负载),这些消息包含具体的内容,可以被订阅者使⽤。
【MQTT协议主题】——MQTT中的主题可理解为相同类型或相似类型的消息集合默认会监听⼀下端⼝:1883: MQTT, 不加密8883: MQTT, 加密8884: MQTT, 加密, 客服端需要验证8080: MQTT 通过WebSockets, 不加密mosquitto ubuntu下编译和安装: /skykingf/article/details/46459857先到官⽹ /download/咱们下载最新的包:/files/source/mosquitto-1.4.8.tar.gz切换到~,执⾏ wget /files/source/mosquitto-1.4.8.tar.gz然后 chmod 777 mosquitto-1.4.8.tar.gz然后 tar -zxf mosquitto-1.4.8.tar.gzcd mosquitto-1.4.8然后执⾏ make可能会找不到 uuid头⽂件,sudo apt-get install uuid-dev然后进⾏makesudo make install安装完毕后在~⽬录下输⼊:mos 然后tab键按2下出现:mosquitto mosquitto_passwd mosquitto_pub mosquitto_sub备注:在执⾏ mosquit的时候可能会出现找不到 so:sudo cp /usr/local/lib/libmosquitto.so.1开启MQTT:$ mosquitto start停⽌MQTT:$ mosquitto stop查看MQTT状态:$ mosquitto status查看监听的端⼝:$ netstat -anplt | grep 1883测试下,$ mosquitto_sub -h -t "#" -vmosquitto测试测试:⼀、开起第⼀个终端窗⼝,直接运⾏mosquitto即可:⼆、开启另⼀个终端窗⼝,运⾏订阅程序mosquitto_sub:注意:消息推送的发布和订阅要有主题,选项[-t] 主题,即:mosquitto -t 主题如需指定⽤户名称则加选项[-i] ⽤户名,即:mosquitto_sub -t 主题1 -i 订阅端三、开启第三个终端窗⼝,运⾏发布端程序mosquitto_pub:指定消息推送的主题,发布端⽤户名和消息:mosquitto_pub -t 主题1 -i 发布端 -m 你好*注意:如果消息中间有空格则消息要已单引号括起来。
移动应用开发课程笔记一、课程简介移动应用开发是当前非常热门的技术领域,涵盖了iOS、Android、小程序等多种平台。
本课程将介绍移动应用开发的基本概念、技术原理和开发流程,并通过实践项目来提升学员的实际操作能力。
二、课程内容移动应用开发概述移动应用市场的现状与趋势移动应用开发的技术架构与流程iOS开发基础Xcode开发环境配置Swift编程语言基础UI设计基础与控件使用数据存储与网络通信Android开发基础Android Studio开发环境配置Java编程语言基础UI设计基础与控件使用数据存储与网络通信小程序开发基础小程序开发环境配置WXML、WXSS与JavaScript基础UI组件库与API使用跨平台开发框架React Native框架介绍与环境搭建Flutter框架介绍与环境搭建实战项目开发简单的音乐播放器项目(iOS/Android)小程序电商应用项目(微信小程序)三、课程重点与难点Swift/Java编程语言基础:Swift/Java的语法规则、数据类型、控制流等基础知识是学习移动应用开发的基础,需要学员熟练掌握。
UI设计与控件使用:iOS/Android平台都有丰富的UI控件和布局方式,需要学员根据实际需求选择合适的控件和布局方式。
数据存储与网络通信:如何合理地存储数据和进行网络通信是移动应用开发中非常重要的部分,需要学员掌握基本的数据库操作和网络通信协议。
跨平台开发框架:React Native和Flutter等跨平台开发框架可以提高开发效率,但需要学员掌握原生开发和框架开发的区别和联系。
四、实验与实践项目安排实验1:熟悉Xcode/Android Studio开发环境,完成一个简单的Hello World程序。
实验2:使用Swift/Java编写一个简单的计算器应用。
实验3:使用SQLite数据库实现数据的增删改查操作。
实验4:使用网络通信协议实现数据的上传和下载。
实验5:使用React Native/Flutter框架实现一个简单的新闻阅读应用。
对于5.0的系统是要求的ubuntu 12.041 新代码第一步执行:source build/envsetup.sh (此命令完成一些命令的初始化,配置了android编译的环境)2 执行lunch 命令(选择平台编译选项,用来让用户选择编译项,类似于旧框架的./mk listp)3 输入所需要编译的工程(这里需要编译82平台输入20),会显示相关的一些信息(1)A: ProjectConfig.mk路径:alps\device\farsighted\fars6582_wt_l(2)B: Drvtool路径:alps\kernel-3.10\tools\dct(3)C: Codegen.dws路径alps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\dct\dct(4)D: flash时序表路径:alps\device\mediatek\build\build\tools\emigen\MT6582(5)E: flash配置文路径:alps\bootable\bootloader\preloader\custom\fars6582_wt_l\inc(6)F: 背光,键盘灯配置文路径:kernel :alps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\leds\ mt65xxlk:alps\bootable\bootloader\lk\target\fars6582_wt_l(7)G: TP驱动路径:alps\kernel-3.10\drivers\input\touchscreen\mediatekTP 用户头文件配置路径:alps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\touchpanel\ GT9XX新增TP还需要在以下文件增加编译路径:***新增TP还需要在以下文件增加编译路径:alps\kernel-3.10\drivers\input\touchscreen\mediatek\ Makefilealps\kernel-3.10\drivers\input\touchscreen\ KconfigTP mk文件配置(8)H: LCM驱动存放路径lk:alps\bootable\bootloader\lk\dev\lcm\ mt65xx_lcm_list.c配置文件:Lk部分mk文件配置:alps\bootable\bootloader\lk\project\ fars6582_wt_l.mkBOOT_LOGO有两处alps\bootable\bootloader\lk\project\ fars6582_wt_l.mkalps\bootable\bootloader\lk\dev\logo\ rules.mkKernel部分:lcm驱动:alps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\lcm\此目录下只放.c文件,不需要文件夹alps\kernel-3.10\drivers\misc\mediatek\lcma:链接obj alps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\lcm\ MakefileB:编译路径alps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\lcm\ mt65xx_lcm_list.cC:kernel mk文件配置路径:alps\kernel-3.10\arch\arm\configs\ fars6582_wt_l_defconfigKerner config配置建议使用menuconfig命令make dir outmake O=out fars6582_wt_l_debug_defconfig(这是对应的项目配置文件)make O=out menuconfig(进不去的同学可看看后面的补充)(9)I: CAMERA 配置:1 alps\device\farsighted\fars6582_wt_l\ProjectConfig.mk2 hal目录3 驱动目录4 涉及修改的文件MT6582_L0\alps\kernel-3.10\drivers\misc\mediatek\imgsensor\inc\kd_imgsensor.hMT6582_L0\alps\kernel-3.10\drivers\misc\mediatek\imgsensor\src\mt6582\kd_sensorlist.hMT6582_L0\alps\vendor\mediatek\proprietary\custom\fars6582_wt_l\hal\imgsensor_src\sensorlist .cppalps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\camera\camera\kd_camera_hw.calps\vendor\mediatek\proprietary\custom\common\kernel\imgsensor\inc\kd_imgsensor.h(10)J: Gsensor,alps配置:1 1 alps\device\farsighted\fars6582_wt_l\ProjectConfig.mk2 驱动目录MT6582_L0\alps\kernel-3.10\drivers\misc\mediatek\alspsMT6582_L0\alps\kernel-3.10\drivers\misc\mediatek\ accelerometer3 custom文件alps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\accelerometeralps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\ alsps4 makefilealps\kernel-3.10\drivers\misc\mediatek\alsps\Makefilealps\kernel-3.10\drivers\misc\mediatek\ accelerometer \Makefilealps\kernel-3.10\drivers\misc\mediatek\Kconfig.drivers此makefife加了后menuconfig后才有选项(11)K: Sound 配置1 1 alps\device\farsighted\fars6582_wt_l\ProjectConfig.mk2alps\vendor\mediatek\proprietary\custom\fars6582_wt_l\hal\audioflinger\audio\audio_custom_exp .h3编pl模块需先把项目名赋值我拿到的代码是需要做如下修改才能正常运行menuconfig,如果你们的正常可以忽略以下:Menuconfig需修改的地方:1 MT6582_L0\alps\kernel-3.10\Makefile修改如下:2 安装sudo apt-get install libncurses5 libncurses5-dev3 make O(大写字母O)=out menuconfig****需注意的是,如果编完后关闭了窗口再重新打开编译都要运行一次source build/envsetup.sh lunch一些常用编译命令:make –j24 2>&1 | tee build.log (相当于new命令,编译过程会生成build.log文件在alps目录下)-j后面通常是编译主机CPU支持核数2>&1, 表示将标准错误重定向到标准输出tee :同时将LOG输出到控制台和文件preloadermake –j24 pl 2>&1 | tee pl.loglkmake –j24 lk 2>&1 | tee lk.logkernelmake –j24 kernel 2>&1 | tee kernel.log clean commondm ,mm ,mmm,mma打包命令。
初次接触到android的clip有以下两点疑问:1.Clip(剪切)的时机2.Clip中的Op的参数的意思。
通常咱们理解的clip(剪切),是对已经存在的图形进行clip的。
但是,在android上是对canvas (画布)上进行clip的,要在画图之前对canvas进行clip,如果画图之后再对canvas进行clip不会影响到已经画好的图形。
一定要记住clip是针对canvas而非图形。
接下来通过android自带的APIdemo Clipping例子详细讲述Clip中的Op的参数的意思。
Android提供clipRect、clipPath和clipRegion剪切区域的API。
Op一共有DIFFERENCE,INTERSECT,UNION,XOR, REVERSE_DIFFERENCE, REPLACE六种选择。
例子:1.在canvas上剪切从(0,0)到(60,60)的方块。
下图蓝色区域加紫色区域。
2.在canvas上剪切从(40,40)到(100,100)的方块。
下图橄榄色区域加紫色区域。
3.在canvas上剪切从(0,0)到(100,100)的方块。
先在第二方块上加上Op参数例如:canvas.clipRect(40, 40, 100, 100, Region.Op. DIFFERENCE); 首先,需要搞清楚Op参数针对的对象。
接着了解其含义。
Op参数针对的对象是之前剪切的区域以及当前要剪切的区域。
在本例中涉及到区域是从(0,0)到(60,60)的方块和从(40,40)到(100,100)的方块。
那有哪些含义呢?就是表示当前要剪切的区域与之前剪切过的之间的关系。
DIFFERENCE:之前剪切过除去当前要剪切的区域(蓝色区域)。
INTERSECT:当前要剪切的区域在之前剪切过内部的部分(紫色区域)。
UNION:当前要剪切的区域加上之前剪切过内部的部分(蓝色区域+紫色区域+橄榄色区域)。
实现直接拒接来电经过简单的google/baidu后,发现android没有现成的API去拒接电话。
android可以通过注册BroadcastReceiver截取短信,因为这个broadcast是一个ordered broadcast,所以只要优先级比短信接收程序高,就可以提前终止掉这个broadcast receiver。
但是,电话呼入则没有类似的机制。
不过,综合网上的一些资料,通过以下大体的步骤,则可以实现拒接电话:1、注册broadcast receiver,监视手机状态:Java代码1.<receiver android:name=".PhoneBroadcastReceiver">2.<intent-filter>3. <action android:name="android.intent.action.PHONE_STATE" />4.</intent-filter>5.</receiver><receiverandroid:name=".PhoneBroadcastReceiver"> <intent-filter> <actio n android:name="android.intent.action.PHONE_STATE"/> </intent-filter> </receiver>当手机接收到电话时,则会触发该broadcast receiver。
2、最重要的,就是取得可以控制电话的API。
这些API貌似是android内部的接口,并未暴露。
具体方式参见该帖子:/u/20091226 ... d-586a278875c0.html使用时需要手动添加import:Java代码1.import com.android.internal.telephony.ITelephony;import com.android.internal.telephony.ITelephony;同样的方式,在stackoverflow上也有人大致地提了下:/questio ...ck-calls-in-android值得注意的是,使用这种方式拒接来电,broadcast receiver会被触发两次。
第一次是收到来电,第二次则是由于调用endCall拒接了后触发。
我们在处理自己的程序逻辑时,可以通过ITelephony.getCallState来区分。
该函数返回1表示来电,0表示拒接来电。
最后,这个方法有时候依然会出现系统接听电话的界面,并且,通话记录里也会有拒接电话的记录。
这个原因大概也是系统底层在处理这块逻辑时,系统逻辑和通知broadcast receiver的存在先后顺序。
这篇文章中分析了部分源码,也算是提个醒:http://blog.wangling.me/2009/08/why-it-is-impossible-to-intercept-incoming-calls-on-and roid/[经验分享]获取联系人信息和删除联系人1./**2.* 根据提供的ID删除数据库中相对应的项3.* @param id4.* @param listId5.*/6.public void delete(String id) {7.if(id.equals("") || id == null){8.return ;9.}10.Uri uri= ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, Integer.parseInt(id));11.Uri.Builder b = uri.buildUpon();12. b.appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER,"true");13.uri = b.build();14.getContentResolver().delete(uri, null, null);15.}16.17.private ArrayList<String> getContactCompany(String contactId){18.// 获取该联系人组织19.ArrayList<String> companyArrayList = new ArrayList<String>();20. Cursor organizationCursor =getContentResolver().query(Uri.parse("content://com.android.contacts/data "),21.new String[] { "data1", "data2", "data4" },22."contact_id="23. + contactId24. + " and "25. +"mimetype='vnd.android.cursor.item/organization'",26.null, null);27. String idd=contactId;28.int count = organizationCursor.getCount();29.if (organizationCursor.getCount() != 0) {30.if (organizationCursor.moveToNext()) {31.String company =organizationCursor.getString(organizationCursor.getColumnIndex(Organizati PANY));32.String title =organizationCursor.getString(organizationCursor.getColumnIndex(Organizati on.TITLE));panyArrayList.add(company);panyArrayList.add(title);35. }36.}37.return companyArrayList;38.39.}40.41.** 获取联系人头像42.*43.* @param id 用户ID44.* @return45.*/46.Bitmap getContactBitmap(String id){47.ContentResolver cr = getContentResolver();48.Uri uri =ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,49. Long.parseLong(id));50.InputStream input =51. ContactsContract.Contacts.openContactPhotoInputStream(cr,uri);52.if(input == null){53.//Log.e("star","input is null");54. InputStreamis=getResources().openRawResource(ers);55. BitmapDrawable bmpDraw = null;56. bmpDraw = new BitmapDrawable(is);57. Bitmap aa= null;58. aa = bmpDraw.getBitmap();59. Bitmap newb = Bitmap.createScaledBitmap(aa, 50, 50, false);60.61.return newb;62.} else {63. Bitmap contactPhoto = BitmapFactory.decodeStream(input);64. Bitmap newb = Bitmap.createScaledBitmap(contactPhoto, 50, 50,false);65.return newb;66.}67.68.}69.70./** 获取联系人信息71.*72.* ContactsContract.Contacts.DISPLAY_NAME姓名73.* PANY; 公司74.* ContactsContract.Contacts._ID ID75.*76.* @param param77.* @return 相关信息78.*/79.String getContactInfo(final String param){80.if(mContactCursor != null){81.82.int id = mContactCursor.getColumnIndexOrThrow(param);83. String aaString= mContactCursor.getString(id);84.return aaString;85.}86.return"";87.}88.89./** 获取联系人电话号码90.*91.* @return 电话号码92.*/93.String getContactPhoneNumber(){94.ArrayList<String> alTemp = new ArrayList<String>();95.String IsPhone =mContactCursor.getString(mContactCursor.getColumnIndex(ContactsContra ct.Contacts.HAS_PHONE_NUMBER));96.if( (Integer.parseInt(IsPhone) > 0) )97.{98. Cursor phoneNumber =getContentResolver().query(monDataKinds.Phone.CO NTENT_URI,null,monDataKinds.Phone.CONTACT_ID +"= "+ getContactInfo(ContactsContract.Contacts._ID),null, null);100.while (phoneNumber.moveToNext())101. {102. String strPhoneNumber =phoneNumber.getString(phoneNumber.getColumnIndex(ContactsContract.C ommonDataKinds.Phone.NUMBER));103. alTemp.add(strPhoneNumber);104. }105.106.if(phoneNumber.moveToFirst()){107.returnphoneNumber.getString(phoneNumber.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));108. }109.}110.111.return"";112.}package com.henii.android;import java.util.ArrayList;import android.app.Activity;import android.os.Bundle;import android.telephony.SmsManager;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;//!!!可以通过启动两个模拟器进行测试,发送短信时就拨另一个的端口号(如5554等)就行了!!!//在AndroidManifest.xml中要添加权限:<uses-permission android:name="android.permission.SEND_SMS"/>public class SMSActiv ity extends Activity {private EditText mobileText;private EditText contText;private Button sendBtn;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);//根据id找到控件并实例化它mobileText = (EditText)findViewById(R.id.MobileEditText);contText = (EditText)findViewById(R.id.ContEditText);sendBtn = (Button)findViewById(R.id.SendButton);//发送按钮的处理事件sendBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {String content = contText.getText().toString();String mobile = mobileText.getText().toString();//获得发送短信的管理器,使用的是android.telephony.SmsManagerSmsManager smsManager = SmsManager.getDefault();//如果短信内容过长则分段发送if(content.length() > 70){//使用短信管理器进行短信内容的分段,返回分成的段ArrayList<String> contents = smsManager.divideMessage(content);for(String msg : contents){//使用短信管理器发送短信内容//参数一为短信接收者//参数三为短信内容//其他可以设为nullsmsManager.sendTextMessage(mobile, null, msg, null, null);}//否则一次过发送}else{smsManager.sendTextMessage(mobile, null, content, null, null);}//吐司,用来显示发送成功的提示Toast.makeText(SMSActivity.this, R.string.sucTxt, Toast.LENGTH_SHORT).show();}});//!!!可以通过启动两个模拟器进行测试,发送短信时就拨另一个的端口号(如5554等)就行了!!!}}。