permission.android.MANAGE_USB适用于Jellybean但不适用于Lollipop OS

时间:2017-10-25 13:28:55

标签: java android permissions android-5.1.1-lollipop android-4.1-jelly-bean

我正在开发一个需要此权限的应用程序:android.permission.MANAGE_USB

我知道此权限仅在系统应用程序中提供。

如果我在Android 4.1.2中将应用程序安装为系统应用程序,则应用程序可以正常工作。

但是如果我尝试在android 5.1中安装它作为系统应用程序,那么调试日志打印出我没有权限:

错误:

W/System.err: java.lang.SecurityException: 
Neither user 10074 nor current process has android.permission.MANAGE_USB.

有人知道为什么它一直在Android 5.1中给我这个错误吗?

清单:

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

<uses-permission android:name="android.permission.MANAGE_USB"
    android:protectionLevel="signature" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.GET_TASKS"/>
<permission android:name="android.permission.SET_TIME"
android:protectionLevel="signatureOrSystem"
    />
<uses-feature android:name="android.hardware.usb.host"
    android:required="true"/>


<application
    android:name=".services.AppContext"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:hardwareAccelerated="false"
    android:theme="@style/AppTheme">
    <service android:name=".services.KioskService" android:exported="false"/>
    <activity
        android:name=".MainActivity"
        android:launchMode="singleInstance"
        android:stateNotNeeded="true"
        android:screenOrientation="sensorLandscape">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.HOME" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service
        android:name="com.example.app.services.UsbService"
        android:enabled="true">
    </service>

    <receiver android:name=".services.PowerDisconnectReceiver">
        <intent-filter>
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
        </intent-filter>
    </receiver>

    <receiver android:name=".services.UsbPermissionReceiver">
        <intent-filter>
            <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/>
        </intent-filter>
    </receiver>

</application>

</manifest>

1 个答案:

答案 0 :(得分:4)

我会尝试将android:protectionLevel更改为signatureOrSystem

  

系统仅授予Android系统映像中的应用程序或使用与声明权限的应用程序相同的证书进行签名的权限。请避免使用此选项,因为签名保护级别应该足以满足大多数需求,并且无论应用程序的确切位置如何都可以正常工作。 &#34; signatureOrSystem&#34;权限用于某些特殊情况,其中多个供应商将应用程序内置到系统映像中,并且需要明确共享特定功能,因为它们是一起构建的。

signature

  

仅当请求的应用程序使用与声明该权限的应用程序相同的证书进行签名时,系统才授予的权限。如果证书匹配,系统会自动授予权限,而不会通知用户或要求用户明确批准。

我们了解到,您无法访问编辑您在设备中使用的Android操作系统映像的人使用的签名密钥,因此signature protectionLevel将无法匹配,也无法授予您许可。

请参阅 https://developer.android.com/guide/topics/manifest/permission-element.html

更新:为了完整起见,我将@ carlo.S评论添加到答案中:

  

在Lollipop中,需要将被视为系统应用程序的应用程序安装在{4.2}中的system/priv-app文件夹而非system/app文件夹下!此外,应用程序需要具有644权限。

当然,设备需要扎根。