Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2192615
  • 博文数量: 866
  • 博客积分: 14125
  • 博客等级: 上将
  • 技术积分: 10638
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 16:53
个人简介

https://github.com/landuochong

文章分类

全部博文(866)

文章存档

2019年(3)

2018年(1)

2017年(10)

2015年(3)

2014年(8)

2013年(3)

2012年(70)

2011年(103)

2010年(360)

2009年(283)

2008年(22)

分类: Java

2011-11-30 17:39:46

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 加入
         
阅读(1783) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册