一、设置“不自动进入屏保”
Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.SCREENSAVER_ACTIVATED_AUTO, 0);
二、设置“n秒后进入屏保”
Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.SCREENSAVER_ACTIVATED_AUTO, 1); //先打开自动进入屏保功能
Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, n); //n表示“设备闲置n秒后进入屏保”
三、如何设置与监听当前屏保
1、引入原生SettingLib库
Android.mk文件中加入 include frameworks/base/packages/SettingsLib/common.mk
2、静态申请权限
3、设置当前屏保
DreamBackend.getInstance(mContext).setActiveDream(ComponentName dream)
4、获取当前屏保
DreamBackend.getInstance(mContext).getActiveDreamName()
5、监听当前屏保变化
监听原生Settings数据库的Settings.Secure.SCREENSAVER_COMPONENTS字段。
可通过ComponentName.unflattenFromString接口将上面字段对应的值解析为当前屏保的ComponentName对象
四、在视频播放等特殊界面,如何保持不进入屏保的状态(即使已经设置了n秒后进入屏保)
通过Android原生的接口来实现此功能就行,目前有如下两个方法:
1、通过WakeLock保持屏幕不进入屏保
首先申请权限
在AndroidManifest中申请权限android.permission.WAKE_LOCK
创建PowerManager.WakeLock对象:
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
WakeLock mWakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, TAG); //这里传入的tag通常是应用的包名,或者当前文件的全类名。在出问题的时候,PowerManagerService可通过该TAG进行调试
在需要保持“屏幕不进入屏保”时(如开始视频播放时),调用:
mWakeLock.acquire(); //获取锁,调用该方法后使屏幕保持亮屏(或不进入屏保)
在不需要保持“屏幕不进入屏保”时(如退出视频播放时),调用如下方法释放锁,以使屏幕恢复“自动进入屏保的功能”:
mWakeLock.release();
注意:在release wake lock时,若已经过了自动进入屏保的时间,在release wake lock后,会马上进入屏保。
若希望在release后重新计时自动进入屏保,请参考本文中“五、屏保控制相关”中的“2、自动进入屏保重新计时”中的方法。
2、通过WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON保持屏幕不进入屏保
在需要保持设备不进入屏保的窗口,为窗口添加这个flag:WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,如:
在Activity的onCreate方法中执行getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
使用这种方法,退出该界面,会自动恢复“自动进入屏保的功能”
五、屏保控制相关
1、进入/退出屏保,当前是否已经进入屏保状态
首先申请权限
在AndroidManifest中申请权限:android.permission.READ_DREAM_STATE 和 android.permission.WRITE_DREAM_STATE
通过IDreamManager 接口控制屏保的进入退出:
IDreamManager dreamManager = IDreamManager.Stub.asInterface(ServiceManager.getService(DreamService.DREAM_SERVICE));
dreamManager.dream();// 进入屏保
dreamManager.awaken();// 退出屏保
boolean isDreaming = dreamManager.isDreaming();// 是否正在屏保状态
2、自动进入屏保重新计时
首先申请权限
在AndroidManifest中申请权限:android.permission.DEVICE_POWER 或 android.permission.USER_ACTIVITY
通过PowerManager接口重新计时:
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
long currentTime = SystemClock.uptimeMillis();
powerManager.userActivity(currentTime, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0);
3、监听屏保的进入、退出
监听广播:Intent.ACTION_DREAMING_STARTED(进入屏保)、Intent.ACTION_DREAMING_STOPPED(退出屏保)。
六、设置自定义屏保图片的方法
根据8月12日收到的3J2项目的UE,有如下两条需求:
a.图库中需要将指定的图片设置为自定义屏保图片
b.系统设置中需要显示当前自定义屏保的图片缩略图
因此,屏保应用中封装了对外接口ScreensaverController来实现这两条需求。相关的应用需要通过如下步骤来使用该接口:
1、配置使用权限
在AndroidManifest.xml中申明使用权限:
2、引用接口动态库
在mk文件中添加代码如下:
LOCAL_JAVA_LIBRARIES := com.chinatsp.screensavermanager
在AndroidManifest.xml中的Application节点下添加代码如下:
<uses-library android:name="com.chinatsp.screensavermanager" android:required="true" />
3、创建ScreensaverController类对象并连接屏保服务
在使用ScreensaverController前,应先通过下面代码来初始化ScreensaverController:
======================================
ScreensaverController mScreensaverController = ScreensaverController.create(mContext);//调用create方法创建实例
//连接屏保服务
mScreensaverController.connect(new ScreensaverController.Callback() {
@Override
public void onConnected() {
//TODO 说明屏保服务连接成功,这时可通过mScreensaverController.XXXXXX()的方式来调用屏保服务的接口了
}
@Override
public void onDisconnected() {
Log.d(TAG, "onDisconnected() called");
//TODO 说明屏保服务断开成功。
}
});
======================================
4、根据需求调用屏保服务接口
1)mScreensaverController.setCustomScreensaverPic(List paths);//path为图片文件的路径字符串。调用该方法后,会将与路径对应的图片设置为自定义屏保图片
2)Bitmap thumbnail = mScreensaverController.getCustomScreensaverThumbnail();//获取自定义屏保图片的缩略图
3)mScreensaverController.registerCallback(ScreensaverCallback callback);//注册自定义屏保图片改变的setCustomScreensaverPic回调.当自定义屏保的图片发生改变时,会通过ScreensaverCallback的onCustomScreensaverPicChanged(Bitmap bitmap)方法通知客户端,并返回改变后的图片的bitmap缩略图
4)mScreensaverController.unRegisterCallback(ScreensaverCallback callback);//反注册自定义屏保图片改变的回调。
5)mScreensaverController.disConnect();//断开与屏保服务的连接
6)int count = mScreensaverController.getCustomScreensaverPicCount();//获取当前自定义屏保图片数量
7)mScreensaverController.removeCustomScreensaverPic(List paths);//删除指定的自定义屏保图片
8)在调用以上方法的时候,若屏保服务还未连接,会打印log如下:
08-16 17:37:46.198 2982 2982 W ScreensaverController: getControllerImpl: warning, no SCREENSAVER_SERVICE
08-16 17:37:46.198 2982 2982 W ScreensaverController: java.lang.Throwable
08-16 17:37:46.198 2982 2982 W ScreensaverController: at com.chinatsp.screensavermanager.ScreensaverController.getControllerImpl(ScreensaverController.java:163)
08-16 17:37:46.198 2982 2982 W ScreensaverController: at com.chinatsp.screensavermanager.ScreensaverController.getCustomScreensaverThumbnail(ScreensaverController.java:279)
08-16 17:37:46.198 2982 2982 W ScreensaverController: at com.chinatsp.themedemoskinsuppot.ClientActivity.click(ClientActivity.java:65)
08-16 17:37:46.198 2982 2982 W ScreensaverController: at java.lang.reflect.Method.invoke(Native Method)
08-16 17:37:46.198 2982 2982 W ScreensaverController: at android.view.ViewPerformClick.run(View.java:24817)
08-16 17:37:46.198 2982 2982 W ScreensaverController: at android.os.Handler.handleCallback(Handler.java:790)
08-16 17:37:46.198 2982 2982 W ScreensaverController: at android.os.Handler.dispatchMessage(Handler.java:99)
08-16 17:37:46.198 2982 2982 W ScreensaverController: at android.os.Looper.loop(Looper.java:164)
08-16 17:37:46.198 2982 2982 W ScreensaverController: at android.app.ActivityThread.main(ActivityThread.java:6518)
08-16 17:37:46.198 2982 2982 W ScreensaverController: at java.lang.reflect.Method.invoke(Native Method)
08-16 17:37:46.198 2982 2982 W ScreensaverController: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
08-16 17:37:46.198 2982 2982 W ScreensaverController: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)