Capacitor插件中如何正确使用Context调用UsageStatsManager?
解决Capacitor插件中"cannot find symbol variable context"错误
错误原因分析
你的代码存在三个关键问题:
- 上下文获取方式错误:直接使用未定义的
context变量,Capacitor的Plugin子类需通过父类提供的getContext()方法获取应用上下文。 - 插件方法参数类型错误:
@PluginMethod标注的方法参数必须是Call类型(用于处理JS端的请求与响应),你混淆了参数类型和变量名。 - 序列化问题:
UsageStats对象无法直接存入JSObject返回给JS端,需要提取字段转换为可序列化格式。
修正步骤
- 把
context.getSystemService(...)替换为getContext().getSystemService(...),通过Plugin父类的方法获取上下文。 - 将方法参数类型从
Context改为Call,匹配Capacitor插件方法的规范。 - 遍历
UsageStats列表,提取包名、使用时长等关键字段存入JSObject数组,确保能正常序列化返回。
完整修正代码
package com.echo.capacitor; import com.getcapacitor.Call; import com.getcapacitor.JSObject; import com.getcapacitor.Plugin; import com.getcapacitor.PluginMethod; import com.getcapacitor.annotation.CapacitorPlugin; import android.content.Context; import android.util.Log; import android.app.usage.UsageStats; import android.app.usage.UsageStatsManager; import java.util.Calendar; import java.util.List; @CapacitorPlugin(name = "echo") public class echoPlugin extends Plugin { @PluginMethod public void getStats(Call call) { Log.i("Method: ", "getStats"); // 通过父类方法获取应用上下文 UsageStatsManager usm = (UsageStatsManager) getContext().getSystemService(Context.USAGE_STATS_SERVICE); long now = Calendar.getInstance().getTimeInMillis(); List<UsageStats> stats = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, 0, now); JSObject ret = new JSObject(); // 转换UsageStats为可序列化的对象数组 JSObject[] statsArray = new JSObject[stats.size()]; for (int i = 0; i < stats.size(); i++) { UsageStats usageStat = stats.get(i); JSObject statObj = new JSObject(); statObj.put("packageName", usageStat.getPackageName()); statObj.put("totalTimeInForeground", usageStat.getTotalTimeInForeground()); statObj.put("lastTimeUsed", usageStat.getLastTimeUsed()); statsArray[i] = statObj; } ret.put("myStats", statsArray); call.resolve(ret); } }
额外注意事项
- 需在
AndroidManifest.xml中添加权限:<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />,并且引导用户在系统设置中为应用开启"使用情况访问权限",否则queryUsageStats会返回空列表。 - Java类名建议遵循大驼峰规范,比如将
echoPlugin改为EchoPlugin,符合编码惯例。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

