我想以编程方式启用/禁用数据连接.我使用了以下代码:
void enableInternet(boolean yes)
{
ConnectivityManager iMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
Method iMthd = null;
try {
iMthd = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", boolean.class);
} catch (Exception e) {
}
iMthd.setAccessible(false);
if(yes)
{
try {
iMthd.invoke(iMgr, true);
Toast.makeText(getApplicationContext(), "Data connection Enabled", Toast.LENGTH_SHORT).show();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
dataButton.setChecked(false);
Toast.makeText(getApplicationContext(), "IllegalArgumentException", Toast.LENGTH_SHORT).show();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
Toast.makeText(getApplicationContext(), "IllegalAccessException", Toast.LENGTH_SHORT).show();
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
dataButton.setChecked(false);
Toast.makeText(getApplicationContext(), "InvocationTargetException", Toast.LENGTH_SHORT).show();
} …Run Code Online (Sandbox Code Playgroud) 我正在ApplicationInfo使用packageManager.getInstalledApplications(0)获取对象列表,并尝试根据它们是否是系统应用程序对它们进行分类.
有一段时间我一直在使用这里描述的技术,但是在我的应用程序中看到之后,一些应用程序不在非系统应用程序列表中(例如Facebook,当可用时要求系统在SD上安装自己)卡).在下次阅读ApplicationInfo.FLAG_SYSTEM的实际文档并了解它实际上没有过滤系统应用程序之后,我现在正在寻找一种新方法.
我的猜测是,系统和非系统应用程序的UID之间存在很大差距,我可以收集这些差异来进行区分,但到目前为止我还没有找到答案.我也查看了其他标志,例如ApplicationInfo.FLAG_EXTERNAL_STORAGE,我支持API 1.5.
有没有人有这个真正的解决方案(不涉及FLAG_SYSTEM)?
在android oreo中,我不能再使用WindowManager.LayoutParams.TYPE_SYSTEM_ERROR了,必须使用WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY.缺点是,此模式不会覆盖状态栏.
反正有没有实现旧的行为,并能够绘制状态栏?我有一个侧边栏应用程序,直到现在,我允许用户在屏幕顶部也有触发区域,现在不再工作,因为状态栏现在重叠在顶部的可触摸区域...
我对任何解决方案感兴趣,即使它仅适用于某些设备,例如root设备......因为我认为这个问题没有正常的解决方案,因为android系统不再允许这样做,如文档中所述(https://developer.android.com/about/versions/oreo/android-8.0-changes.html#o-apps).不过,这并不意味着没有替代解决方案......
permissions android overlay android-windowmanager android-8.0-oreo