невозможно включить зонд / датчик - PullRequest
0 голосов
/ 10 октября 2011

Я использую фреймворк funf , чтобы получить доступ к SMS на телефоне пользователя.

Каркас состоит из нескольких пакетов. Все предоставленные пробы расширяют абстрактный класс 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 объявлены защищенными, я написал класс 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>

метод enable () в абстрактном классе Probe:

public final void enable() {
        if (!enabled) {
            Log.i(TAG, "Enabling probe: " + getClass().getName());
            enabled = true;
            running = false;
            sendProbeStatus();
            onEnable();
        }
    }

Что я делаю не так? так как мой класс SMSmessage в конечном итоге наследует от Probe, это действительно так, я думал.

Надеюсь, один из разработчиков Funf это прочтет.

Спасибо.

1 Ответ

0 голосов
/ 21 ноября 2011

В 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), чтобы настроить обработку полученных данных.

...