21.绘图
lockCanvas可以锁定画布区域避免闪烁
22.视频录制和上传
通过流到方式发送到服务器是可以的。
FileDescriptor fd=ParcelFileDescriptor.fromSocket(socket).getFileDescriptor();
recorder.setOutputFile(fd);
但是服务器收到到文件需要自己修复一下。
测试过mp4文件,对于3gp的文件格式没有测试。下面说说mp4的情况:
服务器端收到到mp4文件缺少ftyp容器及mdat容器到长度。
1.ftyp容器的数据基本上是一样到,所以只要把录到手机到mp4文件里到ftyp容器里到数据复制过去就可以;
2.对于mdat容器到长度修复,从接收到的mp4文件中找到“moov“标志,然后根据此偏移量减去ftyp到长度再减去容器的长度所占到4个字节就可以,用该长度值修正mdat容器到长度。
mdat.len = offset(moov) - ftyp.len - sizeof(moov.len);
经过上面修复后的文件是可以播放的。
以上是经过实验,证明是可以的。另外,服务器端是可以做到实时播放媒体流的。
23.使用ImageSwitcher
ImageSwitcher如果想显示图片,调用setImageResource,需要设置ViewFactory,因为资源需要有ViewFactory提供.
因此需要实现makeView方法
ViewSwitcher.ViewFactory factory=new ViewSwitcher.ViewFactory() {
@Override
public View makeView() {
// TODO Auto-generated method stub
ImageView i = new ImageView(testImageView.this);
i.setScaleType(ImageView.ScaleType.CENTER);//居中
i.setLayoutParams(new ImageSwitcher.LayoutParams(//自适应图片大小
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
return i;
}
};
24.使用广播接收器BroadcastReceiver
发送广播消息:
public static final String ACTION_1="com.example.android.action.NEW_BROADCAST";
Intent intent = new Intent (ACTION_1);
intent.putExtra("TEXT1",text1);
sendBroadcast(intent);
注册广播接收器
1.在Androidmanifest.xml配置文件中:
2.直接使用registerReceiver()方法写在程序里
private broadCastReceiver bcReceiver = new broadCastReceiver();
//生成一个IntentFilter对象
IntentFilter filter = new IntentFilter();
//为IntentFilter添加一个Action
filter.addAction(ACTION_1);
//将BroadcastReceiver对象注册到系统当中
registerReceiver(bcReceiver, filter);
用这种方法注册的接收器,需要用unregisterReceiver(BroadcastReceiver receiver)方法注销
例如:定义ACTION_1="android.provider.Telephony.SMS_RECEIVED";
就可以监听短信消息了,同时可以在receiver中进行处理和过滤
public void onReceive(Context context, Intent intent) {
//接受Intent对象当中的数据
Bundle bundle = intent.getExtras();
//在Bundle对象当中有一个属性名为pdus,这个属性的值是一个Object数组
Object[] myOBJpdus = (Object[]) bundle.get("pdus");
//创建一个SmsMessage类型的数组
SmsMessage[] messages = new SmsMessage[myOBJpdus.length];
System.out.println(messages.length);
for (int i = 0; i
{
//使用Object数组当中的对象创建SmsMessage对象
messages[i] = SmsMessage.createFromPdu((byte[]) myOBJpdus[i]);
//调用SmsMessage对象的getDisppalyMessageBody()方法,就可以得到消息的内容
System.out.println(messages[i].getDisplayMessageBody());
}
}
如果定义 ACTION_1="android.intent.action.BOOT_COMPLETED",则每次开机自动启动
25.在Android中,申请WakeLock可以让你的进程持续执行即使手机进入睡眠模式,比较实用的是比如后台有网络功能,可以保证操作持续进行.
方法: 在操作之前加入
PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Constants.TAG);
wakeLock.acquire();
别忘了在操作完毕之后释放掉
if (wakeLock != null) {
wakeLock.release();
wakeLock = null;
}
26.使程序不黑屏,不锁屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
27.解屏和点亮屏幕
目前2.3解锁成功,3.2的没反应
static KeyguardManager.KeyguardLock lock;
KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
if (lock == null) {
lock = keyguardManager.newKeyguardLock("cts");//cts is only a name, you can change it
}
//判断是否处于锁屏状态
if (keyguardManager.inKeyguardRestrictedInputMode()) {
lock.disableKeyguard();
} else {
lock.reenableKeyguard();
}
//获取电源管理器对象
PowerManager pm=(PowerManager) getSystemService(Context.POWER_SERVICE);
//获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是LogCat里用的Tag
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "bright");
wl.acquire();//点亮屏幕
wl.release();//释放
需要在AndroidManifest.xml添加权限:
28.在android中,經常用到的定時器主要有以下幾種實現:
一、採用Handler與線程的sleep(long )方法
二、採用Handler的postDelayed(Runnable, long) 方法
三、採用Handler與timer及TimerTask結合的方法。
下面逐一介紹:
一、採用Handle與線程的sleep(long )方法
Handler主要用來處理接受到的消息。這只是最主要的方法,
當然Handler裡還有其他的方法供實現,有興趣的可以去查API,這裡不過多解釋。
1.定義一個Handler類,用於處理接受到的Message.
Handler handler = new Handler() {
public void handleMessage(Message msg) {
//要做的事情
super.handleMessage(msg);
}
};
2.新建一個實現Runnable接口的線程類。如下:
public class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(10000);//線程暫停10秒,單位毫秒
Message message=new Message();
message.what=1;
handler.sendMessage(message);//發送消息
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3.在需要啟動線程的地方加入下面語句:
new Thread(new MyThread()).start();
4.啟動線程後,線程每10s發送一次消息。
二、採用Handler的postDelayed(Runnable, long) 方法
這個實現比較簡單一些:
1. Handler handler=new Handler();
Runnable runnable=new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
//要做的事情
handler.postDelayed(this, 2000);
}
};
2.啟動計時器:
handler.postDelayed(runnable, 2000);//每兩秒執行一次runnable.
3.停止計時器:
handler.removeCallbacks(runnable);
三、採用Handler與timer及TimerTask結合的方法。
1.定義定時器、定時器任務及Handler句柄
private final Timer timer = new Timer();
private TimerTask task;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
//要做的事情
super.handleMessage(msg);
}
};
2.初始化計時器任務。
task = new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
3.啟動定時器
timer.schedule(task, 2000, 2000);
簡要說一下上面三步提到的一些內容。
1.定時器任務(TimerTask)顧名思義,就是說當定時器到達指定的時間時要做的工作,這裡是想Handler發送一個消息,由Handler類進行處理。
2. java.util.Timer.schedule(TimerTask task, long delay):這個方法是說,dalay/1000秒後執行task.只執行一次。
java.util.Timer.schedule(TimerTask task, long delay, long period):這個方法是說,delay/1000秒後執行task,
然後進過period/1000秒再次執行task,這個用於循環任務,執行無數次,當然,你可以用timer.cancel();取消計時器的執行。
29.横竖屏切换数据的保存
使用onSaveInstanceState()方法保存数据,可以将要保存的数据放入Bundle封装在系统中,切换竖屏后这个Activity又重新被创建,
这样可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle)方法中来回复之前保存在Bundle中的数据,
这样就可以实现横竖屏界面切换数据的保存与读取,当然前提是只能保存Bundle类型的数据,
也就是说大量的对象数据的话就要想其它办法来恢复。
30.悬浮窗口
Button bb=new Button(this);
bb.setText("测试悬浮");
WindowManager wm=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();
wmParams.type=2003; //type是关键,这里的2002表示系统级窗口,你也可以试试2003。
wmParams.format=1;
wmParams.flags=40;
wmParams.width=200;
wmParams.height=200;
wm.addView(bb, wmParams);
androidmanifest.xml 加入
阅读(2445) | 评论(0) | 转发(0) |