Menu Home

android

Android使用MediaPlayer播放视频步骤

MediaPlayer状态变换图: public class MainActivity extends Activity { Display display; SurfaceHolder surfaceHolder; SurfaceView surfaceView; MediaPlayer mediaPlayer; // 视频宽高 int width = 0; int height = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); display = getWindowManager().getDefaultDisplay(); String file = Environment.getExternalStorageDirectory() .getAbsolutePath() + “/Movies/1.m4v”; surfaceView = (SurfaceView) findViewById(R.id.sv); surfaceHolder = surfaceView.getHolder(); […]

Android使用MediaRecorder录音

MediaRecorder状态流程 MediaRecorder输出格式 格式 描述 AAC_ADTS AAC ADTS格式 AMR_NB 自适应多速率窄带格式 AMR_WB 新型可变速率多模式宽带格式 DEFAULT MPEG_4 MPRG-4文件格式 RAW_AMR 不使用任何容器的原始文件,这个选项不适合有视频的录制文件,而且音频编码器是AMR_NB时才有效 THREE_GPP 3GP格式 MediaRecorder编码格式 格式 描述 AAC AAC Low Complexity (AAC-LC) audio codec HE_AAC High Efficiency AAC (HE-AAC) audio codec AAC_ELD Enhanced Low Delay AAC (AAC-ELD) audio codec AMR_NB AMR (Narrowband) audio codec AMR_WB AMR […]

MediaPlayer(一)——处理网络音频文件

Android MediaPlayer状态转换图 activity_main.xml: <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:orientation=”vertical” tools:context=”.MainActivity” > <TextView android:id=”@+id/TV01″ android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Status :” /> <TextView android:id=”@+id/statusTV” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Unknown” /> <TextView android:id=”@+id/bufferPercentTV” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Buffer Percentage : ” /> <ProgressBar android:id=”@+id/bufferSB” android:layout_width=”fill_parent” android:layout_height=”wrap_content” style=”@android:style/Widget.ProgressBar.Horizontal” android:max=”100″ /> <Button android:id=”@+id/startBtn” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Start” /> <Button android:id=”@+id/stopBtn” android:layout_width=”wrap_content” android:layout_height=”wrap_content” […]

repo 1.12.4 gpg key错误

自从repo升级到 1.12.4后,repo init的时候就一直报错: repo 1.12.4 gpg: Signature made Wed Oct 2 00:44:27 2013 CST using RSA key ID 692B382C gpg: Can’t check signature: public key not found error: could not verify the tag ‘v1.12.4’ 查了半天原来是android doc没有更新,解决方法是不要使用 curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo 下载的repo,使用下面的网址即可: curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

Android Activity布局(layout)介绍

LinearLayout LinearLayout——线性布局,顾名思义,LinearLayout中的组件按照线性排列,每一个组件都位于前一个组件的后面。LinearLayout又可以分为水平线性布局和垂直线性布局。 垂直线性布局 在垂直线性布局中,组件从上至下依次排列。可以使用android:layout_weight属性来控制组件占据空间的比例:当layout_width或layout_height设置为0dp的时候,数值越高占据的比例越大;当layout_width或layout_height设置为match_parent时,数值越高占据的比例越小。 <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:orientation=”vertical” > <TextView android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:layout_weight=”2″ android:text=”TextView 1″ /> <TextView android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:layout_weight=”1″ android:text=”TextView 2″ /> <TextView android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:layout_weight=”1″ android:text=”TextView 3″ /> <TextView android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:text=”TextView 4″ /> 水平线性布局 水平线性布局中的组件按照水平方向平铺排列,组件所占空间的比例跟layout_weight的值成正比。 <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:orientation=”horizontal” > <TextView android:layout_width=”wrap_content” android:layout_height=”wrap_content” […]

Android Use Camera (一) : 捕捉图像并修改图像属性

git clone https://github.com/lnmcc/CameraExample.git 下面的例子将展示如何通过Camera Intent捕捉图像并修改图像属性的方法。 activity_main.xml: <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:orientation=”vertical” tools:context=”.MainActivity” > <ImageView android:id=”@+id/imgView” android:layout_width=”wrap_content” android:layout_height=”wrap_content” /> <TextView android:id=”@+id/TitleTV” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Title” /> <EditText android:id=”@+id/TitleET” android:layout_width=”fill_parent” android:layout_height=”wrap_content” /> <TextView android:id=”@+id/DescriptionTV” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Description” /> <EditText android:id=”@+id/DescriptionET” android:layout_width=”fill_parent” android:layout_height=”wrap_content” /> <Button android:id=”@+id/TakePictureBT” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Take Picture” /> <Button android:id=”@+id/SaveDataBT” […]

adb常用命令

设置标准输出和标准错误输出 Android系统默认把标准输出和标准错误输出(system.out和system.err)定向到/dev/null。使用下面的命令更改: $ adb shell stop $ adb shell setprop log.redirect-stdio true $ adb shell start 查看内存分配情况 $ adb shell dumpsys meminfo <package name> 重新安装apk adb install -r 包名 卸载apk adb uninstal 包名 注意这里的参数是包名,即AndroidManifest中package的属性值。

使用Android接口描述语言(AIDL)

AIDL简介 Andorid提供了一种轻量级的进程间通信机制:接口描述语言(Android Interface Definition Language),简称AIDL。进程间使用AIDL通信跟使用Intent通信的最大区别在于:前者是同步通信,而后者是异步通信。AIDL的语法与JAVA中的Interface十分相似,对数据类型的支持方面有一些差别,目前AIDL支持的数据类型有: Java中的基本数据类型 String List CharSequence Map 其他AIDL生成的接口 实现了Parcelable接口并通过值传递的自定义类型 使用AIDL的步骤 创建.aidl文件,在文件中声明远程服务的接口 在.java文件中实现.aidl中声明的方法 在AndroidMainifest中注册上面创建的服务 客户端请求绑定服务成功后就可以调用.aidl中声明的方法了 示例解析 项目目录结构: 在项目src文件夹下创建IAddService.aidl文件,在aidl声明了一个addOne方法,这个方法简单的把传入的值加上一。 IAddService.aidl: package net.lnmcc.aidltest.aidl; interface IAddOneService { int addOne(int value); } 保存.aidl文件后,Eclipse将会自动在gen/文件夹下生成一个IAddService.java文件,在后面实现远程服务的时候会使用到其中的抽象类Stub。 创建AddService,AddService是一个bound服务,需要实现onBind()方法,它将返回一个IAddService.Stub实例。IBinder简单的理解成进程间通信的通道,可以通过这个通道来实现数据传输。 AddService.java: public class AddService extends Service { IAddService.Stub mBinder; @Override public void onCreate() { super.onCreate(); mBinder = new […]

Android增加Happy Touch触摸屏支持

1、在hid-ids.h中加入vid pid #define USB_VENDOR_ID_HAPPYTOUCH 0x0416 #define USB_DEVICE_ID_HAPPYTOUCH_SCREEN 0x5030 2、在hid-multitouch.c->mt_devices[] 中加入 { .driver_data = MT_CLS_DEFAULT, HID_USB_DEVICE(USB_VENDOR_ID_HAPPYTOUCH, USB_DEVICE_ID_HAPPYTOUCH_SCREEN) } 3、在hid-core.c->hid_have_special_driver[]中加入HID_USB_DEVICE(VID,PID) { HID_USB_DEVICE(USB_VENDOR_ID_HAPPYTOUCH,USB_DEVICE_ID_HAPPYTOUCH_SCREEN)} 4、设置kernel编译变量 $ export ARCH=arm $ export SUBARCH=arm $ export CROSS_COMPILE=arm-eabi- 5、在内核的config文件中,确认驱动中是否添加了hid-multitouch模块 运行make menuconfig后,将HID Multitouch panels选上。 $ make clear $ make mrproper $ make menuconfig Device Drivers —> HID Devices —> […]

为Android app添加最终用户许可协议(EULA)

对一个android app来说,加入EULA已经是一个必不可少的内容了。下面将演示如何创建一个通用的Eula类。任何一个app都可以使用Eula.show()来显示自己的EULA,也可以通过实现Eula.OnEulaAgreedTo接口做进一步处理。 Eula.java /** 最终用户协议文件名由ASSERT_EULA定义,存放位置为项目的assets目录 */ public class Eula { private static final String ASSERT_EULA = “EULA”; private static final String PREFERENCE_EULA_ACCEPTED = “eula.accepted”; private static final String PREFERENCE_EULA = “eula”; /** 当用户选择同意后的回调函数。 */ static interface OnEulaAgreedTo { void onEulaAgreedTo(); } private static void accept(SharedPreferences preferences) { preferences.edit().putBoolean(PREFERENCE_EULA_ACCEPTED, true).commit(); } […]

Android使用多点触摸(一)

Android触摸事件分类 事件名 动作 ACTION_DOWN 按下第一个点 ACTION_POINTER_DOWN 按下第二个点 ACTION_MOVE 手势发生移动 ACTION_POINTER_UP 释放第二个点 ACTION_UP 释放第一个点 简单示例 activity_multitouch.xml <RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:paddingBottom=”@dimen/activity_vertical_margin” android:paddingLeft=”@dimen/activity_horizontal_margin” android:paddingRight=”@dimen/activity_horizontal_margin” android:paddingTop=”@dimen/activity_vertical_margin” tools:context=”.Multitouch” > <ImageView android:id=”@+id/imageView” android:contentDescription=”@string/DESC” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:src=”@drawable/aywdhz8u” android:scaleType=”matrix” > </ImageView> </RelativeLayout> Multitouch.java public class Multitouch extends Activity implements OnTouchListener{ Matrix matrix = new Matrix(); Matrix […]

Android 使用CountDownTimer

在onResume()方法中构造CountDownTimer的好处是,onResume()是在onRestoreInstanceState()之后执行的, 这样就可以在onRestoreInstanceState()中恢复上次倒计时后的剩余时间,这样在手机屏幕旋转后,倒计时不会重置。关于详细的Activity方法调用时序,请 点击这里。 MainActivity.java package com.example.countdowntimeexample; import android.os.Bundle; import android.os.CountDownTimer; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.TextView; public class MainActivity extends Activity { private TextView mTimeLabel; CountDownTimer myTimer; long myTime = 30000; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTimeLabel = (TextView) findViewById(R.id.text); } @Override protected void onResume() […]

Android activity生命周期

Activity生命周期转换图 onCreate(Bundle): Activity生成时调用。如果存在使用OnSaveInstanceState方法保存的信息,将把保存的信息传递给OnCreate的Bundle参数。 onStart(): 在Activity即将显示的时候调用。 onResume(): 当Activity可以接受用户输入的时候调用。它是开始播放媒体文件的一个很好的时间点。 onPause(): Activity转入后台时调用。如果在调用这个方法之后,系统内存不足,这个Activity进程可能被终止掉。 onStop(): 暂时不使用Activity时调用这个方法(可能时因为其他Activity启动或者程序即将结束时)。如同onPause()一样:当内存不足时,系统可能会直接终止进出,而不调用这个方法。 onRestart(): 调用onStop后,再次显示这个Activity时调用。 onDestroy(): Activity即将终止时调用。如同onPause()一样:当内存不足时,系统可能会直接终止进出,而不调用这个方法。 onSaveInstanceState(Bundle): 保存实例的状态时调用。这里使用Bundle参数来保存值。当因为内存不足等原因而造成程序终止时,这个函数所保存的值能继续作为参数传递给onCreate()和onRestoreInstanceState(),因此,再次启动程序时就能利用这个传递给Bundle的值恢复之前的状态。 onRestoreInstanceState(Bundle): 在恢复实例的状态时调用。通过参数Bundle,可以获取通过onSaveInstanceState()保存的值,这个值与传递给onCreate()的内容相同。虽然采取任何一种方法进行恢复处理都没有问题,但是onRestoreInstanceState的处理方式跟自然。 Activity方法调用时序              ref: http://developer.android.com/guide/components/activities.html ref:《Android开发秘籍》 顺便推荐一款好用的在线UML工具: http://www.websequencediagrams.com/

android程序调用JNI

OS: MAC OS 10.7.5 Android: 4.3 NDK: android-ndk-r7c java: 1.6.0_51 使用JNI 在Eclipse中新建一个Android工程,假设项目目录为project,修改activity_main.xml 如下: <RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:paddingBottom=”@dimen/activity_vertical_margin” android:paddingLeft=”@dimen/activity_horizontal_margin” android:paddingRight=”@dimen/activity_horizontal_margin” android:paddingTop=”@dimen/activity_vertical_margin” tools:context=”.MainActivity” > <TextView android:id=”@+id/showText” android:layout_width=”wrap_content” android:layout_height=”wrap_content” /> </RelativeLayout> MainActivity.java: package net.lnmcc.usejni; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.TextView; public class MainActivity extends Activity { // 加载JNI库 static […]

使用命令行工具构建android apk

新建工程 查看构建目标 输入下面的命令查看所以可构建目标: $android list targets 可能的输出: Available Android targets: ———- id: 1 or “android-3” Name: Android 1.5 Type: Platform API level: 3 Revision: 4 Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P ABIs : armeabi ———- id: 2 or “Google Inc.:Google APIs:3” Name: Google APIs Type: Add-On Vendor: Google Inc. […]

android平台YUV420SP到RGB565的转换

/** * @param yuvDataArray * @param width * @param height * @return int[] : ARGB array * @throws NullPointerException * @throws IllegalArgumentException */ private static int[] decodeYUV(byte[] yuvDataArray, int width, int height) throws NullPointerException, IllegalArgumentException { int size = width * height; if(yuvDataArray == null) throw new NullPointerException(“buffer yuvDataArray is […]

Android下编译OTA升级包

ref : http://blog.csdn.net/llping2011/article/details/9471913 概念介绍 我们知道Android系统一般可以通过本地升级和空中升级两种,一般本地升级包括SD卡升级、U盘升级、串口升级等。而所谓的空中升级就是通过网络将升级包下载升级包到本地,进行升级。 而OTA升级作为Android系统提供的标准软件升级方式,同时支持本地升级如SD卡或U盘 和 空中升级如网络。OTA升级一般分为全包升级和差分升级。 全包升级:编译当前系统得到的软件包,不依赖于当前手机里的软件版本 差分升级:对手机两个软件版本做差分,在第一个版本上打patch得到第二个升级包,所以差分升级只能对第一个版本的机器进行升级 编译方法 在源码根目录下执行: make otapackage 注意:执行这句命令之前需要在根目录下make编译整个源码。 在out/target/product/$(PRODUCT_NAME)/$(BUILD_NAME)-target-files-$(BUILD_NUMBER).zip文件,其中$(PRODUCT_NAME)是编译产品名字,$(BUILD_NAME)是编译的版本名字,$(BUILD_NUMBER)一般是编译的版本号。以我的fsl的Qiyi版本为例。 生成文件目录为:out/target/product/sabresd_6dq/Qiyi-target-files-20130725.zip文件 拷贝到U盘下的upgrade目录下即可(有的是直接拷贝到U盘根目录下,各个代码不一样)。

android 触摸和鼠标模式切换

Android os : > 4.0 android 4.0以后,触摸屏的触摸模式和鼠标模式使用idc文件来做切换。 需要把触摸屏设备的相应idc文件放到 /system/usr/idc/ 目录下。 如下是IRTOUCH Vendor_6615_Product_0085.idc文件的内容: # Copyright (C) 2012 Beijing IRTOUCH SYSTEMS Co.,Ltd # # # Input Device Configuration File for the IRTOUCH touch screen. # #common device.internal = 1 # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size touch.size.calibration = […]

android编译错误 : android the correct version is 1.6

android编译错误 : android the correct version is 1.6 OS : ubuntu10.04  64bit 问题 android编译过程中报错: You are attempting to build with the incorrect version of java. Your version is: java version “1.6.0_22”. The correct version is: Java SE 1.6. 解决 从java官方地址http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u31-download-1501634.html 下载Java SE Development Kit 6 Update 31文件 移到/opt目录下 执行 chmod +x […]

android 自动设置mtu

android 自动设置mtu os : android 4.0.4 kernel : 3.0.8 重新挂载system目录为可读: mount -o remount,rw /system 在/system/etc/ip-up 文件中加入下面这行(NAME是你需要设置mtu的设备,如eth0, ppp0等): /system/bin/ifconfig $NAME mtu 1400 注:如果你使用了busybox,需要使用下面的命令: busybox ifconfig $NAME mtu 1400