最近一年以来,博主一直在搞密室逃脱方面的东西。涉及到的技术很杂,不少也很冷门。

前段时间有这样一个有意思的需求:要求服务器在达到一定条件时唤醒一台待机的投影仪自动进行播放,并且在不同的条件下播放不同的影片。

博主考察了一下市场发现现在市面上有这样几种投影仪:

  1. 普通投影仪,需要接一台电脑,在电脑上选择播放的影片,电脑显示什么投影仪做为显示设备就播放什么。这个想做自动化需要和播放影片的电脑进行通讯,但一台电脑只作为一个视频播放器使用有点大材小用。
  2. 可以插U盘的投影仪,这种投影仪很好的取代了播放设备,直接读取U盘中的内容,在投影仪上播放。这类投影仪一般只能用遥控器进行控制,不能被服务器控制,所以也不可取。
  3. 最后博主在某宝上发现了一种小型带Android系统的投影仪,就是这个样子了,名字叫CooLux(中文名酷乐视),有兴趣的朋友可以搜索一下。

    这个小型投影仪本身带Android系统,传统实体按键变成了面板上的上、下、左、右、OK、返回、菜单按键,屏幕变成了投影灯泡,把影像直接投到墙上。有了Android系统就意味着可以像控制手机一样去控制这台投影仪,什么选择影片、无线通讯、控制待机、唤醒什么的都不是问题。

虽然它本身自带Android系统,但这是一款经过深度定制的Android系统,和我们平时在手机上用的还有很多不一样。例如它的画面显示是固定横屏的,没有锁屏界面,投影开启永远不会待机等等。其他的问题还好,不待机的问题很严重,因为该投影仪的使用环境基本上是一整天都要开启,只有收到播放影片的命令才会进行播放,投影仪消耗电能最大的就是投影灯泡部分了。大量的电能会转换成热量,所以一般的投影仪都会配备一款功率比较高的风扇。这就需要我们去在程序中控制投影仪在播放完影片后主动关闭屏幕,在播放影片之前主动唤醒屏幕。

现在需求来了,投影仪如何接到推送消息然后自动唤醒屏幕并在播放完毕后自动关闭屏幕?我的解决思路如下:

  1. 在服务器上安装androidpn服务程序,对在线手机进行推送(请大家自行参考androidpn教程)。
  2. 应用中集成androidpn-client接收推送消息(请大家自行参考androidpn教程)。
  3. 改造androidpn-client,在收到推送消息后,向主Activity发送intent,传送推送消息内容(其中包括要播放哪部影片的索引)。
    在androidpn-client的NotificationReceiver类onReceive函数中,我们在收到消息后不吧消息交给Notifier处理,而是直接向主Activity发送intent。

    //            Notifier notifier = new Notifier(context);
    //            notifier.notify(notificationId, notificationApiKey,
    //                    notificationTitle, notificationMessage, notificationUri,notificationFrom,packetId);//直接转到对应的ActivityIntent nintent = new Intent(context,ProjectorPlayerActivity.class);nintent.putExtra(Constants.NOTIFICATION_ID,notificationId);nintent.putExtra(Constants.NOTIFICATION_API_KEY,notificationApiKey);nintent.putExtra(Constants.NOTIFICATION_TITLE,notificationTitle);nintent.putExtra(Constants.NOTIFICATION_MESSAGE,notificationMessage);nintent.putExtra(Constants.NOTIFICATION_URI,notificationUri);nintent.putExtra(Constants.NOTIFICATION_FROM, notificationFrom);nintent.putExtra(Constants.PACKET_ID, packetId);nintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(nintent);
    
  4. Activity收到intent后,判断屏幕是否关闭,如果关闭执行唤醒屏幕操作,再对消息中指定的影片进行播放。
    Activity的onNewIntent函数处理获得的intent

        @Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);String urivalue = intent.getStringExtra(Constants.NOTIFICATION_URI);if(urivalue==null || urivalue.equals(""))     //判断URI消息是否有效return;DeviceUtils.vibrate(this, 500);             //让手机振动500msif(DeviceUtils.isScreenLocked(this))            //判断手机是否处于屏幕关闭状态DeviceUtils.wakeScreen(this);           //如果处于关闭屏幕状态则唤醒屏幕<span style="white-space:pre">            </span>//此处做播放影片的处理}

    DeviceUtils类的内容如下,主要对硬件设备进行一些操作,目前包括振动、唤醒屏幕、关闭屏幕

    /*** 设备工具类,操作一些硬件设备功能* Created by fengchong on 16/1/18.*/
    public class DeviceUtils {//锁屏部分-------------------------//继承了设备管理器的广播类,没做任何操作public static class AdminReceiver extends DeviceAdminReceiver{}private  static DevicePolicyManager policyManager;private static ComponentName componentName;private static final int MY_REQUEST_CODE = 9999;/*** 初始化锁屏* @param context*/public static void initLockScreen(Context context){policyManager = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);componentName = new ComponentName(context,DeviceUtils.AdminReceiver.class);}/*** 激活设备管理器,设置app为激活状态*/public static void activeDeviceManager(Activity activity){Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,componentName);intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,"激活一键锁屏");activity.startActivityForResult(intent, MY_REQUEST_CODE);}/*** 判断是否处于锁屏状态* @param c* @return 返回ture为锁屏,返回flase为未锁屏*/public final static boolean isScreenLocked(Context c) {KeyguardManager km = (KeyguardManager) c.getSystemService(c.KEYGUARD_SERVICE);return km.inKeyguardRestrictedInputMode();}/*** 被Activity的onActivityResult函数调用* @param activity* @param requestCode* @param resultCode* @param data*/public static void onActivityResult(Activity activity,int requestCode,int resultCode,Intent data){if(requestCode==MY_REQUEST_CODE && resultCode== Activity.RESULT_OK){policyManager.lockNow();activity.finish();}else{activity.finish();}}/*** 锁定屏幕操作* @param activity*/public static void lockScreen(Activity activity){if(policyManager.isAdminActive(componentName)){policyManager.lockNow();activity.finish();}else{activeDeviceManager(activity);}}//锁屏部分-------------------------//唤醒屏幕部分----------------------private static KeyguardManager km;                                                                                         //键盘管理private static PowerManager pm;                                                                                            //电源管理private static PowerManager.WakeLock wakeLock;                                                                             //屏幕唤醒对象/*** 初始化唤醒屏幕* @param activity*/public static void initWakeScrenUnlock(Activity activity){activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);pm = (PowerManager) activity.getSystemService(Context.POWER_SERVICE);wakeLock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK,"bright");wakeLock.acquire();}/*** 唤醒屏幕*/public static void wakeScreen(Activity activity){//屏幕解锁km= (KeyguardManager) activity.getSystemService(Context.KEYGUARD_SERVICE);KeyguardManager.KeyguardLock kl = km.newKeyguardLock("unLock");kl.disableKeyguard();//屏幕唤醒if(wakeLock==null) {pm = (PowerManager) activity.getSystemService(Context.POWER_SERVICE);wakeLock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK,"bright");}wakeLock.acquire();wakeLock.release();}//唤醒屏幕部分----------------------//手机振动部分部分----------------------/*** 手机震动函数* @param activity* @param milliseconds*/public static void vibrate(final Activity activity, long milliseconds) {Vibrator vib = (Vibrator) activity.getSystemService(Service.VIBRATOR_SERVICE);vib.vibrate(milliseconds);}//手机振动部分部分----------------------
    }
    

    关闭屏幕部分参考了这篇文章(表示感谢)http://www.cnblogs.com/tianzhijiexian/p/3920257.html,其中还会包含其他一些资源文件大家可自行参考。

    唤醒屏幕部分除了以上的代码还需要在AndroidManifest.xml中加入权限
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

  5. 影片播放后自动执行关闭屏幕操作,节约电能。
    在合适的位置直接执行DeviceUtils.lockScreen函数既可。
    源码在这里:https://github.com/sorcerer310/BakerStreet42ProjectorPlayer

通过推送消息控制Android系统锁屏、唤醒相关推荐

  1. 极光推送:java后台向APP推送消息(android,ios极光推送消息)

    Maven添加依赖 <!--极光推送--><dependency><groupId>cn.jpush.api</groupId><artifact ...

  2. 使用第三方推送平台JPUSH推送消息到android手机

    之前在公司参与IPCAM项目开发,手机客户端的报警推送采用的是国内的极光推送Jpush,Jpush使用起来很简单,很容易就能集成到产品开发中去,SDK.文档.Demo资料都很齐全,很快就能上手:个人比 ...

  3. 基于SuperSocket的IIS主动推送消息给android客户端

    在上一篇文章<基于mina框架的GPS设备与服务器之间的交互>中,提到之前一直使用superwebsocket框架做为IIS和APP通信的媒介,经常出现无法通信的问题,必须一天几次的手动回 ...

  4. androidpn php,服务器推送消息到Android终端方法

    Andorid手机应用程序去请求一个服务器有很多种方法,HTTP,Socket,WebService等,每次请求都能返回数据,程序可以根据返回的值进行保存或者再次发起请求,想得到什么就请求什么,非常精 ...

  5. 服务器直接推送android,服务器推送消息到Android终端方法

    Andorid手机应用程序去请求一个服务器有很多种方法,HTTP,Socket,WebService等,每次请求都能返回数据,程序可以根据返回的值进行保存或者再次发起请求,想得到什么就请求什么,非常精 ...

  6. android推送服务不被关闭,Android APP被关闭后无法收到推送消息(尝试)

    1.   Android端进程被杀死后,目前自带的保护后台接收消息活跃机制.暂时没有什么好的机制保持任何情况下都活跃 文章参考:http://blog.csdn.net/marswin89/artic ...

  7. android 杀死程序收不到推送_Android APP切换到后台接收不到推送消息

    1.   Android端进程被杀死后,目前自带的保护后台接收消息活跃机制.暂时没有什么好的机制保持任何情况下都活跃 android原生系统用home键杀进程可以起来,如果是强行停止就只能用户自己手动 ...

  8. Android App 被关闭后无法收到推送消息

    zzz~ Android端进程被杀死后,目前自带的保护后台接收消息活跃机制.暂时没有什么好的机制保持任何情况下都活跃 文章参考:http://blog.csdn.net/marswin89/artic ...

  9. Android APP被关闭后无法收到推送消息(尝试)

    1.   Android端进程被杀死后,目前自带的保护后台接收消息活跃机制.暂时没有什么好的机制保持任何情况下都活跃 文章参考:http://blog.csdn.net/marswin89/artic ...

最新文章

  1. Golang微服务开发实践
  2. 独家 | 基于数据预测的解释真的能增加用户对人工智能的信任吗?(附链接)...
  3. php 获得用户地址吗,php获得用户的真实IP地址_PHP教程
  4. python怎么安装jieba库-python环境jieba分词的安装
  5. 说说数据库连接池工作原理和实现方案?
  6. python语音控制智能家电_Python 树莓派智能音箱语音控制电脑开关机-Python 实用宝典...
  7. Pandas——loc、iloc、ix 函数区别
  8. Java笔记-使用RabbitMQ的Java接口实现topic(主题模式)
  9. “产学合作勇创新·协同育人书新篇”贵州理工大数据学院数据科学训练营结题答辩报告会圆满举行...
  10. hash表冲突处理方法
  11. Django 入门篇一
  12. Python3入门机器学习经典算法与应用 第3章 numpy.array 中的运算
  13. 表格闪退怎么解决_excel2010表格打开闪退怎么回事
  14. 无法解析的外部符号 _transfer_8to16copy_3dne
  15. NIN:Network in Network
  16. 算法一(python)
  17. ldd显示可执行模块的dependenc
  18. 关于手持设备PDA的开发
  19. JAVA潜心修炼五天——第4天
  20. DIY数控雕刻机,我的第一台数控雕刻机

热门文章

  1. ]视音频编解码技术零基础学习方法
  2. R语言常用快捷键、excel操作、绘制、统计
  3. Win7安装系统,无猫腻
  4. 混合A*算法(Hybrid A*)
  5. php7.0 官网下载,PHP For Windows
  6. 湎计算机网络通讯设备有哪些,计算机网络习题集及答案.pdf
  7. golang bolt库操作手册
  8. 微软公司招聘智力题目
  9. 【Easyui】Easyui Datagrid 排序
  10. P型半导体,N型半导体,PN结原理简述