我的目的是创建一个Kiosk应用程序。我为此检查了许多代码,例如this和this。在他们的帮助下,我实现了导航栏的隐藏。现在,我想阻止用户像Surelock一样将通知栏向下拖动。我已经尝试过诸如here之类的SO帖子中给出的常见答案。但这在带有Android Pie的Redmi Note 5 Pro中不起作用。还有其他方法可以做到这一点吗?
答案 0 :(得分:1)
在此解决方案中,通知栏并未完全被阻止,但在用户打开它后将其关闭。您需要一项服务来检查通知栏是否重复打开。该服务使用反射来获取需要的方法,以在打开通知栏后关闭通知栏,因此我认为它无法在android 9设备上正常工作(只需在7.1.1设备上与compilesdk 28一起正常工作即可)。您需要使用此权限:
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
这是该服务的代码:
public class CollapseService extends Service {
ScheduledExecutorService scheduler;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
MyRunnable runnable = new MyRunnable(this);
scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate
(runnable, 0, 100, TimeUnit.MILLISECONDS);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return Service.START_STICKY;
}
private void collapseNow() {
Object statusBarService = getSystemService("statusbar");
Class<?> statusBarManager = null;
try {
statusBarManager = Class.forName("android.app.StatusBarManager");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Method collapseStatusBar = null;
try {
collapseStatusBar = statusBarManager.getMethod("collapsePanels");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
collapseStatusBar.setAccessible(true);
try {
collapseStatusBar.invoke(statusBarService);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
@Override
public void onDestroy() {
super.onDestroy();
scheduler.shutdown();
}
static class MyRunnable implements Runnable{
CollapseService aService = null;
MyRunnable(CollapseService service){
WeakReference<CollapseService> weakReference = new WeakReference<>(service);
aService = weakReference.get();
}
@Override
public void run(){
if(aService != null) {
aService.collapseNow();
}
}
}
}
弱引用是为了消除发生内存泄漏的可能性。
答案 1 :(得分:0)
如果您的信息亭应用是设备所有者(如您所参考的示例中所述),则可以使用DevicePolicyManager.setStatusBarDisabled()
:
禁用状态栏会阻止通知,快速设置和 其他屏幕叠加层,可以从一次性设备中逃脱。
自Android 6(API 23)起可用,状态栏仍显示(带有时间,wifi级别,蓝牙指示器等),但通知不存在,因此无法展开。