草庐IT

Android DeviceAdminReceiver : onNetworkLogsAvailable intent never received

coder 2023-12-28 原文

更新

我注意到我实际上收到了 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/

有关Android DeviceAdminReceiver : onNetworkLogsAvailable intent never received的更多相关文章

  1. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环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

  2. java - Java 中的 "caller"和 Ruby 中的 "receiver"一样吗? - 2

    如果我说x.hello()在Java中,对象x正在“调用”它包含的方法。在Ruby中,对象x正在“接收”它包含的方法。这只是表达相同想法的不同术语,还是意识形态上的根本差异?来自Java,我发现Ruby的“接收器”想法非常令人困惑。也许有人可以解释这与Java的关系? 最佳答案 在您的示例中,x不调用hello()。包含该片段的任何对象都是“调用”(即,它是“调用者”)。在Java中,x可以称为接收者;它正在接收对hello()方法的调用。 关于java-Java中的"caller"和R

  3. ruby-on-rails - Rails 设计 : "You need to sign in or sign up before continuing" instead of "You will receive an email with instructions.." - 2

    我已经安装了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唯一的问题是,如果我尝试通过转到注册页面创建一个新帐户,然后在输入我的电子邮

  4. ruby-on-rails - 在 Rails 中获取 "Incomplete response received from application" - 2

    有人可以帮忙吗?我的堆栈是带有nginx/passenger和ruby​​2.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

  5. ruby - 如何 to_enum( :method) receive its block here? - 2

    这段代码来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,

  6. ruby - "k.send :hello"- 如果 k 是 "receiver",谁是发件人? - 2

    在下面的例子中,为什么我们说“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

  7. ruby-on-rails - 如何使用来自 git hook post-receive 的特定 rvm gemset 进行 bundle 安装? - 2

    因此,我正在尝试在不使用capistrano的情况下实现类似heroku的部署。为了检查和安装gems,我尝试使用githook并将以下命令放入/hooks/post-receive:bundlecheck||bundleinstall但是当我运行gitpush时,我得到:remote:hooks/post-receive:line20:bundle:commandnotfound.我知道hook可能会从错误的环境中启动命令,并且我必须以某种方式从hook切换rvm环境。我尝试在接收后使用rvmuse1.8.7@rails3但它没有帮助。有什么想法吗? 最佳

  8. ruby - 如何使用 RSpec should_receive 忽略额外的消息? - 2

    规范:beforedoLogger.should_receive(:write).with'Logmessage1'endit'works'doget'/'endSinatra应用程序:get'/'Logger.write('Logmessage1')Logger.write('Logmessage2')end由于“日志消息2”,此规范失败。如何告诉RSpec忽略任何其他消息,只测试预期的消息? 最佳答案 您需要在消息预期之前对将接收消息的方法进行stub。#RSpecstubmethodisdeprecatedinRSpec3,而

  9. ruby-on-rails - ! [remote rejected] master -> master(pre-receive hook declined) - 2

    这个问题在这里已经有了答案: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

  10. ruby - 在 Ruby 中 "receiver"指的是什么? - 2

    我正在阅读一份文档,该文档讨论了一种具有接收器的方法。什么是接收器? 最佳答案 在Ruby(以及其他受SmallTalk启发的语言)中,对象被认为是发送和接收“消息”。在Ruby中,Object是一切的基类,它有一个send方法:Object.send例如:classKlassdefhello"Hello!"endendk=Klass.newk.send:hello#=>"Hello!"k.hello#=>"Hello!"在这两种情况下,k都是“你好”消息的接收者。 关于ruby-在Ru

随机推荐