0

ユーザーの電話でSMSにアクセスするために、 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のメソッドは保護されていると宣言されているため、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の開発者の一人がこれを読んでくれることを願っています。

ありがとうございました。

4

1 に答える 1

0

Funf では、プローブはサービスです。これは、それらを直接インスタンス化することはできず、インテントを使用してシステムで作成する必要があることを意味します。インテントを使用してプローブ サービスからデータを要求する方法の例を次に示します。(以下の例は v0.3.x 以降のものです。)

プローブはステータスとデータの送信に非同期メソッドを使用するため、プローブ情報を受信するには Service または BroadcastReceiver が必要です。

まず、Service を使用してコールバック インテントを作成します。

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)して、受信したデータの処理をカスタマイズすることです。

于 2011-11-20T20:57:37.747 に答える