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” […]

android音乐文件搜索和播放

main_activity.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” > <Button android:id=”@+id/returnBtn” android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:text=”return” /> <!– 如果在代码中需要使用simple_list_item布局,那么这里的id必须为list –> <ListView android:id=”@android:id/list” android:layout_width=”wrap_content” android:layout_height=”wrap_content” /> </LinearLayout> Main_activity.java public class MainActivity extends ListActivity implements LoaderCallbacks<Cursor> { //设置俩种选项状态:选择专辑或者选择歌曲 public static int STATE_SELECT_ALBUM = 0; public static int STATE_SELECT_SONG = 1; //默认当前状态为选择专辑 int currentState = […]

Android使用多点触摸(二)——绘图板

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” > <ImageView android:id=”@+id/imageView” android:layout_width=”fill_parent” android:layout_height=”fill_parent” /> </RelativeLayout> MainAvtivity.java public class MainActivity extends Activity implements OnTouchListener{ ImageView imageView; Bitmap bitmap; Canvas canvas; Paint paint; float startx = 0f; float starty = 0f; float endx = 0f; float endy = 0f; […]

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 —> […]

sqlite的基本用法

介绍 SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。 其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。如果您正在寻找一个嵌入式数据库项目或解决方案,SQLite是绝对值得考虑。 数据库操作 查询已有数据库 $ sqlite > .databases 创建数据库 $ sqlite test.db 如果数据库已经存在了,则打开数据库。 创建表 sqlite> create table mytable(id integer primary key, value text); sqlite>为sqlite的命令行提示符 查看数据库中存在的表 $ sqlite .tables 往表中插入数据 sqlite> insert into mytable(id, value) values(1, ‘Micheal’); sqlite> insert into mytable(id, value) values(2, ‘Jenny’); sqlite> insert into […]

为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音频之SoundPool

Android提供了两种不同的框架来处理音频,分别是: MediaPlayer / MediaRecoder:处理音频的标准方法,但数据源必须是文件或者基于流的数据。使用这个类处理音频文件的时候须有创建自己的线程运行。本文要说的SoundPool类就是使用了这个框架。   AudioTrack / AudioRecoder:该框架支持直接访问原始音频文件。用于在内存中处理音频文件,或者开始播放音频的同时写入缓冲区,或者在其他不需要文件和数据流的场合中使用。运行过程中不需要创建新线程。 SoundPool 和MediaPlayer主要用来播放一些长音频不同,SoundPool一般用来处理一些短的但是带有重叠,回放等特效的音频。这是因为SoundPool带有一个音频缓冲区,可以很方便的支持音频的回放、快放和慢放。 使用SoundPool的基本步骤 初始化 加载资源 播放 释放资源 测试SoundPool 我在测试过程中发现不能播放大于1M的音频文件,所以这里使用一个900K的sound.wav做测试。在点击Play后,音乐将重复播放5次(mySP.play(soundId, 1f, 1f, 1, 5, rate)中的第5个参数指定),每重复点击Play按钮,音乐会降低一半速率播放(mySP.play(soundId, 1f, 1f, 1, 5, rate)中的第6个参数指定)。测试程序同时最大可以叠加10个音频(SoundPool(10, AudioManager.STREAM_MUSIC, 0)中的第1个参数指定)。 public class AudioExamplesSP extends Activity { static float rate = 2f; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button playButton […]

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 […]

mac os下编译android源代码

Mac OS: 10.7.5 在MacOS上编译android源码的前提是你所使用的文件系统必须是 大小写敏感 的。下面的内容旨在说明如何在不破坏原有文件系统的基础上建立一个供编译android使用的文件系统。 检查你现有的文件系统 依次打开 GO —-> Utilities —-> Disk Utility.app查看当前磁盘的格式,如下图: 在左侧栏中选中你希望在上面编译android的那块磁盘,查看右侧栏中的“Format”一项,如果format格式中带有“Case-sensitive”字样,那么恭喜你,你不需要再做任何操作即可开始编译android源码了,否则,继续往下操作。 确定磁盘空间 当然最方便的方法是把整个磁盘都重新格式成大小写敏感的文件系统,然后重新安装系统。但那样做的成本比较高并且很浪费时间。这里要谈的是不破坏原有系统的前提下,创建一块只供编译android的文件系统。首先需要确保你磁盘的剩余空间在30G以上,编译整个android大概会使用掉25G空间(Google官方显示至少25G)。 创建磁盘镜像 打开一个Terminal,输入如下命令: $ hdiutil create -type SPARSE -fs ‘Case-sensitive Journaled HFS+’ -size 60g YOU_FOLDER/android.dmg 这条命令在你所指定的文件夹中(YOU_FOLDER)创建了一个大小写敏感的可以自增长的最大为60GB的镜像。查看你的文件夹出现了新文件android.img.sparseimage。接下来把这个镜像挂载到系统: $ hdiutil attach ./android.dmg.sparseimage -mountpoint /Volumes/android 这条命令把上一步中创建的android.dmg挂载到了/Volumes/android下,以后这里就是我们编译android的地方。如果你希望每次开机的时候系统自动挂载这个镜像,你可以把下面的命令放到你的~/.profile中。 $ hdiutil attach YOU_FOLDER/android.dmg.sparseimage -mountpoint /Volumes/android 接下来就是把down下来的android源码拷贝到/Volumes/android目录下进行编译。

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/

Java语言中的静态类

在写Android程序的时候,系统会自动生成一个R.java,这个类中使用了大量的静态类,对一个C++程序员来说,这是个新鲜事物,下面来看看这个神奇的玩意。 静态内部类的语法 public class ExternalClass { public static final class InnerClass { //… } } 静态内部类的作用 一般情况很少会用到静态类,但它也并不是一无是处,不然Java也就不会引入这个语法了。静态内部类的一个最大的用处出现在对Java类的测试中,例如: public class Test { public static void main(String[] args) { Other.Test.printx(); } } class Other{ static class Test { Other o = new Other(); o.printx(); } public void printx() { System.out.println(“Other class”); } […]

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 […]