#java #android #reflection #permissions
#java #Android #отражение #разрешения
Вопрос:
Я хотел использовать 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:
С платформы 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
this означает, что доступ к этому разрешению могут иметь только приложения, подписанные подписью платформы и, следовательно, часть ПЗУ устройства. Вы не можете получить это разрешение от самозаверяющего приложения, использующего SDK.
Комментарии:
1. Нет проблем. Что на самом деле интересно, так это то, что, насколько я знаю, разрешение, которое вам действительно нужно, — это STATUS_BAR, а не STATUS_BAR_SERVICE или EXPAND_STATUS_BAR . STATUS_BAR — это системное разрешение, в котором ваше приложение должно храниться и находиться в /system/app для получения разрешения, поэтому вам все равно не повезло.