如何在我在Lineage OS上运行的应用程序中使用PowerManager.goToSleep()?

时间:2017-08-08 10:21:20

标签: android cyanogenmod android-powermanager

CyanogenMod / Lineage OS具有通过双击状态栏来关闭屏幕的功能。它只是关闭屏幕,而不是锁定设备。据我所知,普通应用程序无法实现这一点。商店中的应用程序通过锁定设备来关闭设备。我浏览了Lineage操作系统的源代码,如果我理解正确,它似乎使用了PowerManager.goToSleep()

我想创建一个应用程序来关闭屏幕,供个人在运行Lineage OS的设备上使用。由于它是Lineage操作系统,而不是一个库存ROM,我可以做更多的事情,如获得root访问或闪烁的东西。

但根据this question,第三方应用无法访问该方法。我创建了一个简单的项目并调用了该方法,但是当我尝试构建项目时,“错误:找不到符号方法goToSleep(int)”发生了。

我可以使用Android Studio和官方SDK创建一个调用该方法的应用吗?如果没有,我如何构建调用该方法的应用程序?

按要求添加了代码:

public class MainActivity extends AppCompatActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
        pm.goToSleep(100);
    }
}

清单:

<manifest package="com.example.turnofftest"
      xmlns:android="http://schemas.android.com/apk/res/android">
    ....
    <uses-permission android:name="android.permissions.DEVICE_POWER" />
</manifest>

在阅读了问题“ApriOri”之后,我知道我必须使用平台的证书签署应用程序,我可以这样做,因为Lineage OS是开源的。但首先,我需要建立它。

2 个答案:

答案 0 :(得分:0)

您应该确保您的应用有权执行此操作。 由于它是Linage OS ROM,因此您可以轻松地将您的应用程序包含为可以访问PowerManager API的系统应用程序。

您提到的问题包括有关所需权限的一些评论。

有关PowerManager.goToSleep()here所需权限的具体问题。

答案 1 :(得分:0)

使用此:

PowerManager pManager=(PowerManager) getContext().getSystemService(Context.POWER_SERVICE);
try {
    pManager.getClass().getMethod("goToSleep", new Class[]{long.class}).invoke(pManager, SystemClock.uptimeMillis());
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}

清单:

成为系统uid:

android:sharedUserId =“ android.uid.system”

添加权限:

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