我们知道手机为了省电设计,在一段时间没有操作的时候屏幕的灯会自动关闭,但是很多时候我们需要让手机屏幕保持亮着,例如我们使用手机看电影或者录像的时候,都需要屏幕常亮,因此这里ataaw.com归纳下在Android手机开发程序中控制屏幕长亮的方法。


首先Android长亮是有PowerManager下的类WakeLock对象管理的。以下是具体方法。
A、屏幕控制需要对应的权限permission声明

<uses-permission android:name="android.permission.WAKE_LOCK" />

B、启用屏幕长亮

PowerManager manager = ((PowerManager)getSystemService(POWER_SERVICE)); 
 WakeLock wakeLock = manager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK| PowerManager.ON_AFTER_RELEASE, "ATAAW");
 wakeLock.acquire();

C、关闭屏幕长亮只需要将对象释放掉

wakeLock.release();

判断当前是否为锁屏界面(Keyguard)

KeyguardManager mKeyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);  
      
     if (mKeyguardManager.inKeyguardRestrictedInputMode()) { 
         // keyguard on 
     }

android触控反馈的实现

由于framework层对硬件驱动进行了封装,应用程序以API调用的方式对硬件进行控制,应用程序只需 import android.os.Vibrator即可调用frameworkf封装的API函数实现触控反馈的功能。

API函数如下:

1 public  void vibrate(long milliseconds)
2 public  void vibrate(long[] pattern, int repeat) 
3 public  void cancel()

函数1带有一个参数milliseconds,该参数控制触控触发的时间,但是是毫秒,一般设为1000;

函数2带有2个参数,它能多次驱动马达,参数pattern以数组的方式传入每次触发时间,repeat为触发的次数,repeat=-1时,其功能与函数1相似,只驱动马达一次,当repeat不为-1时,应该满足pattern.length > repeat ;

函数3 取消操作。

应用程调用方式,在onClick事件触发时,在需要添加触控的相应的控件上添加:vibrate()函数即可。

importandroid.os.Vibrator;
private VibratormVibrator;
privatesynchronized void vibrate() {        
        if (mVibrator == null) {
            mVibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 
        }
        mVibrator.vibrate(1000);
    }

添加<uses-permission android:name="android.permission.VIBRATE" />权限

 Framework层主要是2个文件,向上提供API调用的vibrator.java文件,以及提供服务HardwareService.java文件。

vibrator.java位于:frameworks\base\core\java\android\os中

HardwareService.java :frameworks\base\services\java\com\android\server中

vibrator.java文件通过Binder 实现跨进程和跨语言的通信;ServiceMangager完成服务的注册和获取等操作,SweviceManger实际上是android的API接口,提供系统服务,在这里是完成HardwareService注册和提供该服务。 HardwareService.java 封装了触控反馈、背光等硬件操作,实现触控反馈的函数如下:

public void vibrate(long milliseconds, IBinder token)
       publicvoid vibratePattern(long[] pattern, int repeat, IBinder token) 
public void cancelVibrate(IBinder token)

       本地框架主要包括两个文件:vibrator.c 实现kenerl与用户态的通信;com_android_server_HardwareService对vibrator.c的函数进行封装,提供给HardwareService.java调用。

com_android_server_HardwareService.cpp位于:frameworks\base\services\jni中
vibrator.c 位于:hardware\libhardware_legacy\vibrator
 
native static void vibratorOn(long milliseconds);
native staticvoid vibratorOff();

这两个函数位于com_android_server_HardwareService.cpp中,封装vibrator.c中vibrator_on(int timeout_ms)和vibrator_off()函数,提供给HardwareService.java调用。

 

    linux 驱动层实现触控驱动,主要文件为timed_gpio.c。采用中断方式对IO进行拉高拉低操作,实现马达驱动。由于rk2808中马达接在扩展I2C上,需要修改控制的IO口,背光sleep时会触发timed_gpio,在timed_gpio中过滤该事件。

在linux中主要修改的文件有:

board-rk28 :位于arch\arm\mach-rockchip  添加timed_gpio设备

rk28_devices :位于arch\arm\mach-rockchip  添加timed_gpio设备

timed_gpio :位于drivers\android          修改控制IO、BUG

Kconfig    :位于drivers\android          删除timed_gpio 依赖项

Makefile   :位于drivers\android          添加timed_gpio 模块

 

2 测试代码:

       在android中提供实现触控反馈的测试代码vibratorTest.java,在TwelvekeyDialer.java中添加有触控控制代码,能够很好的实现触控反馈功能。


     在代码中切换语言:

Resources resources = getResources();//获得res资源对象
      Configuration config = resources.getConfiguration();//获得设置对象
      DisplayMetrics dm = resources .getDisplayMetrics();//获得屏幕参数:主要是分辨率,像素等。
      config.locale = Locale.SIMPLIFIED_CHINESE; //简体中文
      resources.updateConfiguration(config, dm);