Android开发笔记(一百四十一)读取PPT和PDF文件

Android开发笔记(一百四十一)读取PPT和PDF文件
Android开发笔记(一百四十一)读取PPT和PDF文件

Android开发笔记(一百四十一)读取

PPT和PDF文件

读取ppt文件

读取纯文本

HSLFSlideShow类就是poi中专门用于解析幻灯片的工具类,每张幻灯片又分别由单独的HSLFSlide类处理,幻灯片中的具体图文内容则由HSLFTextParagraph和HSLFTextRun进行分辨。

下面是使用poi解析ppt文件(2003格式)的效果图:

不同版本的poi库在解析ppt的代码略有区别,下面是使用poi15读取ppt的代码:[java] view plain copy

public static ArrayList readPPT(String path) {

ArrayList contentArray = new ArrayList();

try {

FileInputStream fis = new FileInputStream(new File(path));

HSLFSlideShow hslf = new HSLFSlideShow(fis);

List slides = hslf.getSlides();

for (int i = 0; i < slides.size(); i++) {

String content = "";

HSLFSlide item = slides.get(i);

// 读取一张幻灯片的内容(包括标题)

List> tps = item.getTextParagraphs();

for (int j = 0; j < tps.size(); j++) {

List tps_row = tps.get(j);

for (int k = 0; k < tps_row.size(); k++) {

HSLFTextParagraph tps_item = tps_row.get(k);

List trs = tps_item.getTextRuns();

for (int l = 0; l < https://www.360docs.net/doc/922579742.html,ize(); l++) {

HSLFTextRun trs_item = trs.get(l);

content = String.format("%s%s\n", content, trs_item.getRawText());

}

}

}

contentArray.add(content);

}

} catch (Exception e) {

e.printStackTrace();

}

return contentArray;

}

读取图文样式

poi方式只能有效读取ppt内部的文字信息,对于ppt内带的图片以及文字样式,便力有不逮了。在博文《Android开发笔记(一百四十)Word文件的读取与显示》中,提到可以解析docx内部的document.xml文件,从xml标记中获取图片信息与样式信息,然后把图文格式构造成html文件,最后由WebView网页视图加载显示html。对于pptx文件,也可以解析pptx内部的slide*.xml幻灯片文件,采用跟解析docx类似的做法,把解析得到的图片与样式数据写入到html文件,从而曲线实现了pptx文件的读取功能。

下面是以HTML格式显示pptx文件的效果图:

下面是解析pptx并生成htmml文件的主要代码:

[java] view plain copy

private void readPPTX(String pptPath) {

try {

ZipFile pptxFile = new ZipFile(new File(pptPath));

int pic_index = 1; // pptx中的图片名从image1开始,所以索引从1开始

for (int i = 1; i < 100; i++) { // 最多支持100张幻灯片

String filePath = String.format("%s%d.html", FileUtil.getFileName(pptPath), i);

String htmlPath = FileUtil.createFile("html", filePath);

Log.d(TAG, "i="+i+", htmlPath=" + htmlPath);

output = new FileOutputStream(new File(htmlPath));

presentPicture = 0;

output.write(htmlBegin.getBytes());

ZipEntry sharedStringXML = pptxFile.getEntry("ppt/slides/slide" + i + ".xml"); // 获取每张幻灯片

InputStream inputStream = pptxFile.getInputStream(sharedStringXML);

XmlPullParser xmlParser = Xml.newPullParser();

xmlParser.setInput(inputStream, "utf-8");

boolean isTitle = false; // 标题

boolean isTable = false; // 表格

boolean isSize = false; // 文字大小

boolean isColor = false; // 文字颜色

boolean isCenter = false; // 居中对齐

boolean isRight = false; // 靠右对齐

boolean isItalic = false; // 斜体

boolean isUnderline = false; // 下划线

boolean isBold = false; // 加粗

int event_type = xmlParser.getEventType();// 得到标签类型的状态

while (event_type != XmlPullParser.END_DOCUMENT) {// 循环读取流

switch (event_type) {

case XmlPullParser.START_TAG: // 开始标签

String tagBegin = xmlParser.getName();

if (tagBegin.equalsIgnoreCase("ph")) { // 判断是否标题

String titleType = getAttrValue(xmlParser, "type", "text");

if (titleType.equals("text")) {

isTitle = false;

} else {

isTitle = true;

isSize = true;

if (titleType.equals("ctrTitle")) {

output.write(centerBegin.getBytes());

isCenter = true;

output.write(String.format(fontSizeTag,

getSize(60)).getBytes());

} else if (titleType.equals("subTitle")) {

output.write(centerBegin.getBytes());

isCenter = true;

output.write(String.format(fontSizeTag,

getSize(24)).getBytes());

} else if (titleType.equals("title")) {

output.write(String.format(fontSizeTag,

getSize(44)).getBytes());

}

}

}

if (tagBegin.equalsIgnoreCase("pPr") && !isTitle) { // 判断对齐方式

String align = getAttrV alue(xmlParser, "algn", "l");

xmlParser.getAttributeValue(0);

if (https://www.360docs.net/doc/922579742.html,uals("ctr")) {

output.write(centerBegin.getBytes());

isCenter = true;

}

if (align.equals("r")) {

output.write(divRight.getBytes());

isRight = true;

}

}

if (tagBegin.equalsIgnoreCase("srgbClr")) { // 判断文字颜色String color = xmlParser.getAttributeValue(0);

output.write(String.format(spanColor, color).getBytes());

isColor = true;

}

if (tagBegin.equalsIgnoreCase("rPr")) {

if (!isTitle) {

// 判断文字大小

String sizeStr = getAttrValue(xmlParser, "sz", "2800");

int size = getSize(Integer.valueOf(sizeStr)/100);

output.write(String.format(fontSizeTag, size).getBytes());

isSize = true;

}

// 检测到加粗

String bStr = getAttrValue(xmlParser, "b", "");

if (bStr.equals("1")) {

isBold = true;

}

// 检测到斜体

String iStr = getAttrValue(xmlParser, "i", "");

if (iStr.equals("1")) {

isItalic = true;

}

// 检测到下划线

String uStr = getAttrValue(xmlParser, "u", "");

if (uStr.equals("sng")) {

isUnderline = true;

}

}

if (tagBegin.equalsIgnoreCase("tbl")) { // 检测到表格

output.write(tableBegin.getBytes());

isTable = true;

} else if (tagBegin.equalsIgnoreCase("tr")) { // 表格行

output.write(rowBegin.getBytes());

} else if (tagBegin.equalsIgnoreCase("tc")) { // 表格列

output.write(columnBegin.getBytes());

}

if (tagBegin.equalsIgnoreCase("pic")) { // 检测到图片

ZipEntry pic_entry = FileUtil.getPicEntry(pptxFile, "ppt",

pic_index);

if (pic_entry != null) {

byte[] pictureBytes = FileUtil.getPictureBytes(pptxFile, pic_entry);

writeDocumentPicture(i, pictureBytes);

}

pic_index++; // 转换一张后,索引+1

}

if (tagBegin.equalsIgnoreCase("p") && !isTable) {// 检测到段落,如果在表格中就无视

output.write(lineBegin.getBytes());

}

// 检测到文本

if (tagBegin.equalsIgnoreCase("t")) {

if (isBold == true) { // 加粗

output.write(boldBegin.getBytes());

}

if (isUnderline == true) { // 检测到下划线,输入

output.write(underlineBegin.getBytes());

}

if (isItalic == true) { // 检测到斜体,输入

output.write(italicBegin.getBytes());

}

String text = xmlParser.nextText();

output.write(text.getBytes()); // 写入文本

if (isItalic == true) { // 输入斜体结束标签

output.write(italicEnd.getBytes());

isItalic = false;

}

if (isUnderline == true) { // 输入下划线结束标签

output.write(underlineEnd.getBytes());

isUnderline = false;

}

if (isBold == true) { // 输入加粗结束标签

output.write(boldEnd.getBytes());

isBold = false;

}

if (isSize == true) { // 输入字体结束标签

output.write(fontEnd.getBytes());

isSize = false;

}

if (isColor == true) { // 输入跨度结束标签

output.write(spanEnd.getBytes());

isColor = false;

}

// if (isCenter == true) { // 输入居中结束标签。要在段落结束之前再输入该标签,因为该标签会强制换行

// output.write(centerEnd.getBytes());

// isCenter = false;

// }

if (isRight == true) { // 输入区块结束标签

output.write(divEnd.getBytes());

isRight = false;

}

}

break;

// 结束标签

case XmlPullParser.END_TAG:

String tagEnd = xmlParser.getName();

if (tagEnd.equalsIgnoreCase("tbl")) { // 输入表格结束标签

output.write(tableEnd.getBytes());

isTable = false;

}

if (tagEnd.equalsIgnoreCase("tr")) { // 输入表格行结束标签

output.write(rowEnd.getBytes());

}

if (tagEnd.equalsIgnoreCase("tc")) { // 输入表格列结束标签

output.write(columnEnd.getBytes());

}

if (tagEnd.equalsIgnoreCase("p")) { // 输入段落结束标签

,如果在表格中就无视

if (isTable == false) {

if (isCenter == true) { // 输入居中结束标签

output.write(centerEnd.getBytes());

isCenter = false;

}

output.write(lineEnd.getBytes());

}

}

break;

default:

break;

}

event_type = xmlParser.next();// 读取下一个标签

}

output.write(htmlEnd.getBytes());

output.close();

htmlArray.add(htmlPath);

}

} catch (Exception e) {

e.printStackTrace();

}

}

读取pdf文件

Vudroid方式读取

上面以html方式显示pptx文件,虽然能够读取图片与文字样式,但是与原始的幻灯片内容相差还是比较大的,主要问题包括:

1、ppt中的图文不像word那样一般是上下排列,而是既有上下排列又有左右排列,还有根据相对位置的排列。可是简单的html格式只能上下排列,难以适应其它方向的图文排版。

2、ppt通常自带幻灯片背景,也就是每个幻灯片都有的背景图片,可是slide*.xml文件中解析不到背景图片;况且由于背景图的存在,使得图片序号与幻灯片插图对应不上,造成幻灯片页面上的插图产生混乱。

3、每张ppt的尺寸规格是固定的,及长度和高度的比例是不变的;但是一旦转为html格式,页面的长宽比例就乱套了,完全不是ppt原来的排版布局。

如果在java服务端,可以调用HSLFSlide类的draw方法,直接把每张幻灯片原样画到临时的图像文件。然而在手机端,无法调用draw方法,因为该方法用到了java的awt图像库,而Android并不提供该图像库,所以poi不能直接绘制ppt的原始页面。

既然直接显示原样的幻灯片难以实现,那么就得考虑其它的办法,一种思路是先在服务端把ppt文件转换为pdf文件,然后手机端再来读取pdf文件。正好Android平台上拥有多种pdf 的解析方案,其中之一是开源框架Vudroid,该框架允许读取pdf文件,并把pdf文件内容以列表形式打印在屏幕上。下面是使用Vudroid框架解析pdf文件的效果图:

若要在Android项目中集成Vudroid框架,可按照以下步骤处理:

1、在AndroidManifest.xml中添加SD卡的操作权限;

2、在libs目录下导入Vudroid的so库libvudroid.so;(使用ADT开发时)

3、在工程源码中导入org.vudroid.pdfdroid包下的所有源码;

下面是使用Vudroid框架解析pdf文件的代码:

[java] view plain copy

public class VudroidActivity extends Activity implements

OnClickListener, FileSelectCallbacks {

private final static String TAG = "VudroidActivity";

private FrameLayout fr_content;

private DecodeService decodeService;

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(https://www.360docs.net/doc/922579742.html,yout.activity_pdf_vudroid);

decodeService = new DecodeServiceBase(new PdfContext());

findViewById(R.id.btn_open).setOnClickListener(this);

fr_content = (FrameLayout) findViewById(R.id.fr_content);

}

@Override

protected void onDestroy() {

decodeService.recycle();

decodeService = null;

super.onDestroy();

}

@Override

public void onClick(View v) {

if (v.getId() == R.id.btn_open) {

FileSelectFragment.show(this, new String[] {"pdf"}, null);

}

}

@Override

public void onConfirmSelect(String absolutePath, String fileName, Map map_param) {

String path = String.format("%s/%s", absolutePath, fileName);

Log.d(TAG, "path="+path);

DocumentView documentView = new DocumentView(this);

documentView.setLayoutParams(new https://www.360docs.net/doc/922579742.html,youtParams(

https://www.360docs.net/doc/922579742.html,youtParams.MATCH_PARENT,

https://www.360docs.net/doc/922579742.html,ms.MATCH_PARENT));

decodeService.setContentResolver(getContentResolver());

decodeService.setContainerView(documentView);

documentView.setDecodeService(decodeService);

decodeService.open(Uri.fromFile(new File(path)));

fr_content.addView(documentView);

documentView.showDocument();

}

@Override

public boolean isFileValid(String absolutePath, String fileName, Map map_param) {

return true;

}

}

MuPDF方式读取

虽然Vudroid框架能够正常解析并显示pdf文件内容,但美中不足的是:

1、Vudroid框架解析速度偏慢;

2、显示pdf页面时采用马赛克逐格展示,不够友好;

3、整个pdf文件内容都调用draw方法绘制,难以改造为翻页浏览的形式;

基于以上情况,博主又尝试了其它的pdf解析框架,发现MuPDF这个解决方案较为理想。MuPDF的实现代码相对较少,调用起来也比较方便,而且支持只浏览指定页面,这意味着我们可以使用翻页形式来逐页浏览pdf文件,更加符合普通用户的使用习惯。下面是采用MuPDF框架解析pdf文件的效果图(列表形式):

若要在Android项目中集成MuPDF框架,可按照以下步骤处理:

1、在AndroidManifest.xml中添加SD卡的操作权限;

2、在libs目录下导入MuPDF的so库libmupdf.so;(使用ADT开发时)

3、在工程源码中导入com.artifex.mupdf包下的所有源码;

下面是使用MuPDF框架解析pdf文件的代码:

[java] view plain copy

public class PdfFragment extends Fragment implements OnPDFListener {

private static final String TAG = "PdfFragment";

protected View mView;

protected Context mContext;

private int position;

public static PdfFragment newInstance(int position) {

PdfFragment fragment = new PdfFragment();

Bundle bundle = new Bundle();

bundle.putInt("position", position);

fragment.setArguments(bundle);

return fragment;

}

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

Log.d(TAG, "width="+container.getMeasuredWidth()+", height="+container.getMeasuredHeight());

mContext = getActivity();

if (getArguments() != null) {

position = getArguments().getInt("position");

}

MuPDFPageView pageView = new MuPDFPageView(mContext,

https://www.360docs.net/doc/922579742.html,Instance().pdf_core,

new Point(container.getMeasuredWidth(), container.getMeasuredHeight()));

PointF pageSize = MainApplication.getInstance().page_sizes.get(position);

if (pageSize != null) {

pageView.setPage(position, pageSize);

} else {

pageView.blank(position);

MuPDFPageTask task = new MuPDFPageTask(

MainApplication.getInstance().pdf_core, pageView, position);

task.setPDFListener(this);

task.execute();

}

return pageView;

}

@Override

public void onRead(MuPDFPageView pageView, int position, PointF result) { MainApplication.getInstance().page_sizes.put(position, result);

if (pageView.getPage() == position) {

pageView.setPage(position, result);

}

}

}

Android开发者学习笔记——View、Canvas、bitmap

开发者学习笔记——View&Canvas BitMap、View以及Canvas是我们Ophone程序中常用到的类。本日以feisky的学习笔记呈现,通过实例讲解View&Canvas等等。 1. 从资源中获取位图 可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图。 当然,首先需要获取资源: Resources res=getResources(); 使用BitmapDrawable获取位图 使用BitmapDrawable (InputStream is)构造一个BitmapDrawable; 使用BitmapDrawable类的getBitmap()获取得到位图; // 读取InputStream并得到位图 InputStream is=res.openRawResource(R.drawable.pic180); BitmapDrawable bmpDraw=new BitmapDrawable(is); Bitmap bmp=bmpDraw.getBitmap(); 或者采用下面的方式: BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic180); Bitmap bmp=bmpDraw.getBitmap(); 使用BitmapFactory获取位图 (Creates Bitmap objects from various sources, including files, streams, and byte-arrays.) 使用BitmapFactory类decodeStream(InputStream is)解码位图资源,获取位图。Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180); BitmapFactory的所有函数都是static,这个辅助类可以通过资源ID、路径、文件、数据流等方式来获取位图。 以上方法在编程的时候可以自由选择,在Android SDK中说明可以支持的图片格式如下:png (preferred), jpg (acceptable), gif (discouraged),和bmp(Android SDK Support Media Format)。

新版Android开发教程+笔记七--基础UI编程1

封面

Android 基础UI编程1 更改与显示文字标签 TextView 标签的使用 ①导入TextV iew包 import android.widget.TextView; ②在mainActivity.java中声明一个TextView private TextView mTextView01; ③在main.xml中定义一个TextView ④利用findView ById()方法获取main.xml中的TextView mTextView01 = (TextView) findViewById(R.id.TextView01); ⑤设置TextV iew标签内容 String str_2 = "欢迎来到Android 的TextView 世界..."; mTextView01.setText(str_2); ⑥设置文本超级链接

Android驱动开发实例(控制LED灯)(精)

Android驱动例子(LED灯控制) 本例子,讲述在Android2.1上完全自已开发一个驱动去控制硬件口并写应用测试该驱动,通过这样一个例子,解析android下的驱动开发流程的应用调用流程,可以说是很好的入门引导 要达到的效果:通过Android的应用,调用驱动程序,在开发板上控制4个LED的亮灭。 一、硬件原理 如上图,通过4个IO口控制这LED,低电平LED亮, 这4个IO口分别是GPM1, GPM2, GPM3, GPM4, 二、驱动程序 1、在kernel文件夹下的driver目录,新键驱动文件夹 # cd kernel_Android_2.6.28.6/drivers 进到开发板的kernel目录,建驱动文件夹 #mkdir ledtest

2、在/driver/ledtest目录下,新建leddriver.c ,leddriver.h , Kconfig, Makefile 等4个文件leddriver.c leddriver.c 1. #include 2. #include 3. #include 4. #include/* For __init/__exit/... */ 5. #include 6. #include 7. #include 8. #include 9. #include 10. #include 11. #include 12. #include 13. #include 14. #include 15. #include 16. #include 17. #include//for register_chrdev( 18. #include 19. #include 20. #include"leddriver.h" 21. #include/* For MODULE_ALIAS_MISCDEV 22. (WATCHDOG_MINOR */ 23. #include/* For the watchdog specific items */ 24. #include/* For file operations */ 25. #define Viberator_MAJOR 97 //?÷éè±?o? 26. #define SCULL_NR_DEVS 4 27. #define SCULL_QUANTUM 4000 28. #define SCULL_QSET 1000 29. //---do as the GIO driver

android系统开发--HAL层开发基础

android系统开发--HAL层开发基础 Android HAL层,即硬件抽象层,是Google响应厂家“希望不公开源码”的要求推出的新概念 1,源代码和目标位置 源代码:/hardware/libhardware目录,该目录的目录结构如下: /hardware/libhardware/hardware.c编译成libhardware.so,目标位置为/system/lib目录 /hardware/libhardware/include/hardware目录下包含如下头文件: hardware.h 通用硬件模块头文件 copybit.h copybit模块头文件 gralloc.h gralloc模块头文件 lights.h 背光模块头文件 overlay.h overlay模块头文件 qemud.h qemud模块头文件 sensors.h 传感器模块头文件 /hardware/libhardware/modules目录下定义了很多硬件模块 这些硬件模块都编译成xxx.xxx.so,目标位置为/system/lib/hw目录 2,HAL层的实现方式 JNI->通用硬件模块->硬件模块->内核驱动接口 具体一点:JNI->libhardware.so->xxx.xxx.so->kernel 具体来说:android frameworks中JNI调用/hardware/libhardware/hardware.c中定义的hw_get_module函数来获取硬件模块, 然后调用硬件模块中的方法,硬件模块中的方法直接调用内核接口完成相关功能 3,通用硬件模块(libhardware.so) (1)头文件为:/hardware/libhardware/include/hardware/hardware.h 头文件中主要定义了通用硬件模块结构体hw_module_t,声明了JNI调用的接口函数 hw_get_module hw_module_t定义如下: typedef struct hw_module_t { /** tag must be initialized to HARDWARE_MODULE_TAG */ uint32_t tag; /** major version number for the module */ uint16_t version_major; /** minor version number of the module */ uint16_t version_minor; /** Identifier of module */ const char *id; /** Name of this module */ const char *name;

android开发学习笔记

Android开发学习笔记 by---- 三爷一、新建项目 Application Name: 应用程序名,即该应用的名称,日后在安卓市场上将显示该App名称,与项目无关。 Project Name:项目中的工程名(项目中的App名),注意,在项目中将使用该名称,该工程将被存放在下面命名的包下,命名时要注意规范。 Package Name:包名,格式为“com.自定义的包名.工程名”,其中包名自定义,但包名后的工程名必须和上面的Project Name一至。 Build SDK:选择android SDK的版本,建议选择1.6版本兼容范围广一点 Minimum Required SDK:该程序兼容的最低SDK版本,这里选择的版本必须跟上面选择的Build SDK版本一致。 Activity Name:第一个Activity的名称,随意命名,它将是程序的入口 Layout Name:为第一个Activity布局的xml文件名称,随意命名,建议与其对应的activity 名称有一定的关联性。 Title:上面设置的Activity的标题(这个在程序里都可以改) 二、项目文件夹说明 com.PackageName.ProjectName:该项目的文件夹,里面存放我们编写的源文件 gen:由ADT自动生成,其中包含有一个R.java的文件是用于声明res文件夹下的资源的句柄,程序将通过该文件来引用项目中的资源,该文件不要随意改动,。 Android 1.6:这里面是android的SDK包,程序中所有引用android的类都是从这个包里引用;这里的1.6为新建项目时选择的sdk版本号,这里的版本号会根据你新建项目时选择的版本号不同而不同。 bin:这个目录存放编译生成的android安装文件 assets:存放项目的资源,比如视频、音频、图片等较大的资源,注意该目录下的资源不会被生成句柄,所以只能通过路径来引用。

嵌入式linux android驱动工程师 面试题总汇

嵌入式linux android驱动工程师面试题总汇 1. 嵌入式系统中断服务子程序(ISR) 收藏中断是嵌入式系统中重要的组成 部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt 关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。 __interrupt double compute_area (double radius) { double area = PI * radius * radius; printf(" Area = %f", area); return area; } 1). ISR 不能返回一个值。2). ISR 不能传递参数。3). 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。4). 与第三点一脉相承,printf()经常有重入和性能上的问题。 2.C语言中对位的操作,比如对a的第三位清0,第四位置1.本来应该会的,一犯晕写反了,以后注意! #define BIT3 (1<<3) #define BIT4 (1<<4) a &= ~BIT3; a |= BIT4; 3.考到volatile含义并举例:理解出错,举了很具体的例子,连程序都搬上去了,有些理解不深的没举出来…… volatile表示这个变量会被意想不到的改变,每次用他的时候都会小心的重新读取一遍,不适用寄存器保存的副本。 volatile表示直接存取原始地址 例: 并行设备的硬件寄存器(状态寄存器) 在多线程运行的时候共享变量也要时时更新 一个中断服务子程序中访问到的的非自动变量(不太清楚,正在查找资料ing……) 4.要求设置一绝对地址为0x67a9 的整型变量的值为0xaa66 当时我的写法:#define AA *(volatile unsigned long *)0xaa66 AA = 0x67a9; 答案:

Android智能电视APP开发笔记(一)

Android智能电视APP开发笔记(一) 1缘起 以小米盒子为代表的OTT机顶盒、智能电视的快速普及,快速推动了Android技术在机顶盒、智能电视领域的普及。既然都是用的Android操作系统,那么从技术上来说应该是大同小异的,当然和手机APP的应用相比,电视端的APP开发应该有一些都有的特点需要关注,我相信这样的特点应该不会太多。 写这个笔记的缘起在于一个生活上的小小不便,因为儿子正在读小学,每天早上起来都需要听英语,学校发的磁带真的是不方便,老的磁带机相信很少有人用了,虽然也给他买了一个步步高的复读机,不过没用几天就被搁置了。于是我在网上搜了个APP,在手机上很好用,可以直接翻看课文,也可以朗读课文,翻到哪页就朗读哪页,如果不翻动,就自动往下读,做的还是相当人性化的,但是这样一个新的问题产生了,每天早上我的手机就被我儿子霸占了,接到音响上听英语了,我要看个朋友圈啊啥的,就不方便了。 刚好家中有个OTT机顶盒,可以安装APP,就想着把这个APP装到OTT机顶盒上,结果发现完全无法使用,界面不对了,遥控器也响应不了了,完全无法使用啊,结论就是手机APP和TV APP还是有些区别的,须要作些微调适配的。 咋整呢?重新给写一个TV APP吧,为了夺回我手机的控制权,好歹哥以前也是开发工程师啊。 2Win7虚拟机创建 2.1 VMware Workstation安装 直接把开发环境安装在自己电脑上感觉不是太好,一个影响系统运行速度,二是免不了要装了卸,卸了装,把电脑运行环境搞得乱七八糟。所以决定还是在虚拟机环境中玩。 虚拟机当然选行业老大VMware了,下载Vmware workstation进行安装。没想到这玩意都升级到11.1版本了,这个世界真的是变化快啊。 从官网下载后再安装:

android开发笔记

实现直接拒接来电 经过简单的google/baidu后,发现android没有现成的API去拒接电话。android可以通过注册BroadcastReceiver截取短信,因为这个broadcast是一个ordered broadcast,所以只要优先级比短信接收程序高,就可以提前终止掉这个broadcast receiver。 但是,电话呼入则没有类似的机制。不过,综合网上的一些资料,通过以下大体的步骤,则可以实现拒接电话: 1、注册broadcast receiver,监视手机状态: Java代码 1. 2. 3. 4. 5. 当手机接收到电话时,则会触发该broadcast receiver。 2、最重要的,就是取得可以控制电话的API。这些API貌似是android内部的接口,并未暴露。具体方式参见该帖子:https://www.360docs.net/doc/922579742.html,/u/20091226 ... d-586a278875c0.html 使用时需要手动添加import: Java代码 1.import com.android.internal.telephony.ITelephony; import com.android.internal.telephony.ITelephony; 同样的方式,在stackoverflow上也有人大致地提了下:https://www.360docs.net/doc/922579742.html,/questio ...

android学习笔记

1,android手势开发识别Gestrue开发 (https://www.360docs.net/doc/922579742.html,/tsdl2009/archive/2010/08/13/5810922.aspx) 经过了一段Android的学习,基本上了解了Android的基础知识。今天,我们来研究一下Android中特有的手势识别技术,即Gesture。首先,我从网上找了很多资料,具体归纳起来有2类:一类是触摸屏手势识别,另一类是输入法手势识别。 我们先来讨论一下第一类触摸屏手势识别,这个比较简单,就是利用触摸屏的Fling、Scroll等Gesture(手势)来操作屏幕,比如用Scroll手势在浏览器中滚屏,用Fling在阅读器中翻页等。在Android系统中,手势的识别是通过GestureDetector.OnGestureListener接口来实现的。下面通过我自己的一个动手实验来进行介绍。 首先,我们在Eclipse中创建一个工程,名称叫SignFilpDemo。然后,在src 中创建一个SignFilpDemo源文件。这个工程是基于Android1.6的。因为,在Android 1.6之前的版本中,需要开发者编写大量的代码才能实现某些更为复杂的Gestures功能。而在之后的版本SDk中嵌入标准的Gestures API库(Package: android.gesture),包括了所有与Gesture技术相关的操作:存储、加载、创建新Gestures和识别等。其工程结构如下: 图1 接着,我们知道Android的事件处理机制是基于Listener(监听器)来实现的,比如我们今天所说的触摸屏相关的事件,就是通过onTouchListener。因此,我们在源代码中要实现这个接口。另外,我们还要实现OnGestureListener接口,因为,那个手势的识别是通过GestureDetector.OnGestureListener接口来实现的。其中,onTouchEvent方法则是实现了OnTouchListener中的抽象方法,我们只要在这里添加逻辑代码即可在用户触摸屏幕时做出响应。在这里我们调用GestureDetector的onTouchEvent()方法,将捕捉到的MotionEvent交给GestureDetector 来分析是否有合适的callback函数来处理用户的手势。接下来,就是实现了以下6个抽象方法,其中最有用的当然是onFling()、onScroll()和onLongPress()了。下面介绍一下: (1)用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发,其源代码如下: public boolean onDown(MotionEvent e) { return false;

Android移动应用开发习题答案

Android移动应用开发习题答案 单元1 Android开发环境搭建与模拟器创建 1.填空题 (1) 2008 (2) Linux、操作系统 (3) 应用程序层、应用程序框架层、核心类库、Linux内核 (4) Java C++/C (5) 应用框架 (6) 应用程序 (7) 模拟器、Android模拟器 (8) IntelliJ IDEA Android 2.选择题 (1)创建程序的过程中,填写Application Name表示()。 正确答案:A (2)Android操作系统的手机可以有以下几个方法进行软件安装()。(多选题)ABCD (3)Android操作系统主要的特点是:()。(多选题) 正确答案:ABC (4)以下对Android操作系统描述正确的是:()。(多选题) 正确答案:ABCD (5)以下哪些是Android Stuido的优势()。(多选题) 正确答案:ABCD (6)以下哪些是Genymotion模拟器的优势()。(多选题) 正确答案:ABCD 3.简答题 (1)Android的四层架构分别包括哪几层?分别起到什么作用? 参考答案: Linux内核层(Linux Kernel):基于Linux内核,内核为上层系统提供了系统服务。 核心类库层(Libraries):系统库基于C/C++语言实现,通过接口向应用程序框架层提

基于Android Studio的移动应用开发任务驱动教程 供编程接口。 应用框架层(Application Framework):为开发者提供了一系列的Java API,包括图形用户界面组件View、SQLite数据库相关的API、Service组件等。 应用程序层(Applications):包含了Android平台中各式各样的应用程序。 (2)简述Android开发环境安装的步骤。 参考答案: 下载并安装JDK,配置JDK的环境变量; 从Anroid官网上下载Android开发组件(包含Eclipse和Android SDK、ADT); 安装Android开发环境(包括配置Android SDK的环境变量、打开Eclipse通过菜单设定Android SDK路径)。 (3)简述Android Studio的优势。 参考答案:略。 (4)简述Genymotion模拟器的优势。 参考答案:略。 (5)简述Android应用程序创建和运行的步骤。 参考答案: 通过菜单创建Android应用程序,设置应用程序名、Android版本等基本信息。 单击菜单中的运行按钮可以直接运行Android项目(也可以通过菜单配置运行参数, 指定运行的模拟器)。 单元2 Android Studio的组成结构与基本操作 1.填空题 (1) res/layout (2) Activity、Bundle (3) XML (4) java代码文件 (5) AndroidManifest.xml (6) 打包成.apk文件 2.选择题 (1)如果需要创建一个字符串资源,需要将字符串放在res\values的哪个文件中?()B (2)新建的Android程序默认的布局方式是相对布局(RelativeLayout),该布局中包含一个()控件。 B (3)要让布局文件或者控件能够显示在界面上,必须要设置RelativeLayout和控件的

安卓开发学习笔记

1.avd:android virtual device 2.5554:模拟器端口号 3.ddms 观察线程thread 堆栈heap 、file explorer、emulator control(模拟打电话发短信) 4.Extras文件夹拓展工具 5.Adb.exe: android debug bridge 安卓调试桥 6.Adb常用指令:(配置环境变量) 1)adb devices:列出所有连接设备 2)Reset adb:重启adb调试桥 3)Adb kill-server:杀死adb调试桥 4)Adb start-server:启动adb调试桥 5)Netstat -ano:查看端口号 ----------------------------------------------------------------------------------------- 7.Platforms是系统文件 8.Assets是资产目录存放在该文件夹下面这些文件会被打包到应用程序的apk 9.Bin 编译后的文件目录 10.Gen自动生成的其下的R.java的内容也是通过修改其他文件内容而自动生成 11.Android.jar基于此jar包的开发 12.Project.properties 代表编译的版本可以修改 13.Libs 支持jar 包会被添加到Android dependence(依赖)目

录下 14.Res 资源目录 15.Drawable存放应用程序图标会自动生成一个id 在R文件里 1)H high 高分辨率 2)M middle 中分辨率 3)L low 低分辨率 4)X extra large 特大分辨率 5)Xx 超大分辨率 16. R文件的作用:自动编译生成res文件中的ID 17.Android manifest:应用程序的清单文件 程序的配置信息启动的图标应用程序名称包名版本号 -------------------------------------------------------------------------------------- 18.Android下软件安装的过程: 1)拷贝xxx.apk到/data/app/xxx-1.apk 2)在data/data目录下创建一个文件夹文件夹名称是当前应 用程序的包名。 3)软件卸载的过程是相反的 19.system/app下安装的是系统自带的应用 20.Windows下注册表是通过数据库实现;Android下的注册表是用xml文件实现

51CTO学院-Android驱动与HAL开发实战视频课程

Android驱动与HAL开发实战视频课程 课程目标 本教程主要讲解了如何开发Android底层的驱动程序(Linux驱动),以及Android HAL的开发。并使用蜂鸣器等demo来讲解。 适用人群 了解Android的基本知识,想从事Android底层开发的学员。 课程简介 课程目标: 本教程主要讲解了如何开发Android底层的驱动程序(Linux驱动),以及Android HAL的开发。并使用蜂鸣器等demo来讲解。 适合对象: 了解Android的基本知识,想从事Android底层开发的学员。 学习条件: 熟悉Linux的基本操作和C语言 1 Android底层开发概述 [免费观看] 47分钟 本讲主要介绍了Android底层开发概况、Android底层架构、Linux驱动程序的基本结构等内容。 2 搭建开发环境 [免费观看] 44分钟 本讲主要介绍了如何搭建用于开发Android底层的开发环境。 3 源代码下载和编译 45分钟 本讲主要介绍了如何编译Android源代码和Linux内核源代码。并且如何下载这些系统的源代码。 4

搭建S3C6410开发板的测试环境 40分钟 本讲主要介绍了如何搭建S3C6410开发板(Android系统)的开发测试环境。本教程后面的蜂鸣器、LED驱动开发都会使用这个开发板进行开发和测试,其他类似的开发板也同样适用。不过需要向厂家或销售商索要相应的驱动。其余的例子也可以在手机和平板电脑上测试。 5 第一个Linux驱动_读写设备文件(1) [免费观看] 45分钟 本讲主要介绍了如何开发第一个有读写功能的Linux驱动程序(第一部分) 6 第一个Linux驱动_读写设备文件(2) [免费观看] 47分钟 本讲主要介绍了实现第一个Linux驱动的第二部分。 7 实现LED驱动(1) 42分钟 本讲主要介绍了实现LED驱动的基本方法,并实现了这个LED驱动(第一部分)。 8 实现LED驱动(2) 42分钟 本讲主要介绍了实现LED驱动的基本方法,并实现了这个LED驱动(第二部分)。 9 实现LED驱动(3) 47分钟 本讲主要介绍了实现LED驱动的基本方法,并实现了这个LED驱动(第三部分)。 10

Android驱动---LED驱动的编写汇总

Android驱动---LED驱动的编写 1.编写Android驱动时,首先先要完成Linux驱动,因为android驱动其实是在linux驱动基础之上完成了HAL层(硬件抽象层),如果想要测试的话,自己也要编写Java程序来测试你的驱动。 2.android的根文件系统是eclair_2.1版本。我会上传做好的根文件系统提供大家。这里要说的是,android底层内核还是linux的内核,只是进行了一些裁剪。做好的linux内核镜像,这个我也会上传给大家。android自己做了一套根文件系统,这才是android自己做的东西。android事实上只是做了一套根文件系统罢了。 假设linux驱动大家都已经做好了。我板子上有四个灯,通过ioctl控制四个灯,给定不同的参数,点亮不同的灯。 linux驱动代码因平台不同而有所不同,这就不黏代码了。 这是我测试linux驱动编写的驱动,代码如下: [cpp] view plaincopy #include #include #include #include #include #include #include #include #define LED_ON _IO ('k',1) #define LED_OFF _IO ('k',2) int main() { int i = 0; int dev_fd; dev_fd = open("/dev/led",O_RDWR); if ( dev_fd == -1 ) { printf("Cann't open file /dev/led\n"); exit(1); } while(1) { ioctl(dev_fd,LED_ON,1); sleep(1); ioctl(dev_fd,LED_OFF,1); sleep(1); ioctl(dev_fd,LED_ON,2); sleep(1); ioctl(dev_fd,LED_OFF,2);

第一行代码Android学习笔记完全版

第一行代码Android学习笔记 感谢《第一行代码》,感谢郭霖博主,拯救我于水火。之前看视频学习Android,自以为已经小成了。在网易工作的朋友问了我几个问题,我就懵逼了。然后,遇到了《第一行代码》,终于把我带进了Android的世界。好书,真的会醉人啊。 这是学习第二遍时的部分笔记,以备后用。 这是第二版,比第一版增加了一些常用的方法。 hujunjob 于北航 2015.04.02

目录 第一章Android系统 (6) 1.1 安卓系统架构 (6) 1.2 Android 项目中的资源 (6) 第二章Activity (6) 一、创建Activity步骤: (6) 二、采用Intent切换activity (7) 1、显式Intent (7) 2、隐式Intent (7) 3、隐式Intent的其他用法 (8) 三、Intent传递数据 (8) 1、向下一个activity传递数据 (8) 2、返回数据给上一个activity (8) 四、activity的生命周期 (9) 1、活动状态 (9) 2、activity生存期 (9) 3、activity被回收数据保存 (11) 五、activity的启动模式 (11) 六、activity最佳实践 (11) 1、知道当前页面是哪一个activity (11) 2、随时随地退出程序 (11) 3、给每个activity都添加一个合适的启动方法 (13) 第三章UI (13) 一、常用控件 (13) 1、TextView (13) 2、Button (13) 3、EditText (13) 4、ImageView (14) 5、ProgressBar (14) 6、AlertDialog (14) 7、ProgressDialog (15) 二、基本布局 (15) 1、LinearLayout (15) 2、RelativeLayout (15) 3、FrameLayout (15) 4、TableLayout (15) 5、GridLayout (16) 三、自定义控件 (16) 1、添加自定义标题布局(无操作的) (16) 2、创建自定义控件 (16) 四、ListView (17) 1、最简单的Adapter (17) 2、定制ListView界面 (18)

Android学习笔记

Android学习笔记(by quqi99 MSN: quqi99@https://www.360docs.net/doc/922579742.html,)Android platform是一个用于开发移动程序的软件包,它包括了操作系统、中间件及一些关键应用。开发者能使用android SDK为Android platform开发应用,这些应用使用JA V A 语言书写,运行在虚拟机Dalvik(一个专为手机程序开发的基于linux内核的JA V A虚拟机)。 https://www.360docs.net/doc/922579742.html,/wiki/index.php?title=%E7%BF%BB%E8%AF%91%E4%BB%BB %E5%8A%A1%E9%A2%86%E5%8F%96&printable=yes https://www.360docs.net/doc/922579742.html,/forumdisplay.php?fid=2 1 什么是Android 1.1 Android的特性 ?应用框架,让一些基础设施得以重用 ?Dalvik虚拟机,专为开发移动程序优化 ?集成的浏览器,(基于WebKit引擎) ?优化的图形库,(2D图形库以及基于OpenGL ES 1.0规范的3D图形库) ?SQLite,用于结构化数据的存储,是一个数据库 ?多媒体支持,支持多种音频,视频格式(MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF) ?GSM技术(依赖具体硬件) ?Bluetooth, EDGE, 3G, WiFi(依赖具体硬件) ?Camera, GPS, compass, accelerometer(依赖具体硬件) ?丰富的开发环境(DEBUG工具,内存及性能工具,Eclipse的插件等) 1.2 Android的架构 Android操作系统的模块如下:

Android Linux驱动开发工程师简历模板

Megan简历 工作经历 XX有限公司2016年09月- 2019年10月Android/Linux驱动开发工程师 带领驱动开发团队进行DM8127平台的定制开发,完成inux内核/uboot移植,外围驱动移植与开发, 基于IPNCRDK 搭建视频采集,降噪,编码、输出的数据流。配合应用团队实现智能交通抓拍业务。负责技术方案的预研和选型。负责软件版本需求评估、实现评估,工作分配,版本构建和发布、测试故障指派和处理等。 负责Atmel maxtouch电容触摸产品线技术开发与支持,包括Android驱动开发支持和项目性能调试和优化等。负责MIPI 桥接芯片和DDI显示驱动芯片技术支持。负责团队的建设和协调,以及开发进度的跟踪。 XX有限公司 2014年07月- 2016年08月Android/Linux驱动开发工程师 负责几款公司开发的ARM+DSP多媒体处理器芯片的测试、应用开发;这几款芯片广泛应用于Android平板电脑、微型投影机、电子书、MID等领域。 熟悉codec图像编解码算法,dsp底层算法库,主要用汇编开发,独立解决了编解码双核调度的问题。熟练使用c/c++。阅读过Android操作系统ion源码 公司ti平台开发板WinCE系统BSP,公司ti和freescale平台开发板的Android系统BSP开发和驱动开发,负责开发了一个RTSP流媒体的流媒体,把上级领导交代的工作尽快做好,提高工作效率。 教育经历 成都信息工程学院2010年09月- 2014年06月电子科学与技术本科 成都其他 技能:Dsp,Word,C/C++,Wince,Excel,Android,操作系统,办公软件 语言:普通话二级甲等证书

Android应用开发_学习笔记

一、Android基础及UI 1、Android程序的组成 一个Android程序一般有以下4个部分组成: 1)Activity(活动) ①、一个应用程序是由一个或者多个Activity组成。 ②、一个Activity代表了可以和用户进行交互的可视化界面。 ③、Activity通过布局管理添加各种View组件。 ④、通过setContentView(int id)方法可以将视图呈现出来。 ⑤、Activity的生命周期 图1 Activity的生命周期图 2)Broadcast Receiver(广播接收器) ①、Broadcast Receiver负责对外部事件做出响应。 ②、Broadcast Receiver不生成UI,是不可见的。 ③、Broadcast Receiver需要在程序中进行注册。 ③、应用程序可以通过Context.sendBroadcast()将自己的intent广播出去。其他程序通过自身的Broadcast Receivers截获后进行时间处理。 3)Service(服务) ①、service运行在后台,负责处理一些用户看不到,并且会有持续时间的事情。比如下载数据,播放音乐等。 ②、service是跑在程序的主线程中,处理耗时的事件续。 ③、service没有用户界面所有用户实现的service必须继承系统的Service

类,并且在配置文件中进行注册。 4)Content Provider(内容管理器) ①、数据在Android当中是程序私有的。 ②、Content Provider提供了多个程序间数据交互的机制。 ③、Content Provider暴露出来一些标准的API来对数据进行操作: query(Uri, String[], String, String[], String) :通过关键字查询数据。 insert(Uri, ContentV alues) :将一组数据插入到指定的地方。 update(Uri, ContentValues, String, String[]) :更新数据。 delete(Uri, String, String[]) :删除数据。 2、AndroidManifest.xml文件组成 该文件主要声明Android应用程序的构成: ①、程序包的全局变量 ②、活动(Activities) ③、内容管理器(Content Providers) ④、服务(Services) ⑤、广播接收器(Broadcast Receivers) ⑥、请求安全授权(uses-permission) ⑦、声明安全授权(permission)

android学习笔记--clip

初次接触到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:当前要剪切的区域加上之前剪切过内部的部分(蓝色区域+紫色区域+橄榄色区域)。XOR:异或,当前要剪切的区域与之前剪切过的进行异或。(蓝色区域+橄榄色区域)。REVERSE_DIFFERENCE:与DIFFERENCE相反,以当前要剪切的区域为参照物,当前要剪切的区域除去之前剪切过的区域(橄榄色区域); REPLACE:用当前要剪切的区域代替之前剪切过的区域。(橄榄色区域+紫色区域); 没带Op参数效果与INTERSECT的效果一样,两个区域的交集。

Android之蓝牙驱动开发总结

Android之蓝牙驱动开 发总结

二Android Bluetooth架构 (1) 2.1 Bluetooth架构图 (1) 2.2 Bluetooth代码层次结构 (3) 三Bluetooth协议栈分析 (4) 3.1 蓝牙协议栈 (4) 3.2 Android与蓝牙协议栈的关系 (5) 四Bluetooth之HCI层分析 (5) 4.1 HCI层与基带的通信方式 (6) 4.2 包的分析及研究 (7) 4.3 通信过程的研究与分析 (8) 五Bluetooth之编程实现 (8) 5.1 HCI层编程 (8) 5.2 L2CAP层编程 (10) 5.3 SDP层编程 (12) 六Bluetooth之启动过程实现 (13) 6.1 Bluetooth启动步骤 (14) 6.2 Bluetooth启动流程 (14) 6.3 Bluetooth数据流向 (14) 6.4 Bluez控制流程 (14) 6.5 Bluetooth启动过程分析 (15) 七Bluetooth之驱动移植 (15) 7.1 android系统配置 (15) 7.2 启动项修改 (16) 7.3 电源管理rfkill驱动 (16) 7.4 Rebuild Android image and reboot (16) 7.5 实现BT睡眠唤醒机制 (16) 7.6 系统集成 (17) 八Bluetooth之调试与编译 (17) 8.1 Bluetooth驱动调试 (17)

九Bluetooth之应用程序开发 (18) 9.1 Bluetooth的API开发 (18) 9.2 The Basics开发 (18) 9.3 Bluetooth Permissions开发 (19) 9.4 Setting Up Bluetooth服务 (19) 9.5 Finding Devices服务 (20) 9.6 Connecting Devices服务 (22) 9.7 Managing a Connection服务 (26) 9.8 Working with Profiles服务 (28) 十总结与疑问 (29)

相关主题
相关文档
最新文档