- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想满足在 Jelly Bean 版本及以下版本以及 Jelly Bean 以上版本上运行的设备。
我的方法应该根据应用程序 ID 获取所有应用程序的应用程序使用情况/流量。请注意这行 rx = Long.parseLong(String.valueOf(id));
在第一个 if 子句上,它适用于运行版本小于或等于 Jelly Bean 的设备。
使用 TrafficStats.getUidTxBytes(uid)
获取基于其 ID 的已安装应用程序的数据使用情况,但在 4.3 中仅返回 0 值,但是,else 子句使用 TrafficStats.getUidTxBytes(uid)
在 5 以上的版本中准确检索每个应用程序的应用程序使用情况。
我特别关注 if 子句,该子句适用于运行低于 5 的 android 版本的设备,例如在本例中为 4.3 (Jelly Bean)
public void recordSnapshot(Context context)
{
TinyDB settings = new TinyDB(context);
int boot_id = settings.getInt(AppPreferences.BOOT_ID);
PackageManager pm = context.getPackageManager();
for (ApplicationInfo app : pm.getInstalledApplications(0))
{
String androidOS = Build.VERSION.RELEASE;
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
long tx = 0;
long rx = 0;
int uid = app.uid;
if(currentapiVersion <= Build.VERSION_CODES.JELLY_BEAN)
{
File dir = new File("/proc/uid_stat/");
String[] children = dir.list();
List<Integer> uids = new ArrayList<Integer>();
for (int i = 0; i < children.length; i++) {
uid = Integer.parseInt(children[i]);
String uidString = String.valueOf(uid);
File uidFileDir = new File("/proc/uid_stat/" + uidString);
File uidActualFile = new File(uidFileDir, "tcp_rcv");
StringBuilder text = new StringBuilder();
try {
BufferedReader br = new BufferedReader(new FileReader(uidActualFile));
String line;
while ((line = br.readLine()) != null) {
Log.d(String.valueOf(uid), line);//this returns the amount of data received for the particular uid
rx = Long.parseLong(String.valueOf(uid));
text.append(line);
text.append('\n');
}
} catch (IOException e) {
//handle this
}
uids.add(id);
}
}
else {
tx = TrafficStats.getUidTxBytes(uid);
rx = TrafficStats.getUidRxBytes(uid);
}
}
整个方法
public void recordSnapshot(Context context)
{
TinyDB settings = new TinyDB(context);
int boot_id = settings.getInt(AppPreferences.BOOT_ID);
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
int networkType = NetworkState.GetNetworkState(context, info, "DataUsageRecorder"); // wifi, data, data roaming
// Get all apps
PackageManager pm = context.getPackageManager();
for (ApplicationInfo app : pm.getInstalledApplications(0))
{
String androidOS = Build.VERSION.RELEASE;
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
long tx = 0;
long rx = 0;
int uid = app.uid;
if(currentapiVersion <= Build.VERSION_CODES.JELLY_BEAN_MR2)
{
File dir = new File("/proc/uid_stat/");
String[] children = dir.list();
List<Integer> uids = new ArrayList<Integer>();
for (int i = 0; i < children.length; i++) {
uid = Integer.parseInt(children[i]);
String uidString = String.valueOf(uid);
File uidFileDir = new File("/proc/uid_stat/" + uidString);
File uidActualFile = new File(uidFileDir, "tcp_rcv");
StringBuilder text = new StringBuilder();
try {
BufferedReader br = new BufferedReader(new FileReader(uidActualFile));
String line;
while ((line = br.readLine()) != null) {
Log.d(String.valueOf(uid), line);//this returns the amount of data received for the particular uid
rx = Long.parseLong(String.valueOf(uid));
//text.append(line);
//text.append('\n');
}
} catch (IOException e) {
//handle this
}
uids.add(uid);
}
}
else
{
tx = TrafficStats.getUidTxBytes(uid);
rx = TrafficStats.getUidRxBytes(uid);
}
if ((tx == 0 || rx == 0))
{
// Skip inactive items
continue;
}
else if (Globals.DEBUG && (tx < DEBUG_5MB && rx < DEBUG_5MB)) {
// Let's skip all the BS for quick testing
continue;
}
// Get package name
String package_name;
try {
CharSequence name = pm.getApplicationLabel(app);
package_name = name != null ? name.toString() : "";
} catch (Exception e) {
e.printStackTrace();
package_name = "";
}
AppUsage totals;
AppUsage appUsage;
// Get current data entry for app
//appUsage = appUsageDao.queryBuilder().where(AppUsageDao.Properties.App_uid.eq(uid), AppUsageDao.Properties.Type.eq(networkType), AppUsageDao.Properties.Boot_id.eq(boot_id)).limit(1).unique();
// Get last recorded totals since device boot
totals = appUsageDao.queryBuilder().where(AppUsageDao.Properties.App_uid.eq(uid), AppUsageDao.Properties.Type.eq(NetworkState.ALL), AppUsageDao.Properties.Boot_id.eq(boot_id)).limit(1).unique();
long tx_diff = tx;
long rx_diff = rx;
if (totals != null)
{
// Get difference, and update
tx_diff -= totals.getTx();
rx_diff -= totals.getRx();
totals.setTx(tx);
totals.setRx(rx);
}
else
{
// add new master
totals = new AppUsage(null, new Date(), uid, package_name, NetworkState.ALL, tx_diff, rx_diff, 0, 0, boot_id);
}
// add new app
appUsage = new AppUsage(null, new Date(), uid, package_name, networkType, tx_diff, rx_diff, 0, 0, boot_id);
/*if (appUsage == null)
{
// Create new
appUsage = new AppUsage(null, new Date(), uid, package_name, networkType, tx, rx, 0, 0, boot_id);
}
else
{
// Update
appUsage.setTx(tx);
appUsage.setRx(rx);
}*/
try {
// master
appUsageDao.insertOrReplace(totals);
} catch (DaoException e) {
e.printStackTrace();
}
try {
appUsageDao.insertOrReplace(appUsage);
} catch (DaoException e) {
e.printStackTrace();
}
//apps.put(app.uid, new DataUsageItem(app.uid, app.packageName, pm.getApplicationLabel(app).toString()));
}
}
最佳答案
尽管文档说流量统计在 4.3 上似乎不能很好地工作,因为在某些情况下它适用于某些应用程序 ID 而不是某些应用程序 ID,因此我会绕过整个流量统计类并创建两个指向的自定义方法包含应用程序使用数据的 native c 文件,用于在同一类中检索 tx(传输数据)和 Rx(接收数据)
long tx = yourClass.getUidTxBytes(uid);
long rx = yourClass.getUidRxBytes(uid);
然后用于 RX
public static Long getUidRxBytes(int uid) {
BufferedReader reader;
Long rxBytes = 0L;
try {
reader = new BufferedReader(new FileReader("/proc/uid_stat/" + uid
+ "/tcp_rcv"));
rxBytes = Long.parseLong(reader.readLine());
reader.close();
}
catch (FileNotFoundException e) {
rxBytes = TrafficStats.getUidRxBytes(uid);
//e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
return rxBytes;
}**
然后为 TX
public static Long getUidTxBytes(int uid) {
BufferedReader reader;
Long txBytes = 0L;
try {
reader = new BufferedReader(new FileReader("/proc/uid_stat/" + uid
+ "/tcp_snd"));
txBytes = Long.parseLong(reader.readLine());
reader.close();
}
catch (FileNotFoundException e) {
txBytes = TrafficStats.getUidTxBytes(uid);
//e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
return txBytes;
}
关于java - 在获取应用程序数据使用时满足运行 Jelly bean 以及 Jelly bean 之后版本的设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37181492/
我想满足在 Jelly Bean 版本及以下版本以及 Jelly Bean 以上版本上运行的设备。 我的方法应该根据应用程序 ID 获取所有应用程序的应用程序使用情况/流量。请注意这行 rx = Lo
我正在使用 Maven 3 开发 Jenkins 插件,看到两个默认的 .jelly 文件:global.jelly 和 config.jelly。两者之间有什么区别,您能举例说明每个文件中的内容吗?
我在hudson中使用email-ext-plugin生成报告,查看$HUDSON_ROOM\plugins\email-ext\WEB-INF\classes\hudson\plugins\emai
我有一个简单的问题。在jenkins中,当为gui制作jelly配置文件时,您可以有一个单选按钮展开并显示更多元素,这也可以通过下拉列表来完成吗?如果是这样,有人有例子吗?我知道如何使用单选按钮来完成
我想打印数组中的元素,使用 foreach 循环给出错误 "元素 j:foreach 的前缀 j 未绑定(bind)" . 下面是我写的代码: Jello World var word
我在我的应用程序中集成了通知,我已经处理了 2 个案例:使用 NotificationCompat.Builder 的 Pre Jelly bean 通知,以及使用生成器发布 Jelly bean 通
我正在尝试在我的通知中实现媒体播放器控件。我需要播放/暂停按钮在“播放”可绘制对象和“暂停”可绘制对象之间动态切换(基本上取决于用户的触摸)。例如,一旦用户触摸“暂停”按钮,它需要更改为“播放”。当用
我尝试创建一个向左动画的按钮,然后再次向右返回到正常状态。动画不适用于此代码: .fortnite-wrapper .btn.btn-display:after { content: ""; disp
是否可以在 Jelly 中动态更新文本框的值? 我有一个下拉框,其选项是根据表单中以前的数据确定的。使用在线可用的文档可以轻松实现这一点(只需使用描述符中的 doFill...Items() 方法)。
我正在尝试在装有 Android 4.2.2 的 Nexus 4 中设置飞行模式。我知道这是不可能的,因为 AIRPLANE_MODE_ON 已移至 Global system settings它只是
以下代码不适用于 Jelly Bean (Android 4.1): final ComponentName cn = new ComponentName("com.android.phone","c
我正在使用WebView以便在我的Android应用中播放YouTube视频。 它工作正常,但我似乎对Jelly Bean存有疑问(也许还不知道更高版本)。 第一次播放视频时,它可以正常播放,但是当我
This widget is no longer supported. Other horizontally scrolling widgets include HorizontalScrollVie
文本框 文本区域 但是 clazz="required" 不适用于 textarea,我是否缺少另一个与 clazz req
我正在为我公司的一些自定义报告创建一个构建后插件。我从此处提供的 Jenkins“hello world”示例开始: https://wiki.jenkins-ci.org/display/JENKI
我正在尝试构建一个Jenkins Post构建插件,我必须在其中处理JSON文件(包含测试结果)并以表格格式显示它执行构建后,Jenkins 中的 code> 。 以下是到目前为止已完成的步骤: 创建
自从我的华硕 Transformer 平板电脑升级到 Jelly Bean 后,我发现应用程序和小部件的卸载有时非常缓慢,需要几分钟而不是几秒钟。这可能是有原因的吗? 我在 Stackoverflow
我正在进行一项 Activity ,我必须向用户显示 Toast 消息。操作系统版本是 Jelly Bean,显示通知已打开。这适用于 Ice Cream Sandwich 。这是代码: Toast.
在最新版本 Jelly Bean 之前,我的 android webview 应用程序从未出现过滚动问题。滚动不再足够流畅,也没有加速。有什么想法吗? 最佳答案 我尝试使用硬件加速,但没有解决这个问题
正在关注 my previous notification problems我想测试 Jelly Bean 4.1 中描述的新通知堆栈功能 here .我已经发现,通知需要有不同的 ID,否则旧通知只
我是一名优秀的程序员,十分优秀!