更新
我注意到我实际上收到了 NETWORK_LOGS_AVAILABLE Intent !问题是,需要很长时间(超过一个小时?)才能收到。
是否有任何已知的方法来增加接收这些事件的频率?
原始问题
我正在尝试处理在 DeviceAdminReceiver 应用程序中收到 onNetworkLogsAvailable Intent 后现在可以读取的 DNS 事件。此功能从 Android 8.0 开始可用。
出于某种原因,我从未收到此 Intent ,即使我已成功调用 setNetworkLoggingEnabled 方法。启用管理员后,我收到了 ACTION_DEVICE_ADMIN_ENABLED 事件,但之后没有其他任何事情。
这是我启用网络日志记录的地方:
public class NetworkAdminReceiver extends DeviceAdminReceiver {
@Override
public void onEnabled(Context context, Intent intent) {
DevicePolicyManager manager =
(DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
if ( manager == null )
{
throw new IllegalStateException("Unable to get DevicePolicyManager");
}
if (manager.isDeviceOwnerApp(context.getPackageName())) {
manager.setNetworkLoggingEnabled(getWho(context), true);
}
else
{
Toast.makeText(context, "This application is not device owner. DNS logging only works" +
" when this application is setup as the Device Owner", Toast.LENGTH_LONG).show();
}
}
// *snip* rest of class
}
虽然我不确定是否需要(无法在文档中找到),但我还在接收者的过滤器中添加了 NETWORK_LOGS_AVAILABLE Intent 操作:
<receiver android:name=".admin.NetworkAdminReceiver"
android:label="@string/device_admin"
android:description="@string/device_admin_description"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<meta-data android:name="android.app.device_admin"
android:resource="@xml/device_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
<action android:name="android.app.action.NETWORK_LOGS_AVAILABLE"/>
</intent-filter>
</receiver>
应用程序被标记为设备所有者,启用了网络日志记录,但我从未收到 Intent 。我能想到的唯一解释是网络日志不经常可用,但我找不到支持该理论的文档。
我目前也只在模拟器中对此进行测试。我不确定这是否会对此产生影响,尽管我看不出它会如何。
为了通过 DeviceAdminReceiver 正确接收网络日志,我是否遗漏了什么?
最佳答案
恐怕没有优雅的解决方案。
这个限制看起来像是故意的。正如您在 sources 中看到的那样,当达到硬编码阈值时触发事件。它是 1200 个事件或 1.5H 超时,以先到者为准。我没能在 NetworkLogger 中找到任何可用的 Hook 。他们绝对不希望用户干涉它。
我看到的唯一选择是使用反射 来访问隐藏的 API。
恕我直言,最直接的方法是获取 IIpConnectivityMetrics 服务的句柄并使用它来订阅网络事件。不过,我自己并没有测试这个解决方案。
关于Android DeviceAdminReceiver : onNetworkLogsAvailable intent never received,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48737766/
一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame
如果我说x.hello()在Java中,对象x正在“调用”它包含的方法。在Ruby中,对象x正在“接收”它包含的方法。这只是表达相同想法的不同术语,还是意识形态上的根本差异?来自Java,我发现Ruby的“接收器”想法非常令人困惑。也许有人可以解释这与Java的关系? 最佳答案 在您的示例中,x不调用hello()。包含该片段的任何对象都是“调用”(即,它是“调用者”)。在Java中,x可以称为接收者;它正在接收对hello()方法的调用。 关于java-Java中的"caller"和R
我已经安装了DeviseonRails4.2.0,一切似乎都在工作,我使用了以下指南:http://sourcey.com/rails-4-omniauth-using-devise-with-twitter-facebook-and-linkedin/我的设计模块是:devise:database_authenticatable,:registerable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:omniauthable唯一的问题是,如果我尝试通过转到注册页面创建一个新帐户,然后在输入我的电子邮
有人可以帮忙吗?我的堆栈是带有nginx/passenger和ruby2.2.2的ubuntu-server14.04。我无法使我的项目投入生产。在开发中一切运行正常。secret.ymlproduction:secret_key_base:secret_token:服务器server{listen80;server_namelogvs.local;passenger_enabledon;passenger_app_envdevelopment;root/var/www/logvs/public;}错误日志App2532stderr:[2015-06-0722:56:01.4724
这段代码来self发现的一个示例,计算数组中等于其索引的元素数。但是怎么办?[4,1,2,0].to_enum(:count).each_with_index{|elem,index|elem==index}我无法仅通过链接来完成,而且链中的求值顺序令人困惑。我的理解是我们正在使用Enumerable#count的重载,如果给定一个block,它会计算产生真值的元素的数量。我看到each_with_index具有判断项目是否等于其索引的逻辑。我不明白的是each_with_index如何成为count的block参数,或者为什么each_with_index像被调用一样工作直接在[4,
在下面的例子中,为什么我们说“k.send:hello”而不是“k.receive:hello”if,asstatedelsewhere,k实际上是接收者?听起来k是发送者而不是接收者。当我们说“k.send:hello”时,谁在发送,如果不是k?(你是不是和我一样一头雾水?)classKlassdefhello"Hello!"endendk=Klass.newk.send:hello#=>"Hello"k.hello#=>"Hello" 最佳答案 在Smalltalk中,一切都是对象。“发送者”是消息来源范围的所有者对象(即“th
因此,我正在尝试在不使用capistrano的情况下实现类似heroku的部署。为了检查和安装gems,我尝试使用githook并将以下命令放入/hooks/post-receive:bundlecheck||bundleinstall但是当我运行gitpush时,我得到:remote:hooks/post-receive:line20:bundle:commandnotfound.我知道hook可能会从错误的环境中启动命令,并且我必须以某种方式从hook切换rvm环境。我尝试在接收后使用rvmuse1.8.7@rails3但它没有帮助。有什么想法吗? 最佳
规范:beforedoLogger.should_receive(:write).with'Logmessage1'endit'works'doget'/'endSinatra应用程序:get'/'Logger.write('Logmessage1')Logger.write('Logmessage2')end由于“日志消息2”,此规范失败。如何告诉RSpec忽略任何其他消息,只测试预期的消息? 最佳答案 您需要在消息预期之前对将接收消息的方法进行stub。#RSpecstubmethodisdeprecatedinRSpec3,而
这个问题在这里已经有了答案:remoterejectedmaster->master(pre-receivehookdeclined)(29个答案)关闭8年前。Tasks:TOP=>assets:precompile(Seefulltracebyrunningtaskwith--trace)!!Precompilingassetsfailed.!!Pushrejected,failedtocompileRubyappTogit@heroku.com:tranquil-crag-9767.git![remoterejected]master->master(pre-receivehook
我正在阅读一份文档,该文档讨论了一种具有接收器的方法。什么是接收器? 最佳答案 在Ruby(以及其他受SmallTalk启发的语言)中,对象被认为是发送和接收“消息”。在Ruby中,Object是一切的基类,它有一个send方法:Object.send例如:classKlassdefhello"Hello!"endendk=Klass.newk.send:hello#=>"Hello!"k.hello#=>"Hello!"在这两种情况下,k都是“你好”消息的接收者。 关于ruby-在Ru