我正在使用funf框架,以便在用户的手机上访问短信。
该框架由几个包组成。提供的探测器都扩展了抽象类Probe。
为了利用框架,我编写了以下类:
package com.senseapp.dieselboris;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class SenseAppV1Activity extends Activity {
private long p;
private String message;
private boolean r;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SMSmessage sp = new SMSmessage();
r = sp.isRunning();
sp.enable();
p = sp.getDefaultPeriod();
message = Boolean.toString(r);
TextView tv = new TextView(this);
tv.setText(message);
setContentView(tv);
}
}
因为类SMSProbe的方法被声明为protected,所以我编写了SMSmessage类:
package com.senseapp.dieselboris;
import edu.mit.media.funf.probe.*;
import edu.mit.media.funf.probe.builtin.*;
import edu.mit.media.funf.probe.builtin.ProbeKeys.AndroidInternal.Sms;
public class SMSmessage extends SMSProbe {
protected String getDataName () {
return super.getDataName();
}
protected long getDefaultPeriod () {
return super.getDefaultPeriod();
}
protected String getDateColumnName () {
return super.getDateColumnName();
}
}
但是当我运行此代码时,它应该打开探针时失败,请参阅此错误:
<small>
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.senseapp.dieselboris/com.senseapp.dieselboris.SenseAppV1Activity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2787)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803)
at android.app.ActivityThread.access$2300(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:144)
at android.app.ActivityThread.main(ActivityThread.java:4937)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.content.ContextWrapper.sendBroadcast(ContextWrapper.java:271)
at edu.mit.media.funf.probe.Probe.sendProbeStatus(Probe.java:280)
at edu.mit.media.funf.probe.Probe.sendProbeStatus(Probe.java:227)
at edu.mit.media.funf.probe.Probe.enable(Probe.java:612)
at com.senseapp.dieselboris.SenseAppV1Activity.onCreate(SenseAppV1Activity.java:20)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751)
</small>
抽象类Probe中的方法enable():
public final void enable() {
if (!enabled) {
Log.i(TAG, "Enabling probe: " + getClass().getName());
enabled = true;
running = false;
sendProbeStatus();
onEnable();
}
}
我做错了什么?因为我的班级SMSmessage最终继承自Probe,所以我认为这是有效的。
我希望Funf的开发者之一读到这个。
谢谢。
答案 0 :(得分:0)
在Funf中,探测器是服务。这意味着它们不能直接实例化,而是必须由系统使用意图创建。以下是如何使用意图从Probe服务请求数据的示例。 (以下示例适用于v0.3.x及更高版本。)
探针使用异步方法发送状态和数据,因此您需要Service或BroadcastReceiver来接收探测信息。
首先使用服务:
创建回调意图Intent callbackIntent = new Intent(this, ExampleProbeDataService.class);
callbackIntent.setAction("CUSTOM_DATA_ACTION");
PendingIntent callback = PendingIntent.getService(getContext(), 0, callbackIntent, PendingIntent.FLAG_UPDATE_CURRENT);
或使用广播:
Intent callbackIntent = new Intent("CUSTOM_BROADCAST_ACTION");
// Restrict broadcast to only my package to prevent broadcasting private user data
callbackIntent.setPackage(getContext().getPackageName());
PendingIntent callback = PendingIntent.getBroadcast(getContext(), 0, callbackIntent, PendingIntent.FLAG_UPDATE_CURRENT);
然后向探测器发出数据请求:
Bundle params = new Bundle();
params.putLong(Parameter.Builtin.PERIOD.name, 10L); // Run every 10 seconds
Intent probeIntent = new Intent(getContext(), probeClass);
probeIntent.setAction(Probe.ACTION_REQUEST);
probeIntent.putExtra(Probe.CALLBACK_KEY, callback);
probeIntent.putExtra(Probe.REQUESTS_KEY, params);
getContext().startService(probeIntent);
探针将根据您提供的参数定期发送数据和状态消息。
虽然在某些情况下需要直接从探针请求数据,但对于大多数情况,它不是推荐的方法。对于测试,我建议使用ProbeTestCase类。它负责处理请求数据和处理响应的细节。对于应用,最简单的方法是扩展ConfiguredPipeline,并覆盖onDataReceived(Bundle data)
以自定义处理收到的数据。