Ошибка при использовании StatusBarManagerService - java.lang.SecurityException на android.permission.STATUS_BAR_SERVICE - PullRequest
4 голосов
/ 19 октября 2011

Я хотел использовать StatusBarManagerService, но он не доступен в SDK, поэтому я попытался «обмануть», используя отражение для доступа к нему.

Мне удалось получить к нему доступ, но теперь он выдает ошибку при доступе к одному из его методов:

java.lang.SecurityException: StatusBarManagerService: Neither user 10139 nor current process has android.permission.STATUS_BAR_SERVICE.

Возможно ли получить это разрешение или просто невозможно?

Это мой код:

    try {
        Class serviceManagerClass = Class.forName("android.os.ServiceManager");
        Method getService = serviceManagerClass.getMethod("getService", String.class);
        IBinder retbinder = (IBinder) getService.invoke(serviceManagerClass, "statusbar");
        Class statusBarClass = Class.forName(retbinder.getInterfaceDescriptor());
        Object statusBarObject = statusBarClass.getClasses()[0].getMethod("asInterface", IBinder.class).invoke(null, new Object[] { retbinder });
        Method clearAll = statusBarClass.getMethod("onClearAllNotifications");
        clearAll.setAccessible(true);
        clearAll.invoke(statusBarObject);
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (RemoteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

И вот что я добавил в AndroidManifest:

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

Возможно ли получить это разрешение или просто невозможно?

1 Ответ

8 голосов
/ 27 ноября 2011

с платформы AndroidManifest.xml:

<!-- Allows an application to be the status bar.  Currently used only by SystemUI.apk
@hide -->
<permission android:name="android.permission.STATUS_BAR_SERVICE"
    android:label="@string/permlab_statusBarService"
    android:description="@string/permdesc_statusBarService"
    android:protectionLevel="signature" />

Обратите внимание на атрибут protectionLevel со значением signature. Это означает, что только приложения, подписанные подписью платформы и, следовательно, частью ПЗУ устройства, могут получить доступ к этому разрешению. Вы не можете получить это разрешение от самоподписанного приложения, использующего SDK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...