简体   繁体   English

安全异常请求PARTIAL_WAKE_LOCK

[英]Security Exception requesting PARTIAL_WAKE_LOCK

I wrote a library which starts a STICKY Service when the main application calls a specific method. 我编写了一个库,该库在主应用程序调用特定方法时启动STICKY Service This Service acquires a PowerManager.PARTIAL_WAKE_LOCK during the execution of the onStartCommand() method: 该服务在执行onStartCommand()方法期间获取PowerManager.PARTIAL_WAKE_LOCK

PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE);
if(powerManager != null) {
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, this.getClass().getName());
    wakeLock.acquire();
}

and the main application requires the WAKE_LOCK permission in its AndroidManifest.xml : 并且主应用程序需要在其AndroidManifest.xml中具有WAKE_LOCK权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="it.mcampana.myapp">

<application
    ....>

    <activity android:name=".SplashScreen" android:theme="@style/AppTheme.NoActionBar">
    <intent-filter>
            <action android:name="android.intent.action.MAIN" /
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

some activities...


</application>

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

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

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

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />

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

<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SMS" />

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />

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

<uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions" />

</manifest>

(yes, there are a lot of permissions....but I need them!). (是的,有很多权限。...但是我需要它们!)。

However, with some devices (eg, samsung SM-G950F, or ASUS_Z017D) I receive from ACRA the following exception 但是,对于某些设备(例如,三星SM-G950F或ASUS_Z017D),我从ACRA收到以下异常

java.lang.SecurityException: Neither user 10182 nor current process has android.permission.WAKE_LOCK.

at the exact point where the Service requires the PARTIAL_WAKE_LOCK . 在服务需要PARTIAL_WAKE_LOCK的确切位置。 The strange thing is that with other devices (eg, Xiaomi Mi 5, or Nexus 5) everything works fine. 奇怪的是,使用其他设备(例如小米Mi 5或Nexus 5),一切正常。

**UPDATE: ** I found that this and other problems related to "missing permissions" (also with missing ACCESS_COARSE_LOCATION and READ_CALENDAR) mainly come from Samsung devices. **更新:**我发现与“缺少权限”有关的此问题和其他问题(也缺少ACCESS_COARSE_LOCATION和READ_CALENDAR)主要来自三星设备。 As far as you know, there are some restrictions or additional security policies on Samsung devices? 据您所知,三星设备上有一些限制或其他安全策略吗?

In which API version are you testing? 您正在测试哪个API版本? In API 26 and newer you should ask user for permissions during the runtime 在API 26及更高版本中,您应该在运行时向用户询问权限

ActivityCompat.requestPermissions(getContext(), new String[]{Manifest.permission.WAKE_LOCK},1);

then override onRequestPermissionsResult method to get the user response. 然后重写onRequestPermissionsResult方法以获取用户响应。

check this out 看一下这个

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM