屏保应用设置方法

413 阅读5分钟

一、设置“不自动进入屏保”

             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.ViewDeclaredOnClickListener.onClick(View.java:5375)           081617:37:46.19829822982WScreensaverController:atandroid.view.View.performClick(View.java:6300)           081617:37:46.19829822982WScreensaverController:atandroid.view.ViewDeclaredOnClickListener.onClick(View.java:5375)                     08-16 17:37:46.198 2982 2982 W ScreensaverController: at android.view.View.performClick(View.java:6300)                     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)