无法启用探头/传感器

时间:2011-10-10 15:33:26

标签: java android android-library

我正在使用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的开发者之一读到这个。

谢谢。

1 个答案:

答案 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)以自定义处理收到的数据。